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:

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:

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.