Wemos D1 odesílání dat přes WiFi do Firefoxu.
Moderátor: Moderátoři
Wemos D1 odesílání dat přes WiFi do Firefoxu.
No a nyní bych ten výpis teplot potřeboval poslat jako HTML do některýho prohlížeče přes WiFi. Podle příkladů, co je u knihoven ESP8266 jsem nastartoval ve Wemosu server. IP scanerem v PC Wemose vidím jako ESP-32C904. Když zadám v prohlížeči IP adresu, tak se mi zobrazí teploty ale jen jednou jedenkrát i když na serial monitoru se každých 5 sekund teploty aktualizují.
Něco dělám blbě, potřeboval bych, aby se v prohlížeči taky každých 5 sekund teploty aktualizovaly. Zatím jsem nikde nenašel něco podobnýho pro inspiraci.
Dokážete prosím někdo poradit, jak to principielně udělat? Nejlepší by byl příklad kterej řeší něco podobnýho.
Stejnou věc s Wemosem D1 a LAN W5500 mám funkční. Ale drát není vždy k dispozici.
Díky
Proč mi nemůže všechno chodit hned ?!!
Kód: Vybrat vše
client.println("<head><meta http-equiv='refresh' content='5' /></head>");
client.println("<html>");
... atd.- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
takze mas niekolko moznosti, najjednoduchsia je dat meta tag refresh na 5 sekund.
dalsia z moznosti je na pozadi cez javascript sa dotazovat napr. aj kazdu sekundu na hodnoty a tie potom aktualizovat na stranke - tym odpadne to trocha rusive obnovenie celej stranky, ona bude nacitana a budu sa menit len hodnoty.
dalsie moznosti su uz skor len rozsirene verzie tej druhej.
Prostě se tím musí člověk prokousat.
Další projektík bude WiFi client, který bude na TFT nebo Nexion displeji někde na zdi zobrazovat naměřený hodnoty teplot ze serveru ESP8266 aniž by musel být zapnutý PC nebo mobil.
Proč mi nemůže všechno chodit hned ?!!
Takže nejspíš zpět na stromy, vykašlat se na HTML a zkusit se prokousat "nižší vrstvou" tedy UDP protokolem. Tam se posílají jen surový data, který se dají bez problémů zase chytat. Blbý je, že příkladů na server a klient po UDP je velice málo. Vlastně ani nevím, čím se podívat na data na síti, co UPD odešle. To bude zase boj...
Proč mi nemůže všechno chodit hned ?!!
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
Udp na esp som mal problem, ze ako keby skracoval pri odosielani na max. 16 bajtov. ked som z pocitaca poslal viac, tak to esp v pohode prijalo, ale ak som to iste poslal z esp (aj do pocitaca), tak mi prislo len prvych 16 bajtov.
Ak ti to ale staci, tak udp to mas tak na jedno popoludnie.
Ten příklad načte web stránku ze serveru jen jednorázově, ale vy si to samozřejmě můžete upravit tak, že bude načítat stránku opakovaně s nějakým časovým odstupem. Takže poté co budete mít všechna data a server spojení ukončí a tak ukončíte klienta zavoláním client.stop() a zapíšete si třeba pomocí millis() časovou značku. Po uplynutí určité doby znovu zavoláte client.connect atd. a znovu načtete aktuální data z odpovědi serveru.
V rámci části kódu viz níže si postupně načtete odpověď webového serveru a vyseparujete z ní hodnoty a případně texty a pak si je zobrazíte na displeji. Na straně web serveru doporučuji texty a hodnoty zapisovat do HTML tagů DIV, pro které si nadefinujete unikátní název ID a podle toho se vám pak na straně klienta budou lépe identifikovat jednotlivé texty a hodnoty v odpovědi serveru.
Kód: Vybrat vše
while (client.available()) {
char c = client.read();
// postupné načtení odpovědi webového serveru
// a následné vyhodnocení a vyseparování hodnot
}Ano na straně klienta v ESP zařízení to nebude úplně univerzální jako webový prohlížeč tj. pokud stranu serveru změníte bude potřeba pravděpodobně změnit i stranu klienta, ale bude to z hlediska menší komplikovanosti přijatelné a díky tomu můžeme mít webový server s ESP, ze kterého bude možné číst a zobrazovat aktuální hodnoty webovým prohlížečem na počítači nebo tím wifi klientem z jiného zařízení s ESP.
Nezapomeňte odstranit z toho zdrojáku níže uvedené dva řádky tj. ty tam jsou jen jako upozornění na to nedělat žádné nekonečné cykly.
Kód: Vybrat vše
// do nothing forevermore:
while (true);- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
pocitujlasku píše: Osobne mam rad websocket, lebo tam si mozem posielat aj vacsie data
Na ten jsem se díval taky, tady ho používá na přenos analogový hodnoty z Wemose do prohlížeče v reálným čase. Zkusil jsem to zkompilovat a opravdu okamžitá reakce na změnu. Procházel jsem od toho zdroják, ale přišlo mě to na mě moc složitý a manuál od WebSocketu jsem při zběžným hledání na netu nenašel. Víš o nějakým?
Díky!
Proč mi nemůže všechno chodit hned ?!!
Valdano píše:Mrkněte na jednoduchý příklad web klienta, který je na GitHubu. Je to založeno na knihovně WiFiClient použitelné pro Arduino i pro ESP.
Jo to vypadá dost jednoduše. Na Serialmonitoru bude vše, co přijde ze serveru. A prohrabat se v přijatým. Jen je tam jedna chybka, knihovny WiFiClient a WifiServer na ESP8266 nechodí. Musí se použít knihovny ESP8266WiFi.h, ESP8266WebServer.h a podobný. Odzkoušeno osobně.
Proč mi nemůže všechno chodit hned ?!!
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
Ja som tiez zo zaciatku isiel podobnou cestou ako ty, ale ked som sa trocha pohral s websocketmi, tak pouzivam len to. mam tak prepojene aj wemos a program, ktory mam v C# a bezi na linuxe.
Dal by som nejaky zakladny kod, ale ja to mam vsetko uz zabudovane v mojom smart home projekte, a vyzobat z toho by zabralo nejaky cas. ale pouzivam tuto kniznicu pre wemos, v prikladoch je aj klient, aj server.
Valdano píše:Mrkněte na jednoduchý příklad web klienta, který je na GitHubu.
Tak jsem s tím klientem narazil na první problém. Přijme se jen jeden paket a je konec, protože tenhle jednoduchej klient neumí refresh, kterej dělá u toho mýho funkčního včerejšího řešení webovej prohlížeč.
Proč mi nemůže všechno chodit hned ?!!
Valdano píše:Ten příklad načte web stránku ze serveru jen jednorázově, ale vy si to samozřejmě můžete upravit tak, že bude načítat stránku opakovaně s nějakým časovým odstupem. Takže poté co budete mít všechna data a server spojení ukončí a tak ukončíte klienta zavoláním client.stop() a zapíšete si třeba pomocí millis() časovou značku. Po uplynutí určité doby znovu zavoláte client.connect atd. a znovu načtete aktuální data z odpovědi serveru...
Příklad úpravy viz níže. Píšu to v rychlosti jen na slepo bez zkoušení a je to jen náznak možné varianty řešení. Tak si případně opravte chyby, které jsem přehlédl.
Kód: Vybrat vše
#define ZADOST 1
#define CTENI 2
#define CEKANI 3
#define TIMEOUT 5000
char server[] = "192.168.1.10";
unsigned long tck;
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");
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;
}
}