Wemos D1 odesílání dat přes WiFi do Firefoxu.

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Celeron
Příspěvky: 20509
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

Wemos D1 odesílání dat přes WiFi do Firefoxu.

#1 Příspěvek od Celeron »

Mám tady Wemos D1 na kterým je připojeno 6 sond DS18B20. Odladil jsem funkčnost přes Serial monitor. Na začátku se vytisknou adresy sond a pak se po 5 sekundách stále dokola vypisují aktualizované naměřené teploty. To všecko chodí dle mých představ.
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
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
rnbw
Příspěvky: 37416
Registrován: 21 bře 2006, 00:00
Bydliště: Bratislava

#2 Příspěvek od rnbw »

Daj do toho HTML meta refresh.
Uživatelský avatar
Valdano
Příspěvky: 3118
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#3 Příspěvek od Valdano »

Před řádek kde v kódu web serveru zapisujete <html> vložte řádek s hlavičkou a meta refresh třeba pro 5s viz níže. Poté co se stránka v prohlížeči načte a uplyne 5s načte se znovu a tak pořád dokola každých 5s. Při novém načtení stránky prohlížeč kontaktuje znovu web server a ten zapíše do stránky aktuální hodnoty.

Kód: Vybrat vše

client.println("<head><meta http-equiv='refresh' content='5' /></head>");
client.println("<html>");
... atd.
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#4 Příspěvek od pocitujlasku »

to je ale v poriadku. html funguje tak, ze sa posle dotaz na server, on vrati vyslednu stranku a ukonci spojenie.
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.
No vidis, a tak si sa bal
Uživatelský avatar
Celeron
Příspěvky: 20509
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#5 Příspěvek od Celeron »

Tak jsem nakonec použil již dříve funkční měření teplot s přenosem přes W5500 a doplnil ho nastavením WiFi pro ESP8266. Dost dlouho jsem musel lámat příkazy client.print s definicema stylů ale nakonec se povedlo a chodí to podle mých představ. Co mě třeba dalo než jsem přišel na to proč prohlížeče ignorují mezery v textu a že pokud chci mezeru, musí se použít non-breaking space (&nbsp).
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.
Přílohy
ESP8266.jpg
ESP8266.jpg
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
Celeron
Příspěvky: 20509
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#6 Příspěvek od Celeron »

Zkouším tady WiFi klienta na Wemos D1 (ESP8266) a zjišťuju, že jsem asi komunikaci a zobrazení na stránce Firefoxu dělal úplně zbytečně, protože udělat "HTML prohlížeč" na Wemosu je nejspíš absolutní pakárna.
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...
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#7 Příspěvek od pocitujlasku »

preco udp? pozri si websocket, ja to pouzivam. vytvori sa spojenie a pekne medzi sebou si posielas data. ja tam pouzivam json. alebo si pozri mqtt, to je jeden z najpouzivanejsich protokolov pre tieto smart zariadenia.
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.
No vidis, a tak si sa bal
Uživatelský avatar
Valdano
Příspěvky: 3118
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#8 Příspěvek od Valdano »

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.

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);
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#9 Příspěvek od pocitujlasku »

websocket a mqtt ma prave tu vyhodu, ze sa nemusi dotazovat, ale data mu pridu automaticky. Osobne mam rad websocket, lebo tam si mozem posielat aj vacsie data a pekne vo formate napr. json, alebo nejaky svoj vlastny. Stoji za to, sa tomu trocha povenovat.
No vidis, a tak si sa bal
Uživatelský avatar
Valdano
Příspěvky: 3118
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#10 Příspěvek od Valdano »

Řešení, které jsem popsal je relativně jednoduché a může při něm z větší části využít to co už vytvořil. Samozřejmě se může pustit i do bádání a řešit to jinou cestou.
Uživatelský avatar
Celeron
Příspěvky: 20509
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#11 Příspěvek od Celeron »

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!
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
Celeron
Příspěvky: 20509
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#12 Příspěvek od Celeron »

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ě.
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#13 Příspěvek od pocitujlasku »

v principe websocket je len rozsirenie http protokolu. je to klasicky web server s tym, ze po pripojeni mu posles, aby sa prepol na websocket protokol a odosles nejake autorizacne srandy (su na to hotove kniznice v arduine). klasicke http posle data a ukonci spojenie, websocket to spojenie drzi a vies si tak posielat data oboma smermi.
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.
No vidis, a tak si sa bal
Uživatelský avatar
Celeron
Příspěvky: 20509
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#14 Příspěvek od Celeron »

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č.
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
Valdano
Příspěvky: 3118
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#15 Příspěvek od Valdano »

Ten jednoduchý klient žádný refresh sám nedělá tj. opakované načítání je tam potřeba doprogramovat, ale vždyť jsem to už psal viz citace.

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;

  }
}
Naposledy upravil(a) Valdano dne 12 pro 2023, 01:46, celkem upraveno 2 x.
Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“