mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ESP8266: Stop nach 99 Durchläufen


Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen ESP8266-01 mit ein paar DS1820. Der ESP liest die DS1820 
aus und senden dann die Daten via GET-Request an meinen Webspace. Leider 
funktioniert das nur 99 mal, d.h. nach 99 mal Senden (Variable heisst 
zaehler) hängt sich das Teil irgendwie auf.

Es wird ein outstring aufbereitet mit den Meßwerten der Sensoren, danach 
noch eine Variable angehängt, die die Anzahl der bisher erfolgten 
GET-Requests anzeigt.

Vielleicht sieht jemand einen Fehler?
zaehler=0   
  


tt=0
sk=net.createConnection(net.TCP, 0)
    sk:on("receive", function(sck, c) 
        print(c) 
        tt=tt+1
    end )
  
  
  

    ip="xx.xx.xx.xx"
    sk:connect(80,ip)
  
  
tmr.alarm(2,60000, 1, function() // jede Minute ausführen
  t=require("DS18B20")
    t.setup(4)
    addrs=t.addrs()
    -- Total DS18B20 numbers, assume it is 2
    print("Sensors found: "..table.getn(addrs))
  output=""..table.getn(addrs)
  for i=1, table.getn(addrs) do
    id=""
    for j = 1, string.len(addrs[i]) do      
      id = id..string.format("%02x",addrs[i]:byte(j))
    end
    output=output.."&"..string.format("%i=",i)..id.."&"..id.."="..t.read(addrs[i],t.C)
    print("Id["..i.."]="..id.." --> "..t.read(addrs[i],t.C))
    
  end
    

  sendstring = "GET /avrweb/esp8266.php?Module=ESP02".."&Anz="..output.."&Counter="..zaehler.." HTTP/1.1\r\n"  
  print("SendString="..sendstring.."\n")
    sk:send(sendstring.."Host: www.xyz.de\r\n".."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
  sk:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
  
  
  -- Don't forget to release it after use
    t = nil
    DS18B20 = nil
  
  if tt<2 then 
    wifi.sta.autoconnect(1)
    print("AUTOCONNECT")
    tt=0
  end

  zaehler=zaehler+1
  
  end)  // tmr.alarm


Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlt ne Klammer:
tmr.alarm(2,60000, 1, function() 

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Draco schrieb:
> Da fehlt ne Klammer:
> tmr.alarm(2,60000, 1, function()

Ahh.... sorry, is ja unten bei End), ich sehs... :-D Basic war noch nie 
meins ^^

Autor: Jan L. (ranzcopter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es tatsächlichen einen "Stop nach 99 Durchläufen" - oder eher, wenn 
"zaehler" 100 erreicht? => ich würd' "zaehler" mal auf 99 setzen, und 
schauen, ob's dann auch 99 Durchläufe gibt, oder nur einen. Eingrenzen 
halt...

Autor: ABC (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Draco schrieb:
> Draco schrieb:
>> Da fehlt ne Klammer:
>> tmr.alarm(2,60000, 1, function()
>
> Ahh.... sorry, is ja unten bei End), ich sehs... :-D Basic war noch nie
> meins ^^

Motto 1: Erst antworten - dann lesen.
Motto 2: Ignoranz zeigen.

Die Sprache ist nicht BASIC.

Autor: Axel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
manchmal kann man einfach nicht anders, das kommt erst mit der Zeit ;)

StromTuner

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich zaehler am Anfang auf 90 setze geht die Ausgabe bis 189 (also 
auch wieder 99).

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die beiden sk:send() hintereinander werden auf Dauer nicht 
funktionieren. Entweder sie werden zu einem send zusammengefaßt, oder 
das 2. send muß in den callback vom ersten send. Ich zitier mal aus dem 
Link weiter unten:

> You must therefore use an Event-driven programming style in writing your
> ESP8266 Lua programs.

http://www.esp8266.com/wiki/doku.php?id=nodemcu-un...

MfG Klaus

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus,
vielen Dank. Da werde ich mal schauen.

Allerdings hätte ich bei einem Fehlverhalten ein Reboot erwartet. Nun 
ja, Debugging ist nicht so einfach bei dem Teil :-)

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe noch einmal ein Redesign gemacht. Das Problem war wohl, dass 
die connection nicht geschlossen wurde. Ich vermute, dass hier intern 
bei der ESP-8266 Firmware eine Obergrenze definiert ist für offene 
Verbindungen.

Hier der Code:
t=require("DS18B20")

zaehler=0    

function gettemp()    
    t.setup(4) -- 4=pin of 1wire
    addrs=t.addrs()
    
    print("Sensors found: "..table.getn(addrs))
    output=""..table.getn(addrs)

    for i=1, table.getn(addrs) do

        id=""
        for j = 1, string.len(addrs[i]) do          
            id = id..string.format("%02x",addrs[i]:byte(j))
        end

        temperature=""..t.read(addrs[i],t.C)
        if (temperature==nil) then
          print("vor output temp=nil\n")
        end

        output=output.."&"..string.format("%i=",i)..id.."&"..id.."="..temperature
         
    end
end

function senddata()
  gettemp()

  print("Create sendstring \n")
        
  sendstring = "GET avrweb/esp8266.php?Module=ESP02".."&Anz="..output.."&Counter="..zaehler
                     .." HTTP/1.1\r\n"  
                     .."Host: localhost\r\n"                     
                     .."Accept: */*\r\n"
                     .."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n"
                     .."\r\n"
  print("SendString="..sendstring.."\n")
  

  conn=net.createConnection(net.TCP, 0)
    
  conn:connect(80,"127.0.0.1")
  
  conn:on("connection", function (conn, payload)
        print("Connected ")
        zaehler=zaehler+1
        conn:send(sendstring)
        print(".. string was sent, counter = "..zaehler.."\n")      
        
  end)
        
  conn:on("sent", function(sck)
         print("Closing connection")
         conn:close()
  end)
  
  conn:on("receive", function(sck, payload) print(payload)  end)      
  
  conn:on("disconnection", function(sck)
     print("Got disconnection...")
  end)  
         
end
    
tmr.alarm(2,60000, 1, function() senddata() end)
    

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,
auf der Basis Deiner Arbeit versuche ich den ESP8266 mit meinem 
localhost zu verbinden. Im Appache access.log sehe ich die 
Verbindungsaufbau-Versuche. Meine localhost Umgebung 
C:\xampp\htdocs\esp8266\esp8266.php wird aber nicht erreicht. Hier mein 
sendstring:
sendstring = "GET 
esp8266/esp8266.php?Module=ESP02".."&Anz-DS18B20="..output.."&Messungen= 
"..zaehler
                     .." HTTP/1.1\r\n"
                     .."Host: xxx.xxx.xxx.20\r\n"
                     .."Accept: */*\r\n"
                     .."User-Agent: Mozilla/4.0 (compatible; esp8266 
Lua; Windows NT 5.1)\r\n"
                     .."\r\n"

Wenn ich vom Browser http://xxx.xxx.xxx.20:81//esp8266/esp8266.php 
localhost aufrufe erreiche ich mein esp8266.php problemlos.
Welche Funktion hat "Module=ESP02"?
Es wäre toll wenn mir jemand helfen könnte.

Beste Grüße Richard

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.