Arduino-Projekt: DS18B20-Thermometer

Fortgeschritten
35 Min
41,64 €

In diesem Projekt lernen Sie, wie Sie mit einem Arduino ein Thermometer herstellen. Die gemessenen Temperaturen werden auf einem Sieben-Segment-Bildschirm angezeigt. Als Sensor verwenden wir einen DS18B20 Temperatursensor. Für die Siebensegmentanzeige verwenden wir eine 2-stellige 7-Segment-LED rot.

Temperatursensor DS18B20

Der DS18B20 ist ein digitaler Temperatursensor. Die Kommunikation mit einem Arduino erfolgt problemlos über einen Datenpin. Der linke Pin des Sensors muss mit GND (-) verbunden werden. Der mittlere Pin ist mit einem analogen Datenpin verbunden und der rechte mit VCC (5 V). Der DS18B20 ist in einer wasserdichten und einer ungeschützten Version erhältlich. Die wasserdichte Variante wird häufig in Flüssigkeiten oder feuchten Bereichen eingesetzt. Zur Messung der Außentemperatur wird häufig der „nackte“ Fühler verwendet.
Der DS18B20 kann Temperaturen zwischen -55 und 125 Grad Celsius messen. Mit einer Genauigkeit von 0,5 zwischen -10 und 85. Es wird nicht empfohlen, den Sensor Temperaturen über 100 Grad Celsius auszusetzen. Zur Nutzung dieses Sensors werden grundsätzlich nur der GND und der Datenpin benötigt. Allerdings sind die Werte dann so gering, dass sie nicht ausgelesen werden können. Um die Werte zu erhöhen, muss ein „Step-Up“-Widerstand verwendet werden. Bei diesem Sensor handelt es sich dabei um einen 4,7K Ohm Widerstand, der zwischen VCC und Datenanschluss geschaltet ist.

2-stellige 7-Segment-LED rot

Eine 7-Segment-Anzeige gibt es in vielen verschiedenen Formen und Größen. Für dieses Projekt verwenden wir eines mit 2 Ziffern und 18 Anschlusspins. Die Anordnung der Pins ist im Bild unten dargestellt. In diesem Projekt verwenden wir die DP-Verbindungen nicht. Wie Sie im Bild unten sehen können, hat jede „Zeile“ ihren eigenen Buchstaben. Bei diesem Projekt ist kein Raum für persönliches Engagement beim Anschluss des Displays vorhanden. Wenn die Reihenfolge nicht übereinstimmt, funktioniert die Kodierung nicht richtig.

Das Display kann nach längerem Gebrauch recht warm werden. Unter 80 Grad Celsius ist dies unbedenklich.

Bau und Verkabelung

Nachdem Sie nun alle Teile haben, können Sie mit dem Verbinden der Komponenten beginnen. Unten sehen Sie eine Zeichnung, wie Sie die Komponenten mit dem Steckbrett und dem Arduino verbinden. Bitte achten Sie darauf, dass Sie den DS18B20 richtig anschließen, bei falscher Anschlussrichtung kann der Sensor kaputt gehen. Der Sensor hat eine flache und eine konvexe Seite. Die flache Seite ist die Vorderseite. Der Masse-Pin befindet sich dann auf der linken Seite.

Programmierung

Die meisten Codezeilen sind der 7-Segment-Anzeige gewidmet. Dies erfordert viel Codierung, da es dafür keine einfache Bibliothek gibt. Darüber hinaus besteht die Kodierung aus einigen Standardzeilen und dem Auslesen des Sensors.

Zu Beginn stellen wir sicher, dass alles richtig eingerichtet ist. Sie müssen die Bibliotheken für den Sensor hinzufügen. Geben Sie dann an, auf welchem Pin die Daten empfangen werden. Anschließend geben Sie diese Daten in die Bibliotheken ein. Kommen wir nun zum Teil der 7-Segment-Anzeige. Wir erstellen ein Array. In diesem Array müssen wir angeben, wie viele Ziffern wir hinzufügen möchten, in diesem Fall 10 (0-90). Außerdem müssen wir angeben, wie viele Werte es pro Ziffer gibt. Anschließend geben Sie die Daten pro Ziffer an, dies tun Sie mittels HIGH oder LOW. Die 7 Werte, die Sie angeben, stellen die 7 Segmente auf dem Display dar (a, b, c, d, e, f, g). Wenn ein Segment auf HIGH eingestellt ist, leuchtet dieses Segment auf.

Wenn Sie dies alles getan haben, müssen wir noch sicherstellen, dass wir die Zahlen separat steuern können. Dies erreichen wir durch die Schaffung eines dritten und vierten Hohlraums. Wir müssen diese Lücken gleich zu Beginn benennen. Nachdem nun alle Vorbereitungen abgeschlossen sind, fahren wir mit der Einrichtung fort. Hier starten wir den Sensor und die serielle Kommunikation. Als nächstes geben wir an, welche Pins Eingänge und welche Ausgänge sind, wobei die Pins 14 und 15 die analogen Pins A0 und A1 sind.

