Hallo Zusammen,
Habe ein neues Spielzeug bekommen... ;)
Den ESP8266.
Nun will ich mit dem über einen DHT11-Sensor die Temperatur und
Luftfeuchtigkeit erfassen.
Hierfür habe ich folgende Skripte von jankop
(http://www.esp8266.com/viewtopic.php?f=19&t=1363) gefunden:
http://esp8266.fancon.cz/common/monDHT11.luahttp://esp8266.fancon.cz/common/dht11.lua
Diese funktionieren einwandfrei, sieht super aus!
Jedoch will ich jetzt bei diesem Code noch ein HTTP-GET request
einfügen, der die Daten an meinen Webserver sendet.
Das Format sollte folgend sein:
"http://example.com/upload.php?tempf=69.98&tempc=21.1&humidity=67".
Habe schon etliche Codes ausprobiert, jedoch will das nicht ganz so...
:(
Bin noch nicht wirklich vertraut mit dem ESP...
Hat hier jemand Erfahrung mit dem, wäre Froh um eine Hilfe!
Danke!
Gruß,
PascalSch
Pascal S. schrieb:> Hat hier jemand Erfahrung mit dem ESP…
Hier? Sicherlich nicht nur einer, sondern viele.
Vielleicht nicht speziell mit LUA.
Wo klemmt es?
Jedoch ohne Erfolg, muss ich vielleicht ein neues Programm (httpget.lua)
daraus machen und es im init.lua aufrufen, aber wie?
Wie gesagt ist komplett neues Gebiet für micht ;)
Gruß,
PascalSch
Hallo Dirk,
Nein, beim ESP8266 habe ich schon meine Homepage angegeben, habe sie
aber für diesen Post auf example.com getauscht (Geheim :P), ansonsten
der genau gleiche Code :D
Außerdem startet der Code gar nicht auf dem ESP8266, wenn ich es beim
init-Code oben unten anfüge...
Muss ich vielleicht ein neues Programm (httpget.lua) daraus machen und
es im init.lua aufrufen, aber wie?
Trotzdem mal danke!
Gruß,
PascalSch
Trag doch in den Code des ESP8266 den URL-Aufruf einfach mal als
vollständige Textkonstante mit Fake-Argumenten ein. Wenn dieser Aufruf
ankommt, steckt dein Problem im Zusammenbau der Zeile ...
Ich habe auch den ESP8266 und LUA war mir für meine Zwecke nicht mehr
ausreichend. Ich habe darauf hin ESPEasy gefunden welche schon die
Bibliothek für die meisten Sensoren dabei hat und schon mit diversen
Heimautomatisierungslösungen reden kann.
Ich habe die Firmware dann für mich modifiziert dass sie auch per HTTP
GET mit einer beliebigen Domain richtig kommunizieren kann.
Ich bin gerade dabei einen Dienst aufzubauen an den man seine Daten
schicken und visualisieren kann. Bei Interesse kannst Dich gerne mal
melden. :-)
Hallo Zusammen,
Danke für euer Antworten!
Also die WLAN-Verbindung besteht immer, da ja der ESP über die IP
abrufbar ist (Webserver), was ja tadellos geht...
Hier mal meine Codes:
init.lua
1
wifi.setmode(wifi.STATION)
2
wifi.sta.config("SSID","PASSWORD")
3
tmr.delay(1000000)
4
humi="XX"
5
temp="XX"
6
fare="XX"
7
bimb=1
8
PIN = 4 -- data pin, GPIO2
9
--load DHT11 module and read sensor
10
function ReadDHT11()
11
dht11 = require("dht11")
12
dht11.read(PIN)
13
t = dht11.getTemperature()
14
h = dht11.getHumidity()
15
humi=(h)
16
temp=(t)
17
fare=((t*9/5)+32)
18
print("Humidity: "..humi.."%")
19
print("Temperature: "..temp.." deg C")
20
print("Temperature: "..fare.." deg F")
21
-- release module
22
dht11 = nil
23
package.loaded["dht11"]=nil
24
end
25
26
ReadDHT11()
27
tmr.alarm(1,60000, 1, function() ReadDHT11() bimb=bimb+1 if bimb==5 then bimb=0 wifi.sta.connect() print("Reconnect")end end)
--if temperature > 0x8000 then temperature = -(temperature - 0x8000)
81
--end
82
83
if checksum ~= checksumTest then
84
humidity = -1
85
end
86
end
87
88
function M.getTemperature()
89
return temperature
90
end
91
92
function M.getHumidity()
93
return humidity
94
end
95
96
return M
Wie füge ich jetzt hier ein HTTP-Get request ein?
Funktion?
Wie gesagt, bin kompletter Neuling, daher sorry für die Umstände... ;)
Schöne Grüße,
PascalSch
Das ist doch Kraut und Rüben.
Mach mal richtig. Fange von vorne an. Und dann Stück für Stück:
- DHT11 auslesen und mittels Print das Ergebnis auf der Konsole ausgeben
- Wenn das klappt, gerne mal mit dem http-Zeugs spielen. Aber nicht
Server und irgendwelche GET-Requests durcheinander werfen. Alles mal
einzeln angehen.
Du musst dein Problem in so kleine Teile zerlegen, dass du diese
Einzelteile angehen und lösen kannst. Hier hast du mal einen großen Wust
Chaos hingeworfen. Kein Wunder, dass da nichts geht.
Hallo Dirk,
Wie schon geschrieben habe ich die verwendeten Skripte von jankop
(http://www.esp8266.com/viewtopic.php?f=19&t=1363).
http://esp8266.fancon.cz/common/monDHT11.luahttp://esp8266.fancon.cz/common/dht11.lua
Sie gehen ja auch soweit, jedoch will ich jetzt nur noch das HTTP-GET
request einfügen...
Das sollte ja möglich sein, oder?
Ich will den ESP einfach so programmieren, dass die Werte des DHT11
Sensors per Interface über die IP abrufbar sind und die Werte per
HTTP-GET request an meinen Webserver gesendet werden.
Danke!
Schöne Grüße,
PascalSch
Hallo Florian,
Der oben gepostete HTTP-GET-Code entspricht diesem, der leider nicht
wirklich geht... :(
Bzw. weiß ich nicht genau wo ich ihn bei meinem Code einfügen soll bzw.
aufrufen.
Wäre Froh um eine Hilfe...
Danke mal! :)
Schöne Grüße,
PascalSch
Hallo Dirk,
Ging leider auch nicht... :(
Habe aber einen anderen HTTP-GET request-Code gefunden mit dem funzts
super!
In dem Fall lass ich das mit dem Server... ;)
Ich sage nochmals vielen Dank an alle!
Schöne Grüße,
PascalSch
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
91
conn:send("\r\n")
92
conn:on("sent",function(conn)
93
print("Closing connection")
94
conn:close()
95
end)
96
conn:on("disconnection", function(conn)
97
print("Got disconnection...")
98
end)
99
end
100
-- send data every X ms to homepage.com
101
tmr.alarm(2, 16000, 1, function() sendData() end )
Jedoch funktioniert das leider nicht ganz, ich vermute, dass ich die
Variablen "temperature" und "humidity" falsch abrufe für das HTTP-GET...
Wie schon geschrieben, bin totaler Neuling in diesem Gebiet, also sorry
für die Umstände ;)
Bitte um Hilfe!
Ich will einfach, das die Daten vom SHT10 Sensor alle 16 Sekunden
abgefragt und an meine Hompage per HTTP-GET weitergeleitet wird.
Schöne Grüße,
PascalSch
Vor deiner Schleife steht es doch richtig:
temperature = shtread(3)
humidity = shtread(5)
Deine Transferleistung war, davon in der Schleife zu machen:
shtread()
Wo die Funktion definiert ist als:
function shtread(cmd)
Das hat mit Neuling oder nicht nichts zu tun, sondern mit mangelnder
Konzentration und komplettem Unverständnis der Materie. Fang' doch mal
an, eine LED zu blinken. So richtig alles von Pieke auf lernen.
So sollte es eher klappen.
Edit: Die ganzen einzelnen conn:send gehen schief. Mach einen großen
String daraus, indem du immer mit ".." anhängst. Also ein großes
conn:send.
.."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n"
5
.."\r\n")
Wo hakt es jetzt? Er druckt die Temperatur und Feuchte im Terminal? Er
überträgt nur einmal?
Die Werte schwanken nicht so schnell; statt alle 16s einmal alle 5
Minuten, vielleicht auch minütlich, messen sollte durchaus ausreichen
für ein ordentlichen Graphen.
Hallo Dirk,
Danke!
Ja, es funktioniert, jedoch werden falsche Daten ermittelt...
Wie oben im Anhang zu sehen ist, sind die Werte falsch.
Beim Programm mit dem Interface
(http://projectproto.blogspot.co.at/2016/05/esp8266-and-sht1x-web-interface.html)
hat es jedoch super funktioniert, die Werte stimmten, warum jetzt nicht
mehr?
Habe ich etwas vergessen?
Schöne Grüße,
PascalS
Jetzt guckst du ins Datenblatt deines Sensors.
Die Werte, die du jetzt ausgibst, sind 1:1 die vom Sensor geschickten.
Die muss man aber noch umrechnen.
Datenblatt: https://akizukidenshi.com/download/ds/aosong/DHT11.pdf
Vielleicht solltest du einfach die in der NodeMCU-Firmware integrierte
Funktion dafür nutzen, anstatt dieser komischen read-Routine.
Hallo Dirk,
Erst mal muss ich beichten, dass der Titel dieses Beitrags falsch ist,
es handelt sich um den SHT10 Sensor, k.A. was da bei mir abging ;)
Zum berechnen:
Habe gerade gesehen, dass es im Programm mit dem Web-Inferface ebenfalls
berechnet wird, sorry, bin glaube ein bisschen daneben...
Also, so wird es berechnet:
Nun die Frage, wie kann man in LUA rechnen?
Wie füge ich das in mein Programm ein? Endergebnis sollte 1 Kommastelle
haben.
Bitte nochmals um Hilfe, vielen Dank! :)
Schöne Grüße,
PascalS
Du trägst es genau so in dein Programm ein, passe aber die
Variablennamen an. Das sollte direkt so klappen in LUA. Ich sehe da grad
nur die simplen Grundrechenarten.
Hallo,
Habe jetzt aber noch ein Problem...
Und zwar, wenn ich den ESP8266 einschalte, dann startet er irgendwie das
Programm nicht?
Der ESP bootet so alle 16 Sekunden (mein Intervall?) neu.
Da kommen dann immer so Hieroglyphen, darauf der Starttext mit
...powered by Lua...
Erst wenn ich "dofile(init.lua)" eingebe, gehts...
Habe den ESP auch schon neu geflasht, ohne Erfolg.
Manchmal kommt auch "no enough memory", obwohl nur dieses Programm drauf
ist und der größte Teil leer ist?
An was kann das liegen?
Bitte um Hilfe, danke!
Schöne Grüße,
PascalS
- Welches ESP-Modul genau setzt du ein?
- Welche NodeMCU-Firmware?
- Falls mit Buildbot erstellt: Einfach zuviele Module einkompiliert? Wie
groß ist die Firmware-Datei?
- Wie sieht die Stromversorgung aus? Welche Kondensatoren hast du an
Vcc/GND deines ESP-Moduls gelötet?
Hallo Dirk,
Ich verwende den NodeMCU V3
(https://www.amazon.de/NodeMCU-Wifi-Entwicklungsboard-CP2102-inkl-Geh%C3%A4use/dp/B01GUXS9D0/ref=sr_1_6?ie=UTF8&qid=1472633321&sr=8-6&keywords=nodemcu)
mit dem ESP8266 12-E Serie.
Ursprünglich war das NodeMCU 0.9.5 build 20150127 drauf.
Beim Flashen habe ich dann eine aktuellerer Firmware (NodeMCU 0.9.6
build 20150704 (float)), dessen 452 KB hat, raufgespielt.
Bei beiden Firmewares das gleiche...
Die Lua-Version ist 5.1.4.
Die Stromversorgung geht derzeit über den im NodeMCU integrierten
Micro-USB.
Oben im Anhang ist zu sehen, was genau passiert, zuerst startet er mit
dem Starttest, nach ca. 16 Sekunden kommen so Hieroglyphen, danach
wieder der Starttext und so weiter...
Will ich nun mit "dofile(init.lua)" starten, passiert das selbe...
Erst wenn ich die Daten per "Reload" im ESPlorer abfrage und daraufhin
mit "dofile(init.lua)" starte, gehts...
Schöne Grüße,
PascalS
@Pascal
Dann wird Mist in der init.lua sein, der das Teil zum Absturz bringt.
Nenn den file mal um, damit er nicht automatisch gestartet wird, z.B.
test.lua.
Dann sollte der ESP anlaufen und melden, daß er kein init.lua findet.
Und dann test.lua mit dofile("test.lua") starten (die Anführungszeichen
gehören in die Klammer, das ist ein String).
Jetzt kannst du in Ruhe die Fehlermeldungen auswerten und die Bugs raus
machen. Erst ganz zum Schluß wieder in init.lua umbenennen.
Das hab ich gefühlte tausend mal mit einem dutzen Firmwaren, gebaut mit
https://nodemcu-build.com/
gemacht.
MfG Klaus
PS
Pascal S. schrieb:> nach ca. 16 Sekunden kommen so Hieroglyphen,
Das sind Meldungen des Bootloaders mit seiner eigenen Baudrate, hab ich
mit meinem saleae aufgezeichnet und dekodiert.
Hallo Klaus,
Danke für deine Antwort!
Habe ich in "test.lua" umgenannt.
Es kommt beim starten, wie erwartet, "lua: cannot open init.lua
", jedoch, wie im Anhang test oben zu sehen ist, leider keine
Fehlermeldung, wieder die Hieroglyphen :P und reboot...
Sobald ich auf "Reload" im ESPlorer klicke und dann dofile, gehts
komischerweise?
Außerdem, wie es auf dem Bild zu sehen ist, sagt er bei jedem
Einschalten "Can't autodetect firmware, because proper answer not
received (may be unknown firmware).", wobei ich reseten muss, liegt hier
was?
Diese Meldung kommt jedoch bei beiden probierten Firmewares...
Außerdem, wie im Anhang esplorer2 zu sehen ist, habe ich den ESP mal mit
file.format komplett gelöscht (es wird ja 0 bytes bei verwendet
angezeigt), jedoch arbeitet er immer noch weiter, hier passt doch auch
was nicht, oder?
Danke für eure Hilfe!
Schöne Grüße,
PascalS
Was war anders, als es lief?
Du hast etwas geändert, und das macht es jetzt kaputt. Was hast du denn
geändert, dass es dann nicht klappte?
Falscher Funktionsname im Timer-Aufruf vielleicht?
Stell' die Baudrate mal um. Dann siehst du mehr Hieroglyphen, aber bei
der richtigen EInstellung die Fehlermeldung, die jetzt kryptisch
aussieht. 78400 zB, oder mal 9600 probieren.
Hallo Dirk,
Habe es jetzt mal mit "Reload" und "dofile" gestartet.
Nach einiger Zeit kam jedoch "PANIC: unprotected error in call to Lua
API (not enough memory)" und er bootete wieder, liegt hier was?
Mein Programm sieht derzeit so aus, vielleicht sieht jemand den Fehler
;):
init.lua
1
wifi.setmode(wifi.STATION)
2
wifi.sta.config("WIFI_SSID","WIFI_PASSWORD")
3
4
local DAT = 4
5
local CLK = 3
6
7
function DL()
8
gpio.write(DAT, gpio.LOW)
9
gpio.mode(DAT, gpio.OUTPUT)
10
end
11
12
function DH()
13
gpio.mode(DAT, gpio.INPUT)
14
gpio.write(DAT, gpio.HIGH)
15
end
16
17
function CL()
18
gpio.write(CLK, gpio.LOW)
19
end
20
21
function CH()
22
gpio.write(CLK, gpio.HIGH)
23
end
24
25
function DR()
26
gpio.mode(DAT, gpio.INPUT)
27
return gpio.read(DAT)
28
end
29
30
function W8()
31
for i = 1, 100 do
32
tmr.delay(10000)
33
if DR() == gpio.LOW then
34
return true
35
end
36
end
37
return false
38
end
39
40
function RB()
41
local val = 0
42
for i = 0, 7 do
43
CH()
44
val = val*2 + DR()
45
CL()
46
end
47
return val
48
end
49
50
function shtread(cmd)
51
DH() CH() DL() CL() CH() DH() CL()
52
for i = 0, 7 do
53
if bit.band(cmd, 2^(7-i))==0 then
54
DL()
55
else
56
DH()
57
end
58
CH() CL()
59
end
60
CH() CL()
61
if not W8() then
62
return nil
63
end
64
DH()
65
local val = RB()
66
DH() DL() CH() CL() DH()
67
val = val*256 + RB()
68
DH() CH() CL()
69
return val
70
end
71
72
function mround(number, decimals, method)
73
decimals = decimals or 0
74
local factor = 10 ^ decimals
75
if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor
76
else return tonumber(("%."..decimals.."f"):format(number)) end
77
end
78
79
80
--- Get temp and send data to homepage.com
81
function sendData()
82
temperaturesht = shtread(3)
83
humiditysht = shtread(5)
84
temperature = mround((temperaturesht*0.01)-39.7, 1)
Ah. Du machst keinen DeepSleep mit Aufwachen, sondern normal im Timer.
LUA ist etwas ungnädig, was Variablen angeht.
Die musst du am Ende des Durchlaufes aufräuen. Jede genutzte Variable
=NIL setzen und am Ende CollectGarbage aufrufen.
Bei DeepSleep starten der ESP komplett neu, da kommt man nicht in
Speicherprobleme.
Pascal S. schrieb:> Es kommt beim starten, wie erwartet, "lua: cannot open init.lua> ", jedoch, wie im Anhang test oben zu sehen ist, leider keine> Fehlermeldung, wieder die Hieroglyphen :P und reboot...> Sobald ich auf "Reload" im ESPlorer klicke und dann dofile, gehts> komischerweise?
Natürlich kommt keine Meldung, es läuft ja kein Programm. Ich hab keine
Ahnung, was "Reload" macht, benutze den ESPlorer nicht. Ich hab einfach
ein serielles Terminal, minicom z.B.
Wenn man den Prompt hat, einfach dofile("test.lua") eintippen.
Du hast ja eine Console, solange du deinen Timer nicht startest, kannst
du ganz in Ruhe alle Funktionen testen. Die sind nach dem dofile() alle
da, einfach aufrufen. Ein paar prints helfen da. Du kannst dir auch jede
Variable ansehen. In der Console kann man auch kurz =xxx statt
print(xxx) benutzen, tippt sich schneller. Man kann sich auch den Heap
ansehen, da kann man dann ahnen, wo dir der Speicher ausgeht. Ist ein
bisschen debuggen wie zu BASIC Zeiten.
MfG Klaus
Hallo Dirk, hallo Klaus,
Erstmal nochmals vielen Dank für eure Hilfe! ;)
Habe glaube den Fehler gefunden, ich rufe die Funktion "mround" für 2
Werte auf, nun habe ich ein weiteres "mround2" erstellt und es
funktioniert...
@Dirk: Müssen die Werte wirklich bei jedem Durchgang auf =nil gesetzt
werden? Läuft mir jetzt der Speicher voll?
Kennt einer zufällig eine gute Infomationsseite für LUA? Würde gerne ein
bisschen herumspielen... Am besten wäre in Deutsch :P
Schöne Grüße,
PascalS
Pascal S. schrieb:> Müssen die Werte wirklich bei jedem Durchgang auf =nil gesetzt> werden?
Nein, müssen sie nicht, wenn du immer wieder die gleichen Variablen
benutzt.
und hier
https://www.lua.org/pil/
MfG Klaus
Hallo Klaus,
Ok, in dem Fall müsste es ja jetzt funzen, lasse gerade ein Dauertest
laufen, mal schauen...
Danke für den Link, muss gleich her ;)
Schöne Grüße,
PascalS
Die deutsche Version ist hoffentlich kein alter Aprilscherz:
> Programmieren in Lua Taschenbuch – 1. April 2013https://www.amazon.de/Programmieren-Lua-Roberto-Ierusalimschy/dp/3955390209
Sie kostet nur rund die Hälfte. Kann man die kaufen?
Oder bringt die Version
"fourth edition (Englisch) Taschenbuch – 1. August 2016"
deutliche Vorteile?
Hab ich grad erst gesehen
Pascal S. schrieb:> Außerdem, wie im Anhang esplorer2 zu sehen ist, habe ich den ESP mal mit> file.format komplett gelöscht (es wird ja 0 bytes bei verwendet> angezeigt), jedoch arbeitet er immer noch weiter, hier passt doch auch> was nicht, oder?
Das Programm ist im Speicher, es läuft also weiter, auch wenn es im
Filesystem gelöscht ist.
@Torsten
Ich lese Fachbücher lieber im Original, daher kann ich zur deutschen
Version nichts sagen. Ich hab die erste Version im Original, sollte für
alles, was man auf dem ESP so machen kann, reichen.
MfG Klaus