Arduino NANO:    Temperatur-Sensor LM75
 

 
Schaltungsdiagramm für den LM75 am I2C-Bus des NANO-Boards
 
Der Ausgang OS des Sensors wurde nicht benutzt. Statt seiner werden im Prgramm unten, für Schaltungen bei Maximal- bzw. Minimal-Temperaturen, Ausgänge des Arduino NANO benutzt (siehe dort den Einschub Test).
 
Der Sensor LM75 mißt die Temperatur in Schritten von 0.5°C.. Seine Genauigkeit liegr bei Temperaturen zwischen -25°C und +100°C bei +/- 2%.
Datenblatt des LM75
 

Programm für den Temperatursensor LM 75
/*
   Temperatursensor LM75
   ==================
   Anschluß eines Temperatursensors LM75 am I²C—Bus des Arduino NANO
   Beim Arduino NANO befindet sich SDA (serial Data) am Pin A4 und SCL (serial Clock) an Pin A5,
   Um den I2C-Bus zu betreiben, muß die Bibliothek Wire.h eingebunden werden.

   Der LM75 besitzt drei Adresspins A0, A1, A2, an denen eine Basisadresse für ihn eingestellt werden kann.
   Es sind dies die Adressen .. 0x48 bis 0x4F. Hier wird die Adresse 0x48 = 79 verwendet.
   Zudem besitzt er einen Ausgang OS, mit dem externe Geräte beim Über- bzw Unterschreiten von Temperaturen,
   die in MINtemp und MAXtemp angegeben sind, geschaltet werden können. (Hier nicht benutzt. Anstelle dieses
   Ausgangs werden Tore des NANO angesteuert.)
  
   Die Textausgaben des Programms können auf dem Ausgabefenster der Entwicklungsumgebung angesehen werden.
*/

#include <Wire.h>                                                  // Einbinden der Wire-Bibliothek des Arduino
#define I2CadrLM75 0x48                                        // Basisadresse des LM75, A0=A1=A2=GND

// interne Registeradressen des LM75
#define adrTEMP 0                                                  // Adresse Temperaturregister
#define adrKONF 1                                                  // Adresse Konfigurationsregister

/*
   Wirkung der Bits im Konfigurationsregister (adrKONF = 1)
   ------------------------------------------------------------------------------------
   Bit 0: Stromsparmodus: 1 Temperatursensor Stromsparmodus (keine Messung, aber aktive Steuerung)
                                          Ausgang OS wird auch abgeschaltet
                                       0 Temperatursensor aktiv (Messungen) Ausgang OS wird wieder freigegeben.
   Bit 1: Interrupt Modus:    1 Ausgang OS schaltet bei oberem als auch unterem Schwellwert ein, wird zurückgesetzt
                                          durch Auslesen des Registers
                                       0 Ausgang OS schaltet bei oberem Schaltpunkt ein und bei unterem aus (default 80°C / 75°C)
   Bit 2:                            1 Ausgang OS arbeitet invertiert (ist eingeschalten innerhalb der Schwellwerte)
                                       0 Ausgang OS schaltet bei Überschreiten der eingestellten Schwellwerte
   Bits 3 und 4:                 mögliche Werte 0-3, Der Wert besagt, wieviele Messzyklen abgewartet werden soll,
                                       bis Ausgang OS aktiv/inaktiv wird, wenn die eingestellte Bedingung erfüllt ist
                                        (verhindert Flattern des Ausgangs)
   Bits 5 bis 7:                    müssen 0 sein
*/

byte valKonfig = B00000000;                        // binäre Setzung des Konfigurationsregisters
double tempMIN = 16;                                 // Minimal-Temperatur, Beim Unterschreiten wird ein Torbit des NANO gesetzt
double tempMAX = 25;                                // Maximal-Temperatur. Beim Überschreiten wird ein Torbit des NANO gesetzt

double temperatur;                                      // zurückgegebene Temperatur als double
char dataString[7];                                      // zurückgegebene Temperatur als formatierter String

void setup() {
   pinMode (13, OUTPUT);                            // digitale Ausgänge für den Test ..
   pinMode (14, OUTPUT);                            // .. schalten wenn tempMIN /tempMAX erreicht
   Wire.begin ();                                           // Initialisierung der Wire-Bibliothek
   Serial.begin (9600);                                  // serielle Übertragungsrate 9600 Baud
   set_LM75_config ();                                  // LM75 Konfigurationsregister setzen
   delay (1000);
}

void loop() {
   read_LM75_temperatur ();                          // aktuelle Temperatur aus Register adrTEMP lesen
                                                                  // Formatierung einer Fließkommazahl zum String (standard avr-libc function)
                          // dtostrf(double-Variable, minStringLänge mit DezimalPunkt, Zahl der Nachkommastellen, Ablagebuffer)
   dtostrf (temperatur, 4, 1, dataString);
   Serial.print ("Gemessene Temperatur: ");    // Ausgabe der gemessenen Temperatur
   Serial.print (dataString);                             // .. im Format xxx.x
   Serial.println ("°C");
 
                                               // Test: wenn die gemessene Temperatur größer wird als für tempMAX angegeben,
                                               // schaltet sich am NANO die LED 13 ein .. Unterhalb des Wertes wieder aus.
                                               if (temperatur >= tempMAX) digitalWrite(13, HIGH);
                                               else digitalWrite(13, LOW);
                                               // wie oben bei tempMIN, nun an Tor 14
                                               if (temperatur <= tempMIN) digitalWrite(14, HIGH);
                                               else digitalWrite(14, LOW);
   delay (5000);
}


   // LM75 aktuellen Temperaturwert lesen
   // ------------------------------------------------------
void read_LM75_temperatur() {
   int8_t msb;                                                         // int8_t: Werte -128 bis +127
   int8_t lsb;
 
   Wire.beginTransmission (I2CadrLM75);                  // Start der Übertragung zu einem Slave
   Wire.write (adrTEMP);                                          // angefragte interne Adresse
   Wire.endTransmission ();                                      // Ende der Übertragung zu einem Slave
 
   Wire.beginTransmission (I2CadrLM75);
   Wire.requestFrom (I2CadrLM75, 2);                       // Master will 2 Bytes Daten vom Slave haben
   if (Wire.available ()) {                                             // .. wenn die Daten verfügbar sind
      msb = Wire.read ();                                           // .. diese lesen
      lsb = Wire.read ();
   }
   Wire.endTransmission();
 
   temperatur = double(msb);                                     // gelesene Daten verarbeiten
   if (lsb == -128) temperatur = temperatur+0.5;
}

// LM75 Konfigurationsregister setzen
// ---------------------------------------------------
void set_LM75_config() {
   Wire.beginTransmission (I2CadrLM75);                     // Start der Übertragung zu einem Slave
   Wire.write (adrKONF);                                             // Adresse Konfigurationsregister senden
   Wire.write (valKonfig);                                              // Wert in das Register schreiben
   Wire.endTransmission ();                                         // Ende der Übertragung zu einem Slave
}