![]()
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]);
}