DS18B20 Temperatursensor am ESP8266 mit 2 AA Batterien verwenden
Dieser Artikel befasst sich mit der Temperaturermittlung über einen DS18B20 Sensor an einem ESP8266 Modul. Zur Speicherung und weiteren Verwendung werden die Daten über einen Request an ein PHP-Skript übergeben und mit diesem in einer Datenbank gespeichert. Eine zukünftige Verwendung der Temperaturdaten könnte zum Beispiel wie im folgenden Video demonstriert, die Abfrage über ein Alexa Skill mittels eines Amazon Echo oder Echo Dot sein.
Projekt Demonstration
Bauteile
- 1 ESP8266 Version 12E – ich habe mich für dieses Modell entschieden, da man diese Version im Gegensatz zur Version 01 in den Tiefschlaf versetzten kann. Gegen ein NodeMCU Board habe ich mich wegen der größeren Abmessung und den durch die Bauteile vorhandenen höheren Stromverbrauch entschieden.
- 1 DS18B20 Temperatursensor
- 2 Widerstände 10 Kiloohm
- 1 Widerstand 4,7 Kiloohm
- 1 BC 341 Batteriehalter – die einzelnen Kontakte lassen sich ohne großen Aufwand aus dem Gehäuse entfernen und gut für unsere Anforderungen anpassen.
- diverse Kleinteile: Kupferdraht, Buchsenleiste, Lochrasterplatine
Anpassung Batteriehalter
Aufbau
Neben der Stromversorgung des ESP8266 und des DS8266 über VCC und GND wird der Sensor an GPIO12 angeschlossen. Der 4,7 Kiloohm Widerstand wird zwischen der VCC- und der Datenleitung geschaltet.Die 10 Kiloohm Widerstände werden zwischen GPIO15 Port zu GND (Minus) und CH_PD, bei manchen Modellen auch EN zu VCC (Plus) geschaltet. Damit der Chip aus dem Tiefschlaf aufgeweckt werden kann, muss der Reset und GPIO16 Port verbunden werden.
Die fritzing Projektdatei habe ich für dich zum Download bereitgestellt.
Software
Die Programmierung des ESP8266 erfolgt über die Arduino IDE mit hinzugefügten ESP8266-Boardverwalter. Zur Ansteuerung bzw. dem Auslesen des Temperatursensors greife ich auf die auf GitHub veröffentlichte Bibliotheken <OneWire.h> und <DallasTemperature.h> zurück. Die beiden Bibliotheksordner müssen in den Ordner /libraries der Arduino IDE kopiert werden.
Programm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
#include <ESP8266WiFi.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 12 // GPIO des ESP OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature. ADC_MODE(ADC_VCC); // ADC an zur Auslesung der Spannung EspClass ESPm; // Konstantendefinition const char* ssid = "NETZWERKNAME"; const char* pass = "WLAN-SCHLÜSSEL"; const char* serverIp = "IP-ODER-WEBADRESSE"; const int serverPort = 80; const int intervall = 900000000; //Mikrosekunden für Sleep.Mode = 15 Minuten int conn_time; WiFiClient client; void setup() { delay(1000); Serial.begin(115200); Serial.println("Starte Temperatur Messprogramm"); delay(1000); sensors.begin(); /* Inizialisieren der Dallas Temperature library */ WiFi.begin(ssid, pass); Serial.println("Verbindungsaufbau"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); conn_time++; if (conn_time > 20) { break; } } if (WiFi.status() == WL_CONNECTED) { Serial.println(""); Serial.println("Verbunden mit WiFi"); Serial.println("meine IP Addresse: "); Serial.println(WiFi.localIP()); } else { Serial.println(""); Serial.println("keine WiFi Verbindung - kurze Pause"); ESP.deepSleep(100000); Serial.println("Ende des kurzen Schlafmodus"); } if (!client.connect(serverIp, serverPort)) { Serial.println("Verbindung zu Server fehlgeschlagen"); } else { Serial.println("Verbindung zu Server vorhanden"); } // Abfrage Temperatur double temperatur; sensors.requestTemperatures(); temperatur = sensors.getTempCByIndex(0); Serial.println(); Serial.print(temperatur); Serial.print(" Grad Celsius"); // Batteriespannung messen uint ADCValue = 0; String batterie; ADCValue = ESPm.getVcc() + 144; // hier Korrektur Wert eintragen float ADCfloat = float(ADCValue); batterie = String(ADCfloat / 1000, 2); Serial.println(); Serial.print(batterie); Serial.print(" V"); // Aufbau des URL-Request String url = "/NAME-PHP-DATEI"; url += "?data_b="; url += "Testumgebung"; url += "&data_c="; url += temperatur; url += "&data_e="; url += batterie; Serial.println(); Serial.print("Requesting URL: "); Serial.println(url); // Request zum Server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + serverIp + "\r\n" + "Connection: close\r\n\r\n"); delay(1000); // Serial-Ausgabe der Rückantwort des Server while (client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } client.stop(); Serial.println(); Serial.println("closing connection"); // ESP8266 schlafen schicken Serial.println("ESP geht in Ruhemodus"); ESP.deepSleep(intervall); // Pause } void loop() { } |
Anpassungen
Im Bereich //Konstantendefinition musst du deine Daten für NETZWERKNAME, WLAN-SCHLÜSSEL und IP-ODER-WEBADRESSE eintragen. Der Wert serverPort=80 muss eventuell auch angepasst werden. Der Dateiname für das aufgerufene PHP-Skript hinterlege ich erst im Bereich // Aufbau des URL-Request.
Die Befehle zur Ausgabe über die serielle Schnittstelle kann man entfernen. Zuvor solltest du im Bereich //Batteriespannung messen den Korrektur anpassen. Hierzu vergleiche den ausgegebenen Wert mit der tatsächlichen, von dir am Chip gemessenen Spannung.
Das PHP-Skript zur Speicherung in einer MySQL Datenbank könnte wie folgt aussehen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php $host_net = "domain"; // Der Host mit dem du dich verbinden willst. $user_net = "benutzername"; // Der Datenbank-Benutzername. $password_net = "passwort"; // Das Datenbank-Passwort. $error_net = 0; $leererWert = 0; $aktuellesDatum = date("Y-m-d H:i:s"); $sensorname = $_GET['data_b']; $messwert_a = $_GET['data_c']; $messwert_b = $_GET['data_e']; if ( $sensorname != NULL and $messwert_a != NULL) { $geraetename = 'ESP8266'; $speicherzeitpunkt = $aktuellesDatum; $sql = "INSERT messwerte (name, sensorname, sensorwert_a". ", sensorwert_b, speicherzeitpunkt)". "values ('".$geraetename."','".$sensorname."','".$messwert_a. "','".$messwert_b."',''".$speicherzeitpunkt."')"; $con_db_net = mysql_connect($host_net, $user_net, $password_net, true); mysql_set_charset('utf8', $con_db_net); mysql_select_db("DATENBANKNAME", $con_db_net); if (! mysql_query($sql, $con_db_net)) { echo ('.NET FALSE'); } else { echo ('.NET TRUE'); } mysql_close($con_db_net); } else { echo 'Datei wurde nicht ordnungsgemäß aufgerufen.'; } ?> |
Anmerkung zur Laufzeit
Mit den verwendeten 2700 mAH Akkus komme ich bei einer viertelstündigen Messung mit Datenübertragung auf eine Laufzeit von aktuell vier Tagen und 2 Stunden. Nicht gerade viel, allerdings kann man die Laufzeit bei entsprechender Verringerung der Messanzahl bzw. Verlängerung des Tiefschlafzyklus bestimmt etwas verlängern. Oder man wechselt auf eine andere Stromquelle (18650 Lithium-Ionen Akkus), wie ich es für ein anderes Projekt in Planung habe.
Erst einmal spitze Programmierung.
Doch will die Arduino IDE den Code nicht akzeptieren.
Code/
Alexa-Temp-Abfrage:21:1: error: ‘WiFiClient’ does not name a type
WiFiClient client;
^
/Users/gordonlehmann/Documents/Arduino/Alexa-Temp-Abfrage/Alexa-Temp-Abfrage.ino: In function ‘void setup()’:
Alexa-Temp-Abfrage:34:1: error: ‘WiFi’ was not declared in this scope
WiFi.begin(ssid, pass);
^
Alexa-Temp-Abfrage:37:25: error: ‘WL_CONNECTED’ was not declared in this scope
while (WiFi.status() != WL_CONNECTED) {
^
Alexa-Temp-Abfrage:45:22: error: ‘WL_CONNECTED’ was not declared in this scope
if (WiFi.status() == WL_CONNECTED) {
^
Alexa-Temp-Abfrage:58:6: error: ‘client’ was not declared in this scope
if (!client.connect(serverIp, serverPort)) {
^
Alexa-Temp-Abfrage:97:8: error: ‘Technik’ was not declared in this scope
url += Technik;
^
Alexa-Temp-Abfrage:105:1: error: ‘client’ was not declared in this scope
client.print(String(“GET “) + url + ” HTTP/1.1\r\n” +
^
exit status 1
‘WiFiClient’ does not name a type
/Code
Was läuft da falsch?
Vllt ist der Fehler ja schon aufgefallen und es gibt eine Lösung.
und wo packe ich die php Datei hin???
Gruß Gordon
Hallo Gordon,. Damit die Einbindung möglich ist, musst du in der Arduino IDE den ESP8266 in die Boardverwaltung einbinden.
eventuell hat sich dein Problem schon gelöst. Leider komme ich erst heute zu einer Beantwortung deiner Frage. Die Fehlermeldung lässt eine fehlende Library vermuten. In der ersten Zeile bindest du die notwendige Library in das Programm ein #include
Füge hierzu unter Datei->Voreinstellungen->Zusätzliche Boardverwalter-URLs folgenden Link ein:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Danach installierst du über den Boardverwalter, zu finden unter Tools->Board->Boardmanager, das ESP Paket.
Danach müsste dein Problem im Programmcode behoben sein.
Die PHP-Datei packst du auf Rechner / Server, der die Speicherung der enpfangenen Daten in der Datenbank übernimmt.
Viele Grüße
Wolfgang
Hallo,
in der Fritzing Darstellung ist der DS18B20 nicht korrekt angeschlossen. Die Verbindung vom GPIO12 muss auf den Anschluss in der Mitte und nicht auf den rechten.
Thomas
Hallo Thomas,
vielen Dank für Deinen Hinweis. Da ist mir tatsächlich ein Fehler unterlaufen. Die Daten habe ich ausgetauscht.
Viele Grüße
Wolfgang
ist an der kurzen Laufzeit der DS18B20 schuld? Ist die LED auf dem esp ausgelötet? Ich komme rechnerich auf ca. 300 Tage ohne den DS18DS20. Wenn der soviel braucht, dann muss ich mir was anderes einfallen lassen…
Hallo Rudi,
die meiste Energie geht für die WLAN-Verbindung drauf. Eine Verlängerung der Laufzeit kann man durch eine Verringerung der Messungen und deren Übertragung erreichen.
Viele Grüße
Wolfgang
Kleiner Hinweis, alle Kommentare werden moderiert.
Dies bedeutet, der Kommentar wird vor der Veröffentlichung durchgelesen und von mir geprüft. Auch behalte ich mir vor, jeden Kommentar zu löschen, der nicht direkt auf das Thema abzielt oder nur den Zweck hat, Leser oder Autoren herabzuwürdigen.
Neuste Beiträge
Kleinen Spickzettel für Raspbian OS Befehle
Entdecke die Welt von Webnist.de
Erfahre mehr über die Hintergründe meines Blogs und wie ich dich bei deinen digitalen Projekten unterstützen kann.Kategorien
KATEGORIEN
Aktuelles Video auf YouTube
Beschreibung der Verwendung eines TTP223B Touch Sensors am GPIO Port des Raspberry Pi mit Python.
Die aktuell 6 derzeit meistbesuchten Beiträge
Beiträge mit den meisten Kommentaren
Funktional Immer aktiv
Vorlieben
Statistiken
Marketing