mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ESP8266 mit DHT11 Sensor -> HTTP-GET request


Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.lua
http://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...;.

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

Autor: Torsten C. (torsten_c) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

: Bearbeitet durch User
Autor: Pascal S. (pascalsch)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo Torsten C.

Danke für deine schnelle Antwort!

Habe bereits probiert in den init.lua (monDHT11.lua von oben) folgenden 
Code einzufügen:
print('Upload started')

conn = nil
conn=net.createConnection(net.TCP, 0) 

-- show the retrieved web page

conn:on("receive", function(conn, payload) 
                       success = true
                       print(payload) 
                       end) 

-- when connected, request page (send parameters to a script)
conn:on("connection", function(conn, payload) 
                       print('\nConnected') 
                       conn:send("GET /update.php?"
                        .."soiltempf="..fare
                        .."&soiltempc="..temp
            .."&soilhumidity="..humi
                        .." HTTP/1.1\r\n" 
                        .."Host: example.com\r\n" 
                      .."Connection: close\r\n"
                        .."Accept: */*\r\n" 
                        .."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n" 
                        .."\r\n")
                       end) 
-- when disconnected, let it be known
conn:on("disconnection", function(conn, payload) print('\nDisconnected') end)
                                             
conn:connect(80,'example.com') 

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

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gehört dir die Domain "example.com"? Lauscht da dein Server?

Das ist die einfachste Adaption, die dir da grade nicht gelingt.

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ...

Autor: Honk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das nicht in der init.lua machen.
Du musst sicherstellen, dass die WLAN-Verbindung zum Zeitpunkt von 
createConnection() bereits steht.

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, mit einem Timer prüfen und das Senden in eine Funktion werfen. (Ich 
mache das in init.lua :P )

Vor dein Print:
function loop()
  if wifi.sta.status() == 5 then
    -- Stop the wifi connection wait-loop
    tmr.stop(0)

Nach dem conn:connect:
    end)
  else
    print("Waiting for Wifi ...\n")
  end
end

tmr.alarm(0, 100, 1, function() loop() end)

: Bearbeitet durch User
Autor: Florian T. (florian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. :-)

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","PASSWORD")
tmr.delay(1000000)
humi="XX"
temp="XX"
fare="XX"
bimb=1
PIN = 4 --  data pin, GPIO2
--load DHT11 module and read sensor
function ReadDHT11()
  dht11 = require("dht11")
  dht11.read(PIN)
  t = dht11.getTemperature()
  h = dht11.getHumidity()
  humi=(h)
  temp=(t)
  fare=((t*9/5)+32)
  print("Humidity:    "..humi.."%")
  print("Temperature: "..temp.." deg C")
  print("Temperature: "..fare.." deg F")
  -- release module
  dht11 = nil
  package.loaded["dht11"]=nil
end

ReadDHT11()
tmr.alarm(1,60000, 1, function() ReadDHT11() bimb=bimb+1 if bimb==5 then bimb=0 wifi.sta.connect() print("Reconnect")end end)

srv=net.createServer(net.TCP) srv:listen(80,function(conn)
    conn:on("receive",function(conn,payload)
  --print(payload) -- for debugging only
  --generates HTML web site
    conn:send('HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
  <!DOCTYPE HTML>\
    <html><head><meta content="text/html;charset=utf-8"><title>ESP8266</title></head>\
  <body bgcolor="#ffe4c4"><h2>Hygrometer with<br>DHT11 sensor</h2>\
  <h3><font color="green">\
  <IMG SRC="http://esp8266.fancon.cz/common/hyg.gif"WIDTH="64"HEIGHT="64"><br>\
  <input style="text-align: center"type="text"size=4 name="j"value="'..humi..'"> % of relative humidity<br><br>\
  <IMG SRC="http://esp8266.fancon.cz/common/tmp.gif"WIDTH="64"HEIGHT="64"><br>\
  <input style="text-align: center"type="text"size=4 name="p"value="'..temp..'"> Temperature grade C<br>\
  <input style="text-align: center"type="text"size=4 name="p"value="'..fare..'"> Temperature grade F</font></h3>\
  <IMG SRC="http://esp8266.fancon.cz/common/dht11.gif"WIDTH="200"HEIGHT="230"BORDER="2"></body></html>')
    conn:on("sent",function(conn) conn:close() end)
    end)
end)


dht11.lua
local moduleName = ...
local M = {}
_G[moduleName] = M

local humidity
local temperature
local checksum
local checksumTest
local checko1
local checko2

function M.read(pin)
  humidity = 0
  temperature = 0
  checksum = 0
  checko1=0
  checko2=0
  -- Use Markus Gritsch trick to speed up read/write on GPIO
  gpio_read = gpio.read
  gpio_write = gpio.write

  bitStream = {}
  for j = 1, 40, 1 do
    bitStream[j] = 0
  end
  bitlength = 0

  -- Step 1:  send out start signal to DHT11
  gpio.mode(pin, gpio.OUTPUT)
  gpio.write(pin, gpio.HIGH)
  tmr.delay(100)
  gpio.write(pin, gpio.LOW)
  tmr.delay(20000)
  gpio.write(pin, gpio.HIGH)
  gpio.mode(pin, gpio.INPUT)

  -- Step 2:  DHT11 send response signal
  -- bus will always let up eventually, don't bother with timeout
  while (gpio_read(pin) == 0 ) do end
  c=0
  while (gpio_read(pin) == 1 and c < 100) do c = c + 1 end
  -- bus will always let up eventually, don't bother with timeout
  while (gpio_read(pin) == 0 ) do end
  c=0
  while (gpio_read(pin) == 1 and c < 100) do c = c + 1 end

  -- Step 3: DHT11 send data
  for j = 1, 40, 1 do
    while (gpio_read(pin) == 1 and bitlength < 10 ) do
      bitlength = bitlength + 1
    end
    bitStream[j] = bitlength
    bitlength = 0
    -- bus will always let up eventually, don't bother with timeout
    while (gpio_read(pin) == 0) do end
  end

  --DHT data acquired, process.
  for i = 1, 8, 1 do
    if(bitStream[i+0]>2)then
      humidity=humidity+2^(8-i)
    end
  if(bitStream[i+8]>2)then
      checko1=checko1+2^(8-i)
    end
    if(bitStream[i+16]>2)then
      temperature=temperature+2^(8-i)
    end
    if(bitStream[i+24]>2)then
      checko2=checko2+2^(8-i)
  end
    if (bitStream[i+32]>2)then
      checksum=checksum+2^(8-i)
    end
  end

  checksumTest=(humidity+checko1+temperature+checko2)%256

 -- convert to negative format
 --if temperature > 0x8000 then temperature = -(temperature - 0x8000)
 --end

  if checksum ~= checksumTest then
    humidity = -1
  end
end

function M.getTemperature()
  return temperature
end

function M.getHumidity()
  return humidity
end

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

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Florian T. (florian_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pascal S. schrieb:
> Wie füge ich jetzt hier ein HTTP-Get request ein?
> Funktion?

http://benlo.com/esp8266/esp8266QuickStart.html
Abschnitt "How do I send data to a server?"

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.lua
http://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

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wiederhole mich.

Wirf' mal deinen Server auf dem ESP raus und packe deinen 
http-get-Request rein.

Und wundere dich ...

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo Zusammen,

Habe jetzt mal ein bisschen getüffel :P und stehe leider nun komplett 
mit LUA an.

Also, ich habe folgendes gemeistert (abgeleitet von: 
http://projectproto.blogspot.co.at/2016/05/esp8266...):

init.lua
wifi.setmode(wifi.STATION)
wifi.sta.config("WIFI_SSID","WIFI_PASSWORD")

local DAT = 4
local CLK = 3

function DL()
  gpio.write(DAT, gpio.LOW)
  gpio.mode(DAT, gpio.OUTPUT)
end

function DH()
  gpio.mode(DAT, gpio.INPUT)
  gpio.write(DAT, gpio.HIGH)
end

function CL()
  gpio.write(CLK, gpio.LOW)
end

function CH()
  gpio.write(CLK, gpio.HIGH)
end

function DR()
  gpio.mode(DAT, gpio.INPUT)
  return gpio.read(DAT)
end

function W8()
  for i = 1, 100 do
    tmr.delay(10000)
    if DR() == gpio.LOW then
      return true
    end
  end
  return false
end

function RB()
  local val = 0
  for i = 0, 7 do
    CH()
    val = val*2 + DR()
    CL()
  end
  return val
end

function shtread(cmd)
  DH() CH() DL() CL() CH() DH() CL()
  for i = 0, 7 do
    if bit.band(cmd, 2^(7-i))==0 then
      DL()
    else
      DH()
    end
    CH() CL()
  end
  CH() CL()
  if not W8() then
    return nil
  end
  DH()
  local val = RB()
  DH() DL() CH() CL() DH()
  val = val*256 + RB()
  DH() CH() CL()
  return val
end

temperature = shtread(3)
humidity = shtread(5)


--- Get temp and send data to homepage.com
function sendData()
shtread()
print ("Temperature: "..temperature)
print ("Humidity: "..humidity)
-- conection to homepage.com
print("Sending data to homepage.com")
conn=net.createConnection(net.TCP, 0) 
conn:on("receive", function(conn, payload) print(payload) end)
-- homepage.com 81.11.160.21
conn:connect(80,'81.11.160.21') 
conn:send("GET /update.php?soiltempc="..temperature.."&soilhumidity="..humidity.." HTTP/1.1\r\n") 
conn:send("Host: homepage.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)
conn:on("disconnection", function(conn)
                      print("Got disconnection...")
  end)
end
-- send data every X ms to homepage.com
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

: Bearbeitet durch User
Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

Vielen Dank für deine Antwort!

Das verstehe ich jetzt leider aber nicht ganz...

Meinst du so?
--- Get temp and send data to homepage.com
function sendData()
temperature = shtread(3)
humidity = shtread(5)
print ("Temperature: "..temperature)
print ("Humidity: "..humidity)
-- conection to homepage.com
print("Sending data to homepage.com")
conn=net.createConnection(net.TCP, 0) 
conn:on("receive", function(conn, payload) print(payload) end)
-- homepage.com 81.11.160.21
conn:connect(80,'81.11.160.21') 
conn:send("GET /update.php?soiltempc="..temperature.."&soilhumidity="..humidity.." HTTP/1.1\r\n") 
conn:send("Host: homepage.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)
conn:on("disconnection", function(conn)
                      print("Got disconnection...")
  end)
end
-- send data every X ms to homepage.com
tmr.alarm(2, 16000, 1, function() sendData() end )

Habe eben noch ein komplettes Unverständnis mit dem Zeugs, kennst du 
vielleicht eine gute Quelle für den Einstieg?

Danke!

Schöne Grüße,
PascalS

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
conn:send("GET /update.php?soiltempc="..temperature.."&soilhumidity="..humidity.." HTTP/1.1\r\n"
.."Host: homepage.com\r\n"
.."Accept: */*\r\n" 
.."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n"
.."\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.

: Bearbeitet durch User
Autor: Pascal S. (pascalsch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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...) 
hat es jedoch super funktioniert, die Werte stimmten, warum jetzt nicht 
mehr?
Habe ich etwas vergessen?


Schöne Grüße,
PascalS

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
PIN = 4 -- GPIO2, also hier anpassen an den richtigen Pin (GPIO ist nicht dieselbe Nummer wie die Pin-Nummer!
DHT.read11(PIN)
 
t = DHT.getTemperature()
h = DHT.getHumidity()


https://nodemcu.readthedocs.io/en/master/en/modules/dht/

: Bearbeitet durch User
Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
temperature=(temperaturesht*0.01)-39.7;
humidityl=(0.0367*humiditysht)+(-0.0000015955*humiditysht*humiditysht)-2.0468;
humidity=(temperature-25.0)*(0.01+(0.00008*humiditysht))+humidityl;

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

: Bearbeitet durch User
Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

Ok, danke, werde es versuchen...


Schöne Grüße,
PascalS

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, hats geklappt?

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

Ja, funktioniert, voll cool... :)

Nochmals vielen Dank!!


Schöne Grüße,
PascalS

: Bearbeitet durch User
Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- 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?

: Bearbeitet durch User
Autor: Pascal S. (pascalsch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

Ich verwende den NodeMCU V3 
(https://www.amazon.de/NodeMCU-Wifi-Entwicklungsboa...) 
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

: Bearbeitet durch User
Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Pascal S. (pascalsch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

: Bearbeitet durch User
Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
Autor: Pascal S. (pascalsch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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
wifi.setmode(wifi.STATION)
wifi.sta.config("WIFI_SSID","WIFI_PASSWORD")

local DAT = 4
local CLK = 3

function DL()
  gpio.write(DAT, gpio.LOW)
  gpio.mode(DAT, gpio.OUTPUT)
end

function DH()
  gpio.mode(DAT, gpio.INPUT)
  gpio.write(DAT, gpio.HIGH)
end

function CL()
  gpio.write(CLK, gpio.LOW)
end

function CH()
  gpio.write(CLK, gpio.HIGH)
end

function DR()
  gpio.mode(DAT, gpio.INPUT)
  return gpio.read(DAT)
end

function W8()
  for i = 1, 100 do
    tmr.delay(10000)
    if DR() == gpio.LOW then
      return true
    end
  end
  return false
end

function RB()
  local val = 0
  for i = 0, 7 do
    CH()
    val = val*2 + DR()
    CL()
  end
  return val
end

function shtread(cmd)
  DH() CH() DL() CL() CH() DH() CL()
  for i = 0, 7 do
    if bit.band(cmd, 2^(7-i))==0 then
      DL()
    else
      DH()
    end
    CH() CL()
  end
  CH() CL()
  if not W8() then
    return nil
  end
  DH()
  local val = RB()
  DH() DL() CH() CL() DH()
  val = val*256 + RB()
  DH() CH() CL()
  return val
end

function mround(number, decimals, method)
    decimals = decimals or 0
    local factor = 10 ^ decimals
    if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor
    else return tonumber(("%."..decimals.."f"):format(number)) end
end


--- Get temp and send data to homepage.com
function sendData()
temperaturesht = shtread(3)
humiditysht = shtread(5)
temperature = mround((temperaturesht*0.01)-39.7, 1)
humidityl = ((0.0367*humiditysht)+(-0.0000015955*humiditysht*humiditysht)-2.0468)
humidity = mround((temperature-25.0)*(0.01+(0.00008*humiditysht))+humidityl, 1)
print ("Temperature: "..temperature)
print ("Humidity: "..humidity)
-- conection to homepage.com
print("Sending data to homepage.com")
conn=net.createConnection(net.TCP, 0) 
conn:on("receive", function(conn, payload) print(payload) end)
-- homepage.com 81.11.160.21
conn:connect(80,'81.11.160.21') 
conn:send("GET /update.php?soiltempc="..temperature.."&soilhumidity="..humidity.." HTTP/1.1\r\n") 
conn:send("Host: homepage.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)
conn:on("disconnection", function(conn)
                      print("Got disconnection...")
  end)
end
-- send data every X ms to homepage.com
tmr.alarm(2, 16000, 1, function() sendData() end )


Danke nochmals!

Schöne Grüße,
PascalS

: Bearbeitet durch User
Autor: Dirk K. (dekoepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

: Bearbeitet durch User
Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Pascal S. (pascalsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Torsten C. (torsten_c) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die deutsche Version ist hoffentlich kein alter Aprilscherz:
> Programmieren in Lua Taschenbuch – 1. April 2013
https://www.amazon.de/Programmieren-Lua-Roberto-Ie...

Sie kostet nur rund die Hälfte. Kann man die kaufen?

Oder bringt die Version
   "fourth edition (Englisch) Taschenbuch – 1. August 2016"
deutliche Vorteile?

: Bearbeitet durch User
Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.