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²CBus 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. Diese Möglichkeit
wird
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 // 7 Bit 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); // Wert vor dem Komma if (lsb == -128) temperatur = temperatur+0.5; // Wert nach dem Komma, (nur 0,5 möglich) } // 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 } |
![]() ![]() |