ESP8266 & NodeMCU (LUA) Tutorial – Temperatursensor DS18B20 abfragen

Dies ist Teil zwei meiner Tutorialserie zum ESP8266.
Teil eins ist hier zu finden: „ESP8266 & NodeMCU (LUA) Einstiegstutorial

Inhalt

  1. Einleitung
  2. Voraussetzungen
  3. Hardware-Vorbereitung
  4. Firmware flashen
  5. Das Programm

Einleitung

Im ersten Teil der Reihe habe ich beschrieben, was der ESP8266 ist, wie man die Firmware auf den Controller läd und sich in der Programmierumgebung ESPlorer mit dem Chip verbindet und die Verbindung überprüft.

Hier soll es nun darum gehen, ein einfaches Programm zu erstellen, um mehrere Temperatursensoren DS18B20 einzubinden und Daten wie Chip-Adresse und die Temperatur anzuzeigen.

Voraussetzungen

Als Hardware wird der ESP8266 in Form des ESP-01 genutzt, grundsätzlich funktioniert natürlich jedes andere Modul mit mindestens einem GPIO-Pin. Dieses Tutorial ist aber ausdrücklich für den ESP-01 geschrieben und auch nur auf diesem getestet.

Ansonsten gehe ich davon aus, dass sowohl das ESPTool zum flashen der Firmware, als auch der ESPlorer bereits installiert sind und funktionieren.

Praktisch wäre es natürlich auch, wenn zwei Temperatursensoren DS18B20 vorhanden sind, diese sind auf ebay sehr günstig aus China, oder etwas teurer aus Deutschland erhältlich. Außerdem wird ein 4,7 Kiloohm-Widerstand benötigt.

Hardware-Vorbereitung

Zuerst sollten wir die Hardware entsprechend zusammen stecken. Grundsätzlich ist der Aufbau sehr ähnlich der bereits aus dem ersten Teil bekannten Konfiguration, hinzu kommen nur ein 4k7Ω Widerstand, sowie die beiden DS18B20. Die Grafik sieht der Übersicht halber ein wenig anders aus, ist aber tatsächlich nur in den genannten Details unterschiedlich zur Grafik aus dem ersten Teil.

Der ESP8266 auf einem Breadboard mit dem zwei Temperatursensoren DS18B20
ESP8266 mit DS18B20

Auf dem Breadboard sieht das in etwas komprimierter Form bei mir so aus:

Der ESP8266 mit zwei DS18B20 zusammengesteckt auf einem Breadboard
ESP8266 mit DS18B20 auf Breadboard

Wie man sieht, habe ich die Sensoren direkt auf das Breadboard gesteckt, ebenso den Widerstand.

Firmware flashen

Hier soll es nicht darum gehen, wie die Firmware auf den Chip kommt, sondern darum, dass die korrekte Firmware auf den Chip kommt. Im weiteren Verlauf des Tutorials wird eine Bibliothek genutzt, die verschiedene Module in der Firmware des ESP8266 benötigt.

Die von mir genutzte Firmware enthält die Module

  • file
  • gpio
  • net
  • node
  • ow
  • tmr
  • uart
  • wifi

geflasht ist die float-Version, da dies für die genutzte Bibliothek des DS18B20 notwendig ist.

Wer mag, kann auch die von mir genutzte Firmware hier herunterladen, dann ist alles genau gleich.

Wie die Firmware auf den ESP8266 kommt, habe ich ja bereits geschrieben, dies sollte nun geschehen.

Das Programm

Nun sollte alles bereit sein: Die Hardware ist zusammengesteckt, die Firmware ist auf den ESP8266 geflasht und die Programmieroberfläche ESPlorer ist installiert und einsatzbereit.

Um die Sensoren über unser einfaches Programm abfragen zu können, benötigen wir die Bibliothek ds18b20.lua, die ich vor längerer Zeit mal im Git-Repo von NodeMCU heruntergeladen habe. Ich weiß leider nicht mehr genau, welche der Bibliotheken es war, daher stelle ich auch diese hier zum Download zur Verfügung. Die Bibliothek kann an beliebiger Stelle entpackt werden und dann im ESPlorer geöffnet werden. Hierzu einfach im Reiter „NodeMCU & MicroPython“ auf „Open“ klicken, zu der Datei navigieren, auswählen und öffnen:

Bibliothek ds18b20.lua in ESPlorer öffnen
Bibliothek ds18b20.lua in ESPlorer öffnen

Die geöffnete Datei muss nicht weiter angepasst werden, sie wird nun per Klick auf „Save to ESP“ in den Speicher des ESP8266 geladen und ist ab diesem Zeitpunkt auf dem Gerät nutzbar.

Nun schreiben wir das eigentliche Programm, welches die eben gespeicherte Bibliothek nutzt, um Daten von angeschlossenen DS18B20-Sensoren zu empfangen und auszugeben. Der Dateiname ist hier ds18b20-test.lua.

-- Testprogramm um mehrere DS18B20 zu lesen

-- GPIO-Pin festlegen
pin = 3

-- DS18B20-Modul und GPIO initialisieren
t=require("ds18b20")
t.setup(pin)
addrs=t.addrs()

-- Anzahl der DS18B20 ausgeben
print('Anzahl Sensoren: ' .. table.getn(addrs))

-- Adresse(n) der DS18B20 ausgeben
for k, v in pairs(addrs) do print('Adresse Sensor ' .. k .. ':', v:byte(1,8)) end

for k, v in pairs(addrs) do
print('Temperatur Sensor ' .. k .. ': ' .. t.read(v,C) .. ' Grad Celsius')
end

-- Alle Ressourcen wieder freigeben
t = nil
ds18b20 = nil
package.loaded["ds18b20"]=nil

Die Kommentare sagen eigentlich schon so ziemlich alles: Der nutzbare GPIO-Pin heißt in der Firmware Pin 3 und wird am Anfang des Programms festgelegt. Die eben auf das Gerät geladene Bibliothek wird geladen und der Pin übergeben. Nun wird gezählt, wieviele Sensoren gefunden wurden, die Zahl wird ausgegeben, danach die Adressen der Sensoren, sowie der Temperaturwert.
Zum Schluss werdend die Ressourcen wieder freigegeben.

Auch dieses Programm kann hier heruntergeladen werden, da vermutlich Hochkommata etc. hier falsch dargestellt sein dürften.

Diese Datei muss nun wie schon die Bibliothek per Klick auf „Save to ESP“ in den Speicher des ESP8266 geladen werden. Ist dies geschehen, wird das Programm bereits ausgeführt. Es sollte also in etwa so aussehen:

Das Programm wird im ESPlorer in den Speicher geladen und danach automatisch ausgeführt.
Das Programm wird gespeichert und ausgeführt

Wir sehen also, dass die beiden Sensoren funktionieren und uns neben ihrer Adresse auch die Temperatur melden.

Um das Programm nun über den ESPlorer ausführen zu lassen, müssen wir nur den Befehl

dofile("ds18b20-test.lua");

in der Befehlszeile unten im ESPlorer ausführen und bekommen schon unser gewünschtes Ergebnis zurück:

Das Programm wird im ESPlorer mit dem Befehl dofile("ds18b20-test.lua"); ausgeführt.
DS18B20 abfragen über ESPlorer

Damit geht dieses Tutorial auch wieder zuende, im (hoffentlich bald folgenden) nächsten Teil steigen wir dann etwas tiefer ein und lassen das Programm zyklisch auf dem Controller laufen und die Werte über eine einfache Webseite im LAN/WLAN ausgeben.