Wemos D1 odesílání dat přes WiFi do Firefoxu.
Moderátor: Moderátoři
Možná nějaký problém s přechodem z knihovny WiFi na ESP8266WiFi.
Zkusil jsem jinej příklad z Arduino ESP8266 knihoven s připojením na djxmmx.net (citáty dne) a ten jde jak z praku. Když jsem ale zkusil změnit server na ipinfo.io, tak to zase vůbec nešlo. Když jsem zkusil zaklepat na Bastlírna.cz, tak mi přišla odpověď. Prostě hodně starý weby s tím makaj ale relativně nový ne. Jestli je problém v portu nebo HTTP kontra HTTPS netuším.
To code, co jsi dal v předešlým příspěvku zkusím zítra. Ale asi moc rozdíl něž ten z ESP8266 co mi chodí s djxmmx.net nebude. Taky tam je "refresh" dvě minuty aby nebyl server příliš zatěžován.
Proč mi nemůže všechno chodit hned ?!!
Kód: Vybrat vše
...
if (client.connect("192.168.1.10", 80)) {
client.println("GET /index.html HTTP/1.1");
client.println("Host: 192.168.1.10");
client.println("Connection: close");
client.println();
...To "ipinfo.io" je pouze DNS název web serveru, a to ve vaší Wifi síti asi nebude odpovídat skutečné IP adrese toho vámi vytvořeného web serveru s Wemosem. Pro komunikaci bude asi přijatelnější to ipinfo.io nahradit statickou IP adresou toho web serveru, kterou skutečně má ve vaší lokální Wifi síti, a to jak v client.connect() tak i v client.println("Host:.
Součástí Wifi.h v knihovně ESP8266WiFi je vložen odkaz na ESP8266WiFi.h a v tom je mimo jiné vložen odkaz na vlastní WiFiClient.h a v adresáři té knihovny je i zdroják WiFiClient.cpp tj. ne ten původní, ale upravený pro ESP8266. Takže pokud máte knihovnu ESP8266WiFi správně nainstalovanou v Arduino IDE a tu původní knihovnu tj. celý adresář Wifi z podadresáře libraries dočasně přesunete jinam zcela mimo adresáře Arduino IDE tj. defacto odeberete, pak by mělo stačit pro klienta #include <WiFi.h> a definovat objekt WiFiClient client; viz níže.
Kód: Vybrat vše
#include <WiFi.h>
#define ZADOST 1
#define CTENI 2
#define CEKANI 3
#define TIMEOUT 5000
WiFiClient client;
// XXXXX nahradit nazvem WiFi site, ke ktere se chcete pripojit
char ssid[] = "XXXXX";
// Wifi sifrovane WPA pouzivaji pro zabezpeceni heslo ve forme retezce
// Pokud ma prislusna Wifi jine sifrovani tak to udelat jinak
// podobne jako viz dalsi moznosti volani wifi.begin
// https://www.arduino.cc/reference/en/libraries/wifi/wifi.begin/
char pass[] = "YYYYY"; // YYYYY nahradit odpovídajícím heslem
// 192.168.1.10 nahradit skutecnou statickou IP adresou web serveru v siti
char server[] = "192.168.1.10";
unsigned long tck;
int status = WL_IDLE_STATUS;
int stav;
char c;
void setup()
{
Serial.begin(115200);
while (!Serial) {}
Serial.print("Connecting to: ");
Serial.println(ssid);
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid, pass);
delay(1000);
}
Serial.println("Connected to wifi");
printWifiStatus();
tck = millis();
stav = ZADOST;
}
void loop()
{
switch (stav)
case ZADOST:
// spojeni a zadost o web stranku web serveru
Serial.println("\nZacatek spojeni na web server...");
if (client.connect(server, 80)) {
Serial.println("spojeni na web server OK");
client.println("GET /index.html HTTP/1.1");
// 192.168.1.10 nahradit skutecnou
// statickou IP adresou web serveru v siti
client.println("Host: 192.168.1.10");
client.println("Connection: close");
client.println();
stav = CTENI;
} else {
client.stop();
Serial.println("nepodarilo se spojeni na web server");
stav = CEKANI;
}
tck = millis();
break;
case CTENI:
// cteni dat prichazejicich z web serveru
if ((millis() - tck) >= TIMEOUT) {
Serial.println("Timeout dat z web serveru");
Serial.println();
Serial.println("odpojeni od web serveru");
client.stop();
stav = CEKANI;
tck = millis();
} else {
if (!client.connected()) {
Serial.println();
Serial.println("odpojeni od web serveru");
client.stop();
stav = CEKANI;
tck = millis();
} else {
while (client.available()) {
c = client.read();
Serial.write(c);
// doplnit vlastni vyber hodnot z dat
// a pripadne zobrazeni na displeji
// pokud je vse nacteno tak
//
// Serial.println("odpojeni od web serveru");
// client.stop();
// stav = CEKANI;
// tck = millis();
// break;
}
}
}
break;
case CEKANI:
// jen cekame po dobu TIMEOUT v milisekundach
if ((millis() - tck) >= TIMEOUT) {
stav = ZADOST;
}
break;
}
}Ten tvůj kód jsem zkoušel, bylo tam spousta špatnejch složenozávorkovejch úrovní. Ale stejně se s tím k ničemu nepřipojím.
Vzal jsem ten chodivej klient pro čtení z djxmmx.net a zkusil do něj zadat různý IP adresy, co mám v lokální síti. Většina adres psala Timeout, nebo Připojení se nezdařilo. Odpovídal pouze Tp-Link Archer C50. Ten můj server s měřením teplot, co na prohlížečích chodí, se taky nenačte.
Je to pro mě pole neoraný. Vždycky mě víc bavilo programovat věci, který měly nějakej fyzikální výstup co se viděl, nebo dal změřit. Tohle je takový imaginární.
Proč mi nemůže všechno chodit hned ?!!
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
Tak ještě vyseparovat těch 6 teplot a poslat je na TFT displej. Názvy sond separovat nebudu, dorazím je natvrdo v obsluze displeje. Možná ještě do serveru přidám nějaký značky aby se to líp separovalo.
to pocitujlásku: Nezdržuj se s tím, pravděpodobně budu používat thingspeak a ten snad to co mi leze ze serveru sežere.
Proč mi nemůže všechno chodit hned ?!!
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
mozes to urobit tak, ze si budes posielat id cisla a teplotu, a v tom programe na obsluhu displeja si naparujes id na nazov. a ked v buducnosti pridas cidla, tak sa bude menit program len v casti displeja.
Jo netušíte prosím někdo, proč Wemos D1 posílá na serialmonitor neustále tohle? Dá se to nějak zlikvidovat nějakým nastavením?
Kód: Vybrat vše
--------------- CUT HERE FOR EXCEPTION DECODER ---------------
Soft WDT reset
Exception (4):
epc1=0x40201394 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
>>>stack>>>
ctx: cont
sp: 3ffffde0 end: 3fffffd0 offset: 0160
3fffff40: 65746f4b 0000006c 05000000 756f7453
3fffff50: 8dc46170 0a00616b 63617256 6b8dc465
3fffff60: 09000061 3ffef624 000e000f 80000000
3fffff70: 3ffef63c 000f000f 80000000 3ffef654
3fffff80: 0010001f 80000000 00000000 0012001f
3fffff90: 00000000 00000000 43b0c230 00000000
3fffffa0: 3fffdad0 00000000 3ffee738 3ffee764
3fffffb0: 3fffdad0 00000000 3ffee738 40203a78
3fffffc0: feefeffe feefeffe 3fffdab0 40100c39
<<<stack<<<
--------------- CUT HERE FOR EXCEPTION DECODER ---------------
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 3424, room 16
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8
tail 0
chksum 0x2b
csum 0x2b
v00044e80
~ld
Proč mi nemůže všechno chodit hned ?!!
Celeron píše:Jo netušíte prosím někdo, proč Wemos D1 posílá na serialmonitor neustále tohle?
...Soft WDT reset...
Dá se to nějak zlikvidovat nějakým nastavením?
"Soft WDT reset" tj. reset vyvolaný interním watchdog časovačem, který je implementován v ESP a zajišťuje automatický reset pokud se program při provádění někde tzv. zasekne nebo vytuhne. Je to v podstatě pokus o zotavení resetem. Pro Wemos D1 je doba nastavena na cca 1600 ms. Interně po každém ukončení loop() se WDT nuluje, ale pokud kód uvnitř při provádění loop() trvá déle dojde k tomuto resetu.
To v podstatě znamená, že někde v kódu programu je smyčka např. FOR nebo WHILE, ve které není WDT vynulován a jejíž provedení trvá tak dlouho, že celkové provedení loop() se protáhne a způsobí reset vyvolaný watchdog časovačem. U smyček např. FOR nebo WHILE kde by k tomu mohlo za běžného provozu docházet je tedy vhodné uvnitř volat yield(); což zajistí vynulování WDT a pak by k tomu resetu už nemělo docházet.
Takže například do smyčky while pro čtení dat je vhodné vložit yield(); viz níže.
Kód: Vybrat vše
while (client.available()) {
c = client.read();
Serial.write(c);
// doplnit vlastni vyber hodnot z dat
// a pripadne zobrazeni na displeji
// pokud je vse nacteno tak
//
// Serial.println("odpojeni od web serveru");
// client.stop();
// stav = CEKANI;
// tck = millis();
// break;
// vynulování watchdogu
yield();
}- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
Mahoney: to nie je standardna vec, to ako keby si povedal, ze staci vypnut bsod vo windows a system nebude padat.
Mahoney píše:To je celkem standardní věc, stačí vypnout debug.
Jedinný kolem debug, co jsem našel v IDE1.8.19 je v nastaveních desky Generic ESP8266 module toto:
Debug port: Disabled
Debug Level: Žádný
Takže by to asi nemělo valit blbiny na SerialMonitor.
Nebo máš na mysli něco jinýho?
Díky
Proč mi nemůže všechno chodit hned ?!!
Valdano píše:"Soft WDT reset" tj. reset vyvolaný interním watchdog časovačem, který je implementován v ESP a zajišťuje automatický reset pokud se program při provádění někde tzv. zasekne nebo vytuhne.
Delay je použit pouze v Setup a to jen delay(200); kdy se čeká na připojení WiFi. V Loop žádnej delay není použitej. Ale ten příjem paketu, jeho zpracování a výpis na SerialMonitor může něco trvat. Zkusil jsem zrychlit přenosovku na SerialMonitor z 19200 na 115200 a žádnej vliv.
Pak jsem do všech smyček nacpal yield(); Naprosto žádnej vliv, stále Soft WDT reset.
Tak jsem yield(); nacpal na zkoušku ob řádek v celým programu. Nepomohlo, stále Soft WDT reset. Jste si pánové jistí, že to má u ESP8266 nějakej vliv na WD? Někde jsem četl, že se to podobně chová při přetečení stack.
Proč mi nemůže všechno chodit hned ?!!