// Anschluß eines I²C-Temperatursensor mit LM75 von Horter & Kalb an Arduino // Bei den meisten Arduinos befindet sich der SDA (data line) an Analog Bin 4 und SCL (Clock line) an Analog Bin 5, // bei Arduino Mega SDA an digital Pin 20 und SCL an digital Pin 21 // I2C wird über die Wire Library abgewickelt. Der angegebene Code ist für die Version 1.0 des Arduino Compilers (nächste nach 23) // In dieser Version wurde durch Vererbung von Streams.h die Funktion Wire.send durch die Funktion Wire.write ersetzt. // Darauf ist zu achten, wenn man in einer älteren Version compiliert. // Es wurden alle Funktionen eingebaut und als Beispiel angeführt. // Liest man nur die Temperatur aus, so kann auf den Großteil verzichtet werden. #include #define SensorAdresse 0x48 // Basisadresse für ersten Temperatursensor // Registerparameter fuer get_LM75_temperature #define TEMP 0 // Temperaturregister anwählen #define UNTEN 2 // Register für den unteren Schaltwert anwählen #define OBEN 3 // Register für den oberen Schaltwert anwählen // LM75 Configuration Register Registeradresse: 1 // Bit 0: Stromsparmodus, bei 1 geht Temperatursensor in den Stromsparmodus (keine Messung, aber aktive Steuerung) Ausgang wird auch abgeschaltet // bei 0 geht Temperatursensor aus dem Stromsparmodus (Messung) Ausgang wird wieder freigegeben // Bit 1: Interrupt Modus, bei 1 schaltet der Ausgang sowohl bei oberen als auch unteren Schwellwert ein, wird zurückgesetzt durch Auslesen des Registers // bei 0 schaltet der Ausgang bei oberen Schaltpunkt ein und bei unteren aus (default 80°C / 75°C) // Bit 2: OS-Pin bei 1 wird das Verhalten des Ausgangs invertiert, Ausgang ist eingeschalten innerhalb der Schwellwerte // bei 0 Ausgang schaltet bei Überschreiten der eingestellten Schwellwerte // Bit 3 und 4: Wert 0-3, besagt wieviele Messzyklen abgewartet wird, bis Ausgang aktiv/inaktiv wird, wenn die Bedingung erfüllt ist (verhindert Flattern des Ausgangs) // Bit 5-7 müssen 0 sein // Byte: 7 6 5 4 3 2 1 0 char dataString[7]; // gelesene Temperatur als String aufbereitet: (-xx)x.x double temp; // gelesene Temperatur als double void setup() { Wire.begin(); Serial.begin(9600); delay(1000); } void loop() { // Temperatur aus LM75 auslesen temp = get_LM75_temperature(0, TEMP); //(Device)Wert vom 1. Temperatursensor lesen (0-7, je nach Jumperstellung am Board, 2. Parameter wie oben definiert) dtostrf(temp, 4, 1, dataString); //dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf); (standard avr-libc function) Serial.print("Gemessene Temperatur: "); Serial.println(dataString); // LM75 Konfigurationsregister auslesen: Device Serial.print("Konfigurations-Register: "); Serial.println(get_LM75_config(0), HEX); // LM75 Konfigurationsregister setzen: Device, Wert siehe oben set_LM75_config(0, 0); // LM75 Schaltwerte setzen: Device, Register, Wert als double set_LM75_schaltwert(0, UNTEN, 26); set_LM75_schaltwert(0, OBEN, 28.5); // LM75 Schaltwerte auslesen: Device, Register temp = get_LM75_temperature(0, UNTEN); Serial.print("UNTEN: "); Serial.println(temp, 1); temp = get_LM75_temperature(0, OBEN); Serial.print("OBEN: "); Serial.println(temp,1); delay(5000); } // LM75 Temperatur auslesen. Device = 0-7, regx = TEMP, OBEN, UNTEN (Registerauswahl) double get_LM75_temperature(int device, int regx) { int8_t msb; int8_t lsb; int8_t msb1; Wire.beginTransmission(SensorAdresse + device); Wire.write(regx); Wire.endTransmission(); Wire.beginTransmission(SensorAdresse + device); Wire.requestFrom(SensorAdresse + device, 2); if (Wire.available()) { msb1 = Wire.read(); msb = msb1 << 1; // Vorzeichenbit entfernen, verbliebener Wert ist nun doppelt so groß lsb = Wire.read(); } // höchstes bit von lsb sagt aus, ob 0,5 Grad dazu addiert werden sollen lsb = (lsb & 0x80 ) >> 7; // nun ist lsb = 0 oder 1 Wire.endTransmission(); if (msb1 < 0x80) { // Positiver Wert? return double(msb + lsb)/2; // positiver Wert } else { return double(msb + lsb)/2 - 128; // negativer Wert } } // LM75 Konfigurationsregister setzen, Werte wie oben definiert void set_LM75_config(int device, byte value) { Wire.beginTransmission(SensorAdresse + device); Wire.write(1); // Select Konfigurationsregister Wire.write(value); Wire.endTransmission(); } // LM75 Konfigurationsregister auslesen, device = 0-7 byte get_LM75_config(int device) { byte reg; Wire.beginTransmission(SensorAdresse + device); Wire.write(1); // Select Konfigurationsregister Wire.endTransmission(); Wire.requestFrom(SensorAdresse + device, 1); if (Wire.available()) { reg = Wire.read(); } Wire.endTransmission(); return reg; } // LM75 Schaltwerte setzen, device = 0-7, regx = Wert, Grad als double void set_LM75_schaltwert(int device, byte regx, double grad) { int8_t msb; int8_t lsb = 0; uint8_t y = 0; boolean neg = false; if (grad < 0) { msb = abs(int(grad))+128; } else { msb = abs(int(grad)); } if (grad - abs(int(grad)) > 0) { lsb = 0x80; } Wire.beginTransmission(SensorAdresse + device); Wire.write(regx); // Selektiere oberes oder unteres Register Wire.write(msb); Wire.write(lsb); Wire.endTransmission(); }