Als nächstes können wir mit der Hauptcodierung beginnen. Zunächst fragen wir den Sensor nach den von ihm gemessenen Werten. Anschließend fügen wir diese Werte einer Variable hinzu. Dieser Wert ist eine Zahl mit zwei Dezimalstellen. Dies ist ein Problem, da wir nur zwei Ziffern anzeigen können. Für die erste Ziffer (D1) müssen wir den Wert durch 10 teilen und dann die erste Ziffer vor dem Dezimalpunkt nehmen. Für die zweite Ziffer (D2) verwenden wir den normalen Wert und nehmen die erste Ziffer vor dem Komma. Bei einem Wert von 23,45 würden Sie also 2 auf D1 und 3 auf D2 erhalten. Als nächstes müssen wir diese Zahlen übersetzen, damit die richtigen Segmente aufleuchten. Wir tun dies, indem wir uns auf den 3. und 4. Hohlraum beziehen, wo wir diese Übersetzung vornehmen werden. Abschließend schreiben wir im Rahmen der großen Kodierung die Temperatur auf den seriellen Monitor.

Für den 3. und 4. Void wird die gleiche Kodierung verwendet, nur ein anderer Start-Pin. Damit diese Kodierung funktioniert, ist es wichtig, dass die at/mg einer Zahl auch hintereinander stehen. Von D1 aus liegt also a an Pin 2 und g an Pin 8. Um zum nächsten Segment zu gelangen, können Sie der Variable für den Pin einfach 1 hinzufügen.

Um die Lücke zu beginnen, geben wir an, wo das a dieser Zahl verbunden ist. Als nächstes erstellen wir eine For-Schleife, die sich insgesamt 7 Mal selbst abspielt. Dies dient dazu, dass Sie alle Segmente und alle einzugebenden Werte durchgehen. In dieser Schleife sagen wir ihm zunächst, was er mit dem ersten Stift tun soll. Durch Verweisen auf das Array. Bei jeder Wiederholung dieses Leerzeichens wird dem Stift 1 hinzugefügt, sodass er zum nächsten Segment wechselt.

Dies funktioniert genauso für die 4. Lücke. Nur dann hat er einen anderen Startpin.

/*
   Deze code gaan we gebruiken voor het programmeren van een thermometer.
   De temperatuur gaan je laten zien op een 2-digit 7-segment Led.
   Deze temperatuur wordt in graden celcius weergegeven.

   Kijk op https://elektronicavoorjou.nl/arduino-info/arduino-projecten/ voor meer projecten met Arduino.
*/

// Deze twee library's zijn voor de temperatuur sensor.
#include <OneWire.h>
#include <DallasTemperature.h>

// Hier geven we aan dat de temperatuur sensor op A2 zit aangesloten.
#define DATA A2

// Hier geven we de nodige data aan de library's om van de data graden celcius te maken.
OneWire Data(DATA);
DallasTemperature sensor(&Data);

// Hier maken we een array aan voor de cijfer van de display.
int bcd_array[10] [7] =
{ //{A, B, C, D, e, f, g, dp},
  { HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},     // 0
  { LOW, HIGH, HIGH, LOW, LOW, LOW, LOW},         // 1
  { HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH},      // 2
  { HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH},      // 3
  { LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH},       // 4
  { HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH},      // 5
  { HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH},     // 6
  { HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW},        // 7
  { HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH},    // 8
  { HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH}      // 9
};

// Hier verwijzen we naar de 3de en 4de void die we hebben aangemaakt voor het schrijven op het 7-segment display.
void BCD0(int);
void BCD1(int);

void setup()
{
  // Aanzetten van de sensor.
  sensor.begin();

  // Seriële communicatie starten.
  Serial.begin(9600);

  // Alle inputs en outputs aangeven.
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(A2, INPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(15, OUTPUT);
}

void loop()
{
  // Waardes van sensor vragen.
  sensor.requestTemperatures();

  // Waarde aan variabel geven.
  int temp = sensor.getTempCByIndex(0);

  // Zorgen dan van 23 de 2 op het eerste cijfer komt en 3 op de tweede.
  int D1 = (temp / 10) % 10;
  int D2 = temp % 10;

  delay(1000);

  // Verwijzen naar de 3de en 4de void.
  BCD0(D1);
  BCD1(D2);

  // Temperatuur schrijven op Seriële monitor.
  Serial.println(temp);
}

// 3de void
void BCD0(int number)
{
  // Aangeven op welke pin de D1 (a) staat.
  int pin = 2;

  // Begin bij digitale pin 2 en tel elke keer 1 op. Tot en met dat je bij de 6de pin komt.
  // Elke herhaling gaat hij 1 stapje verder in de array.
  for (int j = 0; j <= 6; j++)
  {
    // Led in display aanzetten op de hiervoor aangegeven pin. Wel of niet aan ligt aan de array.
    digitalWrite(pin, bcd_array[number][j]);
    pin++;
  }
}

// Zelfde als BCD0 maar dan voor het 2de cijfer.
void BCD1(int number)
{
  int pin = 9;
  for (int j = 0; j <= 6; j++)
  {
    digitalWrite(pin, bcd_array[number][j]);
    pin++;
  }
}

Benötigte Produkte