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:

Bestseller Nr. 1
BOJACK TMP36 Temperatursensoren 3-polig TMP36GZ Hochpräziser Celsius Temperatursensor (5 Stück)
  • BOJACK Hochpräziser Celsius Temperatursensor
  • Betriebsspannung: 2,7 V – 5,5 V
  • Bemessungstemperaturbereich: -40°C bis +125°C
  • Genauigkeit: ± 2 °C
  • Skalenfaktor: 10 mV/8 °C

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.

TMP36 Temperatursensor mit Pinbelegung

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.Pinbelegung 7-Segment-Anzeige

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:

10 thoughts on “Arduino Thermometer mit TMP36 Temperatursensor und 7-Segment-Display

  • Pingback: Arduino - eigene Technikprojekte einfach umsetzen -

  • 8. Juli 2019 at 8:07
    Permalink

    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

    Reply
  • 6. Oktober 2020 at 21:38
    Permalink

    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 *****

    Reply
    • 7. Oktober 2020 at 9:20
      Permalink

      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.

      Reply
  • 9. Oktober 2020 at 7:31
    Permalink

    Danke für das rasche Feedback.
    LG
    Albin

    Reply
  • 27. November 2020 at 17:17
    Permalink

    Hallo

    gibt es eine genauen Belegungsplan für alle Kabel?

    Reply
  • 26. Dezember 2020 at 0:50
    Permalink

    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

    Reply
  • 24. Oktober 2021 at 23:16
    Permalink

    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

    Reply
  • 12. November 2021 at 18:22
    Permalink

    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.

    Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.