Otázka:
ESP8266 a webové zásuvky
cocco
2015-11-16 15:10:23 UTC
view on stackexchange narkive permalink

V současné době používám různé operační systémy a zařízení, jako je Raspberry pi, k ovládání světel a dalších věcí přes webové zásuvky. Používám webové zásuvky, protože přidaly podporu v prohlížeči Chrome. Píšu spoustu věcí Javascript pro zábavu. Websockets vám umožňují komunikovat s jiným serverem bez nutnosti opětovného načítání stránky. Je to mnohem lepší než Ajax. Jakmile je připojení otevřeno pomocí webového serveru, mohou data cestovat oběma směry. Žádné zbytečné záhlaví k odeslání. Žádné zbytečné požadavky. Posíláte pouze data, která chcete, a to v obou směrech. A RYCHLE, DAMN RYCHLE.

Například používám Javascript requestAnimationframe k odesílání hodnot RGB (na základě frekvence hudby) lampám připojeným k síti. requestAnimationframe se spustí přibližně při 60 Hz. Ale to není nejvyšší rychlost, vytvořil jsem také některé „webové ovladače“ pro ovládání serva a další věci s událostmi dotyku a myši. V takovém případě se pravděpodobně dotkne přenosových frekvencí 200-300 datových paketů (obvykle používám řetězce kódované JSON) nebo více za sekundu.

Servery Websocket také vysílají, což vám umožňuje například ovládat více lamp RGB na základě hudby, kterou přehráváte, v podstatě z každého moderního zařízení, které má prohlížeč. „Normální“ zásuvky nepoužívám kvůli jednoduché skutečnosti, že ve standardním webovém prohlížeči není podpora pro zásuvky. Potřeboval bych tedy vytvořit vlastní aplikaci pro iOS, vlastní aplikaci pro Windows, vlastní aplikaci pro Android. Řekl jsem, že víme, že webové zásuvky jsou vytvořeny pro rychlou komunikaci mezi více uživateli / více zařízeními / obousměrnou komunikací. A mělo by to být opravdu rychlé, nebo je to k ničemu.

V poslední době mě hodně baví elektronika a MCU, takže jsem vyrobil ještě více lamp a věcí ovládaných z Arduinos, ATtinys a dalších mikrokontrolérů. Jsem v C ++ nový, ale protože píšu Javascriptový kód od minulého století, musím jen mírně upravit staré funkce Javascript, aby mohly běžet v Arduino IDE.

Ale určitě nejsem připraven napsat perfektní knihovnu pro MCU, takže musím použít to, co najdu online.

Zdá se, že do webových zásuvek není mnoho lidí. Testoval jsem 2–3 knihovny Arduino websockets a nemohl jsem je přimět, aby správně fungovaly.

Poslední testovaný ( Links2004) funguje, ale nemohu odeslat 4 desetinná místa řetězec rychlejší než 2krát za sekundu nebo se zhroutí.

Vše, co jsem udělal, bylo přidat tento kód pro testování:

  void onWebsocketMessage (uint8_t * payload) {analogWrite (13 , atoi ((const char *) užitečné zatížení));}  

Kde užitečné zatížení jsou přijatá data.

Problémy, které by mohly zpomalit / crash everything:

  1. Můj kód. Trvá atoi příliš mnoho na provedení?
  2. Můj kód. Je (const char *) obsazení vyplňující paměť?
  3. Samotné lib?

Vím, že paměť CPU nebo cokoli jiného je kvůli tomuto videu to není problém:

https://www.youtube.com/watch?v=8ISbmQTbjDI

Dostává statistiky v reálném čase z řadič na 200–600 Hz.

I když je to superchladič a mohl bych si jen nainstalovat ten „vlastní firmware“, zatím raději zůstanu v Arduino IDE.

Jak opravit webové zásuvky na zařízení ESP8266 používající Arduino IDE?

Nebo mohu z tohoto firmwaru extrahovat pouze část websocket (CNLohr's Video)?

Navrhnout další lib?

I zveřejněno zde, protože používám IDE Arduino. A ESP8266 je na chvíli také součástí světa Arduino. A možná některé ne tak populární webové zásuvky založené na Arduinu fungují také na ESP8266.

Nebylo by hezké ovládat svůj pás ws2812b pomocí webového rozhraní, které ukazuje tento náhled?

http://jsfiddle.net/dgws3usa/5/


links2004 @ github

  1. Síť by měla být v pořádku. Je to relativně drahý směrovač Cisco / Linksys N vzdálený 20 cm / 8 palců od modulu ESP8266.
  2. Naštěstí modul, který používám, je jeden z modulů uvedených v Arduino IDE, MOD-WIFI-ESP8266-DEV, ale mám další s menším počtem GPIO.
  3. Právě jsem si všiml, že jsem to naprogramoval na 80 Mhz místo na 160 Mhz.
  4. Program, který jsem nahrál, se skládá pouze ze základního příkladu serveru WebSocket, navíc s výše uvedeným kódem.
  5. Pokud je problém atoi / je pomalý, jaké jsou další způsoby převodu přijatého pole na řetězec?
  6. Používám obě nejnovější verze Arduino ESP8266 port a arduinoWebSockets. Alespoň si to myslím. Postupoval jsem podle pokynů k instalaci jeden den, než jsem se zeptal na tuto otázku.
  7. Pod havárií mám na mysli při pohybu posuvníku rozsahu, pokud se aktualizuje v reálném čase pomocí addEventListener ('input', function, false) v určitém okamžiku (po 1 s / 3-4 zprávy odeslat / přijmout) přestane odesílat nebo přijímat data. Mimochodem, zdá se, že video, které jste zveřejnili, funguje správně a obsahuje mnohem více kódu. Ten chlap se také aktualizuje v reálném čase s oninput vs 'onchange', který by se aktualizoval pouze tehdy, když uživatel uvolní posuvník.
  8. Myslím, že zatím nemohu použít Serial.setDebugOutput (true); , protože jsem nedostal sériovou komunikaci do provozu. K programování čipu používám levný CH340G.

Japonský příspěvek.

  1. Dělám exatly totéž, ale mnohem jednodušším způsobem. Žádný webový server, žádné ping pongy, žádné sériové věci, nepoužívám složité funkce ke zpracování dat webového serveru. Ačkoli jeho příklad funguje.

  2. Dělá, kódově, mnohem víc než já.

    pro (i = 0; i<4; i ++ ) {mask [i] = client.read ();} byte m_data [data_len]; char data_c [data_len]; Serial.print ("Receive Data ="); for (i = 0; i1-0x30); přestávka; případ 3: data_b = ((data_c [0] -0x30) * 100) + ((data_c 1 -0x30) * 10) + (data_c 2 -0x30); přestávka; } LED_PWM (data_b);

Můj úplný „testovací“ kód:

  #include <Arduino.h>
#include <ESP8266WiFi.h> # include <ESP8266WiFiMulti.h> # include <WebSocketsServer.h> # include <Hash.h>ESP8266WiFiMulti WiFiMulti; WebSocketsServer websocket = WebSocketsServer (81); void webSocketEvent (uint8_t num, typ WStype_t, uint8_t * užitečné zatížení, size_t délka) {spínač (typ ) {case WStype_DISCONNECTED: break; případ WStype_CONNECTED: {IPAddress ip = webSocket.remoteIP (num); }      přestávka; případ WStype_TEXT: analogWrite (13, atoi ((const char *) užitečné zatížení)); // MŮJ KÓD webSocket.broadcastTXT (užitečné zatížení, délka); přestávka; případ WStype_BIN: hexdump (užitečné zatížení, délka); webSocket.sendBIN (počet, užitečné zatížení, délka); přestávka; }} void setup () {pinMode (13, OUTPUT); // MY CODE for (uint8_t t = 4; t>0; t--) {delay (1000); } WiFiMulti.addAP ("ssid", "pass"); while (WiFiMulti.run ()! = WL_CONNECTED) {delay (100); } webSocket.begin (); webSocket.onEvent (webSocketEvent);} void loop () {webSocket.loop ();}  
  1. Normálně píšu kód Javascript. Převod řetězce na číslo nebo naopak je mnohem jednodušší. num = 1; str = 1 + ''; num = str * 1; Takže celé toto binární pole je pro mě relativně nové.

  2. Všimněte si, že zatímco nyní převádím binární pole na int. V budoucnu to musím převést na řetězec, který bude poté analyzován. Něco jako JSON. A tak aktualizujte více kanálů na zprávu.

  3. Na straně klienta, jak jsem řekl, odesílám data opravdu rychle. Pokud tedy na straně serveru není žádný buffer, mohl by to být problém. Řešení je jednoduché: requestanimationframe . Průběžně kontrolujte, zda se vstup změnil. To vám umožní odesílat data každých 16-17ms. Takže 60 Hz. Ani pomalejší, ani rychlejší. To by ale měla být maximální pauza mezi zprávami.

Řekl jsem, že jej nyní přeprogramuji na 160 Mhz a doufám, že existují i ​​jiné způsoby, jak rychleji převést přijatá data, a doufám, že se aktualizace budou týkat mého kódu.


EDIT2

Správně. Seriál funguje. Přeprogramoval ESP8266 na 160 Mhz.

Došlo k chybě, když jsem nastavil Serial.setDebugOutput (true); je:

  LmacRxBlk: 1  

Pokud potřebujete další informace, zeptejte se.

EDIT3

Omlouváme se za pozdní odpověď.

webSocket.broadcastTXT(payload,lenght);

Zdá se, že problémem je vysílání. Mám jen pár minut, takže zatím nemůžu popsat ladicí věci ... Ale udělám to, jakmile budu mít trochu více času.

EDIT4 pro Aditya Tannu

Přidáno

  #include <NeoPixelBus.h> # define pixelCount 16NeoPixelBus strip = NeoPixelBus (pixelCount, 13);  

Uvnitř funkce webSocketEvent

  případ WStype_TEXT: pro (uint8_t i = 0; i<pixelCount; i ++) {strip.SetPixelColor (i, RgbColor (i == (atoi ((const char *) užitečné zatížení)) % pixelCount)? 255: 0,0,0) // Potřebuji umístit výše uvedené mimo smyčku. // nefunguje, pokud tak učiním);} strip.Show (); break;  

HTML JS

  var ws, form; function msg (a) {console.log (a);} window.onload = function () {form = document. getElementById ('form'); // změna ws = new WebSocket ('ws: // IPNUMBER: PORT'); // změna ws.onopen = function () {ws.send ('0'); }; ws.onmessage = zpráva; form.addEventListener ('input', function () {ws.send (this.firstChild.value) // firstchild is the range}, false);}  

vid, používám převodník logické úrovně z 3,3 na 5v: pca9306.

EDIT 5 pro Links2004

Myslím, že bych měl přepracovat příklady. Vypadá to, že většina uživatelů tomu dobře nerozumí.

Nono. V určitém okamžiku musíte stejně vyslat zpět aktuální polohu.

Je nám líto. Zapomněl jsem znovu otestovat ladění. Ale víme, že je to vysílání. Potřebujeme odeslat zpět data pouze v případě, že není příliš velký provoz.

Jeden odpovědět:
Aditya Tannu
2015-12-02 10:35:52 UTC
view on stackexchange narkive permalink

Pokusil jsem se implementaci Charlese Lohra přenést na esp8266 / Arduino. Počáteční pracovní verze je nahoře: https://github.com/AdySan/ESPSocket

Jsem schopen získat ~ 150 Hz bez jakýchkoli odpojení nebo zhroucení. Budu na tom pokračovat, abych přidal další funkce a doufejme, že zrychlím.



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...