Robins Blog – Technik und Multimedia

Einfaches WLAN-Thermometer für Fhem mit NodeMCU ohne Löten (Teil 1)

Update März 2016 – Einfacher geht es mit Easy ESP in meinem Beitrag Teil 2

Update 10.01.2016 Schaltplan hinzugefügt

Etwas ungewohnt die Überschrift. Als Zielgruppe spreche ich heute auch die Blog-Leser an, welche mal ein Wochenend-Projekt starten möchten. Das alles mit geringen Kenntnissen von Elektronik und Fhem, jedoch mit dem Ziel, ein schnelles Erfolgserlebnis zu bekommen.

Bei dem hier vorgestellten WLAN-Thermometer werden alle paar Minuten Temperaturdaten auf dem integrierten Webserver angezeigt und / oder gleichzeitig rübergeschubst zu Fhem.

Der Aufbau dieser Schaltung ist sehr einfach, man benötigt keinen Lötkolben  und später nur eine 5V USB-Versorgungsspannung und das WLAN. Als Herz dieser Schaltung wird der NODEMCU-Microcontroller verwendet. Grund dafür ist, das er einen ESP8266-12 an Board hat, leicht zu programmieren ist von der Spannungsversorgung her mit 5 V USB betankt werden kann. Zur Temperaturmessung wird ein 18B20 1-Wire Chip benötigt, welcher sehr preisgünstig ist  und auch mal einen Kurzsschluß oder eine Falschbeschaltung vertragen kann. Also auch ideal für Anfänger. Außerdem benötigt man noch ein 1 K-Ohm Widerstand, der als Pull-Up verwendet wird. Achtung:  Wenn der 18B20 1-Wire Temperatur-Sensor über ein sehr langes Kabel (z. B. 60 m) angeschlossen werden soll, muss der Widerstand ausgetauscht werden! Blog-Leser Christian und ich haben damit einen netten Abend am Telefon verbracht, um seine 6 18B20-Temperaturmodule zum Rennen zu bekommen. Wir haben da einen 300 Ohm Widerstand verwendet. Jetzt läuft die Schaltung wie eine Uhr. Als kleine Besonderheit könnt ihr auch die Daten gleichzeitig (d. h. Abruf alle 30s) in Fhem übertragen. Wer kein Fhem hat, dann die Programmzeilen löschen und erhält über die IP den Temperaturwert auf der Website (s. Foto oben).

Schaltplan Nodemcu mit DS18B20 Thermometer

Den Programm-Code dieser Schaltung habe ich in den Grundzügen aus dem Github vom NodeMCU gezogen und leicht modifiziert.

Bei den LoLin-NodeMCUs (->LoLin NodeMCU bei eBay) die  5V Spannungsversorgung für den DS18B20 auf dem Pin VU  (der dritte Pin links oben) abgreifen.

Die Bauteil-Liste:

Aktion: ich habe noch die Bauteile komplett als Set hier liegen. Wer zuschlagen möchte, für 21,45 Euro inkl. Versand könnte ich Euch ein Set abgeben. Das Set beinhaltet den original NodeMCU (kein Fake), Kabel, 1 x DS18B20-Temperaturmodul und ein 1 K-Ohm Widerstand. Gegen Aufpreis noch ein Breadboard.
Bitte per e-Mail kontaktieren oder unten in den Kommentaren anfragen!

Ihr könnt die Schaltung auch fliegenderweise zusammenstecken und später mit Heißkleber fixieren, siehe Foto.

Software:

Da manche NodeMCU-Bausteine nicht geflashed sind, würde hier hier erst mal die Firmware flashen, Windows: https://github.com/nodemcu/nodemcu-flasher
Einstellungen (Advanced Tab): 921600 Baud, 4MByte Flash size, 80 MHz Flash speed, SPI Mode: DIO
Auf dem Tab „Config“ hier die Float-Variante auswählen (https://github.com/nodemcu/nodemcu-firmware/releases) , Ziel-Adresse 0x00000
Hinweis: die Geschwindigkeit von 921600 baud ist wohl nicht auf jedem Rechner (besonders auf virtualisierten Systemen) machbar.
In diesem Fall die baud rate auf 57600 runternehmen, besser langsam flashen als gar nicht

Die Software stammt ursprünglich aus dem Github und ich habe sie nur an einigen Stellen modifiziert, warum das Rad zwei mal erfinden? Ich habe sie leicht modifiziert. Jetzt können die Temperaturdaten auch gleichzeitig (bzw. alle 30s) an Fhem übertragen werden. Als Entwicklungsumgebung nehme ich die auf JAVA-basierte Version von Esplorer.

 

init.lua

--init.lua
wifi.setmode(wifi.STATION)
wifi.sta.config("DeineSSID","DeinPasswort")
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()== nil then
print("IP unavaiable, Waiting...")
else
tmr.stop(1)
print("ESP8266 mode is: " .. wifi.getmode())
print("The module MAC address is: " .. wifi.ap.getmac())
print("Config done, IP is "..wifi.sta.getip())
dofile ("fhem.lua")
end
end)

fhem.lua

--fhem.lua
require('ds18b20')
-- ESP-01 GPIO Mapping
pin =1
ds18b20.setup(pin)
t=ds18b20.read()
print("Temp:" .. ds18b20.read() .. " C\n")
if(t==nil) then
t=0
end
-- übergabe der Temperatur in Fhem
-- IP entsprechend korrigieren
-- fhem start
tmr.alarm(3, 300000, 1, function() sendDatafhem() end )
function sendDatafhem()
print ("fhem!")
t=ds18b20.read()
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end )
conn:connect(8083,"DeineFhemIP")
conn:send('GET /fhem?cmd=setreading%20esp82662%20state%20T:%20' ..t.. '\r\n HTTP/1.1\r\nHost: www.local.lan\r\n".."Connection: keep-alive\r\nAccept: */*\r\n\r\n"')
end
-- Anzeige auf Website
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive",function(conn,payload)
print(payload)
conn:send(t)
end)
end)
--- Get temp and send data to thingspeak.com
--https://thingspeak.com/channels/xxxxx/private_show
function sendData()
--ds18b20.read()
t1=ds18b20.read()
t2=23.0
--t1 = lasttemp / 10000
--t2 = (lasttemp >= 0 and lasttemp % 10000) or (10000 - lasttemp % 10000)
print("Temp:"..t1 .. "."..string.format("%04d", t2).." C\n")
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com 184.106.153.149
conn:connect(80,'184.106.153.149')
conn:send("GET /update?key=DeinApiKey&field1="..t1.."."..string.format("%04d", t2).." HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connection")
conn:close()
end)
end
-- send data every X ms to thing speak
tmr.alarm(0, 600000, 1, function() sendData() end )

ds18b20.lua  (aus dem Github)

In fhem dann folgendes eintragen:

define esp8266temp CUL_WS 4
attr esp8266temp alias esp8266 Testmodul NodeMCU
attr esp8266temp event-min-interval state:1200
attr esp8266temp model KS300
attr esp8266temp room Plots
define FileLog_esp8266temp FileLog ./log/esp8266temp-%Y.log esp8266temp:T:.*
define SVG_FileLog_esp8266temp_1 SVG FileLog_esp8266temp:SVG_FileLog_esp8266temp_1:CURRENT
define SVG_FileLog_esp8266temp_2 SVG FileLog_esp8266temp:SVG_FileLog_esp8266temp_2:CURRENT
attr SVG_FileLog_esp8266temp_2 label "WLAN-Thermo min.: $data{min1} °C, max: $data{max1} °C, Letzte: $data{currval1} °C"
attr SVG_FileLog_esp8266temp_2 room Plots

Das Ergebnis in Fhem (Plot) sieht dann beispielsweise so aus:

Hardware:

Installation:

Als Entwicklungsumgebung nehme ich die auf JAVA-basierte Version von Esplorer. Hier werden nach und nach folgende Dateien init.lua, fhem.lua und ds18b20.lua auf dem NodeMcu übertragen.

Fazit: Mit nur 3 Bauteilen könnt ihr euch ein WLAN-Thermometer bauen. Mit einem eigenen Webserver on Board, den ihr mit jedem Browser in Eurem Netzwerk aufrufen könnt. Fhem-Benutzer erhalten die Temperatur-Daten alle 30 s in ihrer Fhem-Umgebung und können dann natürlich dort lustige Sachen machen:

Software verbessern? Kein Problem, selber machen!

Die mobile Version verlassen