In den letzten Blog-Einträgen habe ich mit Hilfe des Arduino Uno – Experimentierboards auf unterschiedliche Weise einen NTC-Widerstand zur Messung der Temperatur eingesetzt. Aus einem anderen Projekt habe ich auch noch einen Feuchte/Temperatursensor der Firma IST (Innovative Sensor Technologie) zur Verfügung, der mit einem Raspberry und in Python ausgelesen wurde. Es handelt sich um den digitalen Sensor HYT939, der über den I²C Bus ausgelesen wird. Er zeichnet sich laut Datenblatt mit folgenden Merkmalen aus:
- chemisch sehr resistent
- sehr weiter Temperatur- und Feuchtigkeitsmessbereich (-40°C .. +125°C, 0% ..100% RH)
- mechanisch robuste Bauform
- kalibriert und temperaturkompensiert
- sehr geringer Drift
- einsetzbar bis zu einem Umgebungsdruck von 16bar
- Versorgungsspannung von 2.7 bis 5.5V
- Auflösung von +/- 0.02% RH und 0.015°C
- Genauigkeit von +/- 1.8% RH bei +23°C und +/-0.2K
Also wollte ich diesen Sensor auch mit dem Arduino betreiben und vielleicht in weiterer Folge auch den NTC parallel auslesen und die Ergebnisse vergleichen. Aber zurerst einmal wird der HYT an den Arduino angeschlossen.
Das Bild zeigt das Pinout des HYT in der Ansicht von unten. Die Belegung der Pins lautet:
- 1…SCL
- 2…VCC
- 3…GND
- 4…SDA
Somit lässt sich der Sensorchip ganz einfach an den Arduino anschließen, wobei die Pins SDA auf den Arduino Pin A4 und SCL auf den Pin A5 gelegt sind. Die Ausgabe der ausgelesenen Werte soll wieder wie beim NTC auf dem LC-Display stattfinden. Nachstehend ist der Code gelistet:
/* HYT939 bei Arduino UNO an: SDA pin A4 SCL pin A5 HYT939 bei MEGA2560 an: SDA pin 20 SCL pin 21 LCDisplay Pinzuordnungen allgemein für LCD RS to digital 12 EN to digital 11 D4 to digital 5 D5 to digital 4 D6 to digital 3 D7 to digital 2 R/W to ground VSS to ground */ //I2C Addresse festlegen #define ADDR 0x28 //Variablen und Datentypen festlegen double temp; double hum; unsigned int tempraw; unsigned int humraw; int x; unsigned char buffer[4]; //Libraries laden #include <Wire.h> #include <LiquidCrystal.h> // interfacepins initialisieren LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { //I2C und LCD Interface initialisieren, Wire.begin(); lcd.begin(20, 4); Serial.begin(9600); lcd.println("HYT939-Sensor"); } void loop() { //I2C auselesen Wire.beginTransmission(ADDR); Wire.endTransmission(); delay(200); //4 Bytes auslesen Wire.requestFrom(ADDR, 4,true); x=0; while(Wire.available()) { char c = Wire.read(); buffer[x]=c; x++; } //Rohdaten aus Puffer lesen tempraw=buffer[2]*256+buffer[3]; humraw=buffer[0]*256+buffer[1]; //Daten laut Datenblatt maskieren tempraw&=0xfffc; humraw&=0x3fff; tempraw=tempraw/4; //Rohdaten in Ausgabeformat umrechnen temp=(double)tempraw/99.2909; //skalieren laut datasheet temp=temp-40.0; hum=(double)humraw/163.83; //Daten auf LCD schreiben lcd.setCursor(0, 2); lcd.print("Temperatur ="); lcd.setCursor(11, 2); lcd.print(temp); lcd.setCursor(0, 3); lcd.print("Humidity ="); lcd.setCursor(14, 3); lcd.print(hum); //lcd.setCursor(0, 2); //lcd.print('Buffer0 ='); //lcd.setCursor(11, 2); //lcd.print(buffer[2]); //lcd.setCursor(0, 3); //lcd.print('Buffer1 ='); //lcd.setCursor(11, 3); //lcd.print(buffer[3]); }