Dieses Blog durchsuchen

Feuchtesensor am Arduino

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 anschliessen, 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]);  
 }