In folgenden Tutorial-Video zeige ich, wie man mit einem Arduino Uno, einem Temperatursensor TMP36 und einer Sieben-Segment-Anzeige ein digitales Thermometer baut.
Schrittweise schließe ich zuerst den TMP36 Temperatursensor an und nehme ihn in Betrieb, dann das 7-Segment-Display und kombiniere schließlich beide Bauteile in einem Arduino Sketch.
Hier das Video, die verwendeten Arduino Sketches findet ihr weiter unten auf dieser Seite:
- Lieferumfang: 5 Stück
- °F °F bis +257,0 °F, Betrieb bei +302 °F
- Niederspannungsbetrieb (2,7 V bis 5,5 V)
- Stabil mit großen kapazitiven Belastungen
- Geeignet für Automobilanwendungen
Der TMP36 Temperatursensor verfügt über drei Anschlüsse.
Von der flachen Seite aus gesehen befindet sich links das Pin für die Spannungsversorgung mit einer Spannung von 2,7 bis 5,5V. Die 5V vom Arduino können also problemlos verwendet werden. Rechts wird der Sensor an GND angeschlossen und das Pin in der Mitte liefert abhängig von der gemessenen Temperatur eine Spannung zwischen 0V und 2,0V.
Dabei entsprechen 0V einer Temperatur von -50° Celsius, 2,0V einer Temperatur von +150°C. Bei Raumtemperatur arbeitet der Sensor mit einer Genauigkeit von ca. +/- 1°C.
Das mittige Pin kann direkt an einen der Analogeingänge des Arduino angeschlossen werden. Die dort gemessene Spannung läßt sich mit map(wert, 0, 410, -50, 150) in Grad Celsius umrechnen.
Zuerst wird der Temperatursensor angeschlossen und dessen analoger Ausgang mit diesem Sketch in Grad Celsius umgewandelt und am seriellen Monitor angezeigt.
Sketch 1: Testsketch für Temperatursensor TMP36
void setup()
{
Serial.begin(9600);
}
void loop()
{
int tempValue = analogRead(A0);
int temperatur = map(tempValue, 0, 410, -50, 150);
Serial.println(temperatur);
delay(500);
}
Vor der Verkabelung der 4-stelligen 7-Segment-Anzeige wird der Sketch testWholeDisplay auf den Arduino gespielt. Diesen Sketch findet ihr in den Beispielen der SevSeg Library. Die Library lässt sich über den Library Manager der Arduino IDE installieren.
Die Belegung der 12 Pins des Displays ist wie folgt. Die Pins 1-4 entsprechen der Stelle, die angesteuert wird. Die Pins a-g, p den Segementen einer einzelnen Stelle und dem Dezimalpunkt.
Es sind also 12 Pins am Arduino erforderlich. Entsprechend den Arrays digitPins und segmentPins im Sketch verwenden wir die Digitalpins 2 bis 5 für die Stellen 1-4 und die Pins 6 bis 13 für die 7 Segmente und den Dezimalpunkt.
Sobald das Display richtig verkabelt ist, können Sensor und Anzeige mit diesem Sketch gemeinsam verwendet werden.
Sketch 2: Ausgabe der Temperatur auf dem Display
#include "SevSeg.h" // SevSeg Library für das Display einbinden
SevSeg sevseg; // Ein 7-Segment-Display Objekt initialisieren
int sensorPin = A0; // Der Sensor soll am analogen Pin A0 angeschlossen werden
int sensorValue;
int temperature = 0;
int wait=1000; // So viele Millisekunden wird zwischen zwei Messungen gewartet
unsigned long startTime= 0; // Zeit in Millisekunden seit dem Start des Arduino
void setup()
{
byte numDigits = 4; // Hier wird die Anzahl der Segmente am Display
byte digitPins[] = {2, 3, 4, 5}; // Die Pins fuer die Stellen
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; // Die Pins fuer die Segmente
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins); // Display initialisieren
sevseg.setBrightness(10); // Eher Update-Frequenz als Helligkeit
}
void loop()
{
// Die 7-Segment-Anzeige mit SevSeg funktioniert nicht mit blockierenden Befehlen
// wie z.B. delay(), der den Arduino für eine ganze Sekunden anhält.
// Wir nehmen stattdessen eine nicht-blockierende Variante.
// Hier schauen wir bei jedem Durchlauf von loop(), ob die neue Zeit (in ms seit dem Arduino-Start)
// größer als die zuletzt gemessene Zeit + 1000ms ist.
// Wenn ja, dann machen wir eine neue Messung und setzen das Display auf den neuen Wert
if(millis() > (startTime + wait)){
startTime = millis(); // Neue Startzeit merken
sensorValue = analogRead(sensorPin); // Sensorwert auslesen
temperature = map(sensorValue, 0, 410, -50, 150); // Sensorwert in Temperatur umrechnen
sevseg.setNumber(temperature); // Wert ans Display schicken
}
// Wenn nein, dann wird nur das Display refreshed
sevseg.refreshDisplay();
// Ergebnis: Die Funktion loop() wird ohne Pause ganz oft durchlaufen, dadurch wird das Display oft refreshed
// und nichts flackert. Die Messung selbst wird aber nur alle 1000ms im if() durchgeführt.
}
Die Anzeige einer „Null“ in der ersten Sekunde kann man vermeiden, in dem man bereits in setup() das erste Mal eine Temperatur ermittelt und an das Display schickt. Damit ich identischen Code nicht doppelt einbauen müssen, lagere ich 3 Zeilen in die Funktion updateTemperature() aus.
Sketch 3: Verbesserte Version mit updateTemperature()-Funktion
#include "SevSeg.h" //Die vorher hinzugefügte Library laden
SevSeg sevseg; //Ein sieben Segment Objekt initialisieren
int sensorPin = A0; //Der Sensor soll am analogen Pin A0 angeschlossen werden. Wir nennen den Pin ab jetzt "TMP36"
int sensorValue;
int temperature = 0; //Unter der Variablen "temperatur" wird später der Temperaturwert abgespeichert.
int wait=1000; // So viele Millisekunden wird zwischen zwei Messungen gewartet
unsigned long startTime= 0; // Hier merken wir uns nach jedemr Messung die Zeit in Millisekunden (seit dem Start des Arduino)
void setup()
{
byte numDigits = 4; //Hier wird die Anzahl der Ziffern angegeben
byte digitPins[] = {2, 3, 4, 5}; //Die Pins zu den Ziffern werden festgelegt
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; //Die Pins zu den //Segmenten werden festgelegt
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(10);
updateTemperature();
}
void loop()
{
// Die 7-Segment-Anzeige mit SevSeg funktioniert nicht mit blockierenden Befehlen wie z.B. delay(), der den Arduino
// für eine ganze Sekunden anhält. Wir nehmen stattdessen eine nicht-blockierende Variante.
// Hier schauen wir bei jedem Durchlauf von loop(), ob die neue Zeit (in ms seit dem Arduino Start) größer als
// die zuletzt gemessene Zeit + 1000ms ist.
// Wenn ja, dann machen wir eine neue Messung und setzen das Display auf den neuen Wert
if(millis() > (startTime + wait)){
startTime = millis();
updateTemperature();
}
// Wenn nein, dann wird nur das Display refreshed
sevseg.refreshDisplay();
// Ergebnis: Die Funktin loop() wird ohne Pause ganz oft durchlaufen, dadurch wird das Display oft refreshed
// und nichts flackert. Die Messung selbst wird aber nur alle 1000ms im if() durchgeführt.
}
void updateTemperature() {
sensorValue = analogRead(sensorPin); //Auslesen des Sensorwertes.
temperature = map(sensorValue, 0, 410, -50, 150); //Umwandeln des Sensorwertes mit Hilfe des "map" Befehls.
sevseg.setNumber(temperature);
}
Bezugsquellen:
- Temperatursensor TMP36 bei Amazon
- Eine 4-stellige Sieben-Segment-Anzeige gibt es bei Amazon z.B. im Elegoo Starter Kit
- Original Arduino Uno R3 bei Amazon
Pingback: Arduino - eigene Technikprojekte einfach umsetzen -
Vielen Dank für deinen Beitrag :)
Mithilfe des Videos und der nützlichen Informationen, konntest du mir wirklich sehr gut weiterhelfen. Denn vorher hatte ich einige Schwierigkeiten mit der Belegung der 12 Pins, was sich nun aber geklärt hat.
Gruß
Ferdinant
Guten Tag,
sehr interessanter Beitrag. Vielen Dank!
Viele Grüße
Christoph
Hallo Zusammen
Gibt es den Sensor auch in wasserfeste Hülle? Habe was im Netz gefunden, bin mir aber nicht sicher, ob es der Richtige ist. Wenn ja, bitte einen Link senden. Bevorzug bei Amazon.
Danke
Lieber Gruss
Albin
PS: Super Video *****
In der wasserdichten Variante kenne ich auch nur den üblichen DS18B20, der in abgedichteter Form mit dem längeren Kabel angeboten wird. Aber den hast du sicher selbst auch schon gefunden. In Industriequalität gibt es sicher noch viel mehr, da fehlen mir aber die Bezugsquellen.
Danke für das rasche Feedback.
LG
Albin
Hallo
gibt es eine genauen Belegungsplan für alle Kabel?
guten abend.
bei mir gibt es schon probleme beim serial monitor.
der zeight mir ständig einen wert von 50 an. ab und zu geht der runter bis 15, steigt aber dann wieder bis 50. woran kann das liegen?
vielen dank
Hi, super Video!
Muss ich irgendwas beachten wenn ich alles mit einem Arduino Nano betreiben möchte? Mit der Verkabelung und dem Code zeigt der mir ganz wirre Sachen an.
Grüße
Hallo zusammen. Ich habe versucht es nachzubauen, habe auch auf gemeinsame Kathode oder Anode getestet und stehe nun vor dem Problem, dass es nicht geht. Egal ob ich am Ende dem sevseg.setNumber die temperaturevariable übergebe oder einfach nur eine Zahl wie in sevseg.setNumber(12,2); Es funktioniert nicht. Anschlüße scheinen richtig zu sein, sonst hätte ich schon beim Testsketch Fehler bemerkt. Ich weiß ehrlich gesagt gerade nicht mehr weiter.