Skocz do zawartości

Tworzenie interfejsu sieciowego z wykorzystaniem ESP - część 1


Pomocna odpowiedź

@czeslaw  Na start spróbuj ten fragment

#include <Arduino.h>
#include <WiFi.h>  
#include <SPIFFS.h> 
#include <ESPAsyncWebServer.h>

zmienić na ten

#include <Arduino.h>
#include <ESP8266WiFi.h>  
#include <FS.h> 
#include <ESPAsyncWebServer.h>

i ponowić próbę kompilacji, nie ma konieczności pobierania tych pakietów. Kompilacja powinna się odbyć bez problemu, o ile masz już zainstalowaną bibliotekę ESPAsyncWebServer.h

Jeżeli dalej problem wystąpi sprawdź w zakładce "Platforms" czy masz Espressif 8266

obraz.thumb.png.1091813196072ce7e5ae065906ff7fb9.png

Link to post
Share on other sites

Espressif8266 jest.

Tym razem kompilacja przebiegła bez komunikatów o błedach. I układ został zaprogramowany. 

Tym niemniej ESP nie startuje. Nie otwiera adresu strony ktory (nie wiem czy prawidłowo) wpisałem w linii 19 pliku. 

#include <Arduino.h>
#include <ESPAsyncWebServer.h>
#include <ESP8266WiFi.h>  
#include <FS.h> 


#define SSID "TP-LINK_XXX"      //nazwa sieci
#define PASS "S2B4D38H7PXXX"   //hasło sieci
#define LED 22                    //numer pinu gdzie mamy podłączoną diodę

AsyncWebServer serwer(80); //utwórzmy obiekt serwera na porcie 80

void setup() {
  Serial.begin(115200);                    //zainicjujmy port szeregowy
  SPIFFS.begin();                          //zainicjujmy system plików
  pinMode(LED, OUTPUT);                    //ustawmy naszeg pin jako wyjście
  WiFi.begin(SSID, PASS);                  //połącz z naszą siecią wifi  
  while (WiFi.status() != WL_CONNECTED){}  //poczekajmy aż ESP połączy się z naszą seicią 
  Serial.printf("\nAdres IP:192.168.1.159");
  Serial.println(WiFi.localIP());          //wypisz adres IP naszego ESP przez port szeregowy

  //tutaj odbywa sie obsługa zapytań
  serwer.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ //na otrzymane od klienta zapytania pod adresem "/" typu GET, 
    request->send(SPIFFS, "/index.html", "text/html");         //odpowiedz plikiem index.html z SPIFFS (można to zmienić na kartę SD) 
                                                               //zawierającym naszą stronę będącą plikem tekstowym HTML
  });

  serwer.on("/on", HTTP_GET, [](AsyncWebServerRequest *request){ //na otrzymane od klienta zapytanie pod adresem "/on" typu GET, 
    digitalWrite(LED, LOW);                                      //zapal diodę
    request->send(200);                                          //odeślij odpowiedź z kodem 200 OK 
  });

   serwer.on("/off", HTTP_GET, [](AsyncWebServerRequest *request){ //na otrzymane od klienta zapytanie pod adresem "/off" typu GET, 
   digitalWrite(LED, HIGH);                                        //zgaś diodę
   request->send(200);                                             //odeślij odpowiedź z kodem 200 OK          
  });

  serwer.begin();                          //zainicjujmy nasz serwer 
} 

void loop() {
}

 

Zrzut ekranu (79)_LI.jpg

Edytowano przez czeslaw
Link to post
Share on other sites
(edytowany)

@czeslaw  Kod sam zwraca adres IP urządzenia, ty do kodu go nie wprowadzasz (aczkolwiek jest to możliwe). Musisz uruchomić port szeregowy po uruchomieniu ESP, wtedy pojawi się w nim adres IP ESP który musisz wprowadzić do paska przeglądarki. Możliwe że po otwarciu portu szeregowego będzie konieczne wciśniecie "RESET" na posiadanej płytce aby otrzymać adres.
Port szeregowy możesz otworzyć po wciśnięciu tejże "wtyczki"

obraz.thumb.png.6f09bc44ce2efe1dbc485e1cd0952cd4.png

Możliwe że domyślnie uruchomiony zostanie on z inną prędkością baud niż jest w kodzie.

Masz wtedy dwie opcje najłatwiejsze opcje (wybierasz jedną z nich):

1. Zmienić w kodzie baud rate w funkcji Serial.begin() na 9600

  Serial.begin(9600);                    

2. Dodać w pliku projektu platformio.ini poniższą linijkę

monitor_speed = 115200

 

 

Edytowano przez AlcoMatt
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@czeslaw  Jeżeli używasz kodu który korzysta z zewnętrznych plików .html tak jak to przedstawiłem w dalszych przykładach (tak widzę z Twoich poprzednich postów), a nie "stworzyłeś" partycji SPIFFS, może to skutkować błędem. W takiej sytuacji program nie ma skąd pobrać pliku .html
Pierwszy przykład który przedstawiłem korzysta wyłączenie z kodu programu. Jeżeli zaczniesz od niego, unikniesz potencjalnych problemów.
 

#include <Arduino.h>
#include <ESP8266WiFi.h>  
#include <FS.h> 
#include <ESPAsyncWebServer.h>

#define SSID "nazwa sieci"
#define PASS "hasło sieci"

AsyncWebServer serwer(80); //utwórzmy obiekt serwera na porcie 80

void setup() {
  Serial.begin(9600);                    //zainicjujmy port szeregowy
  WiFi.begin(SSID, PASS);                  //połącz z naszą siecią wifi  
  while (WiFi.status() != WL_CONNECTED){}  //poczekajmy aż ESP połączy się z naszą seicią 
  Serial.printf("\nAdres IP:");
  Serial.println(WiFi.localIP());          //wypisz adres IP naszego ESP przez port szeregowy

  //tutaj odbywa sie obsługa zapytań
  serwer.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ //na otrzymane od klienta zapytanie pod adresem "/" typu GET, 
    request->send_P(200, "text/plain", "Witaj! :)");           //odpowiedz mu kodem 200, danymi tekstowymi, o treści "Witaj! :)"
  });

  serwer.begin();                          //zainicjujmy nasz serwer 
} 

void loop() {
}

Z jakiegoś powodu w ESP uruchamia się watchdog. Wiem że ESP8266 miało tą przypadłość, że jeżeli kod był "zbyt pusty", to uruchamiał się watchdog.

Dlatego w sekcji void loop() spróbuj dodać krótkie opóźnienie

void loop() {
  delay(100); //100ms
}

 

Cytat

Opcja nr2 nie zadziałała.

Widzę że masz otwarte dwa projekty, możliwe że edytowałeś plik .ini złego projektu. Osobiście preferuję pracować na baud 115200.

 

43 minuty temu, czeslaw napisał:

Aktualnie program startuje ale nie widzę nigdzie adresu do przeglądarki. Jak program generuje  adres IP serwera ESP?

Kod wypisuje adres IP na podstawie dwóch linii

  Serial.printf("\nAdres IP:");
  Serial.println(WiFi.localIP());         

Pierwsza linia powinna wypisać w porcie szeregowym "Adres IP:" zaś druga już sam adres, co w rezultacie powinno dać przykładowo "Adres IP: 192.168.1.100". Sam zaś adres jest zazwyczaj przydzielany przez router automatycznie, możesz poczytać o DHCP. Tak samo jak np. podłączysz telefon do sieci WiFi, to router automatycznie mu przydziela jakiś adres w sieci lokalnej, aczkolwiek można to też zrobić ręcznie.

Link to post
Share on other sites

@AlcoMatt

Wróciłem do poczatku kursu wpisując do projektu pierwszy Twój załączony plik.

Skutek podobny jak poprzednio. startuje WDT, wpisanie zwłoki pod void nic nie daje. Adresu IP brak.

 

Zrzut ekranu (86).png

Edytowano przez czeslaw
Link to post
Share on other sites
(edytowany)

@czeslaw Już widzę, poniższy fragment kodu uruchamia watchdoga w ESP8266

while (WiFi.status() != WL_CONNECTED){}

Fragment ten jest pętlą która czeka na połączenie do sieci WiFi. U mnie jest ona pusta, więc watchdog się uruchamia, wprowadzenie do niej opóźnienia rozwiąże problem.

while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
}

 

Edytowano przez AlcoMatt
Link to post
Share on other sites

Teraz jest taki efekt jak na zrzucie ekranu. Zresztą ruter też nie rejestruje polaczenia z ESP - ani mac ani IP. Reset na płytce dodaje w terminalu po kilka niestandatowych znaków ASCII co widać na najniższej linii tekstu.

Zrzut ekranu (87).png

Link to post
Share on other sites

@czeslaw  Znalazłem ESP8266 w moich zasobach i uruchomiłem kod po tych modyfikacjach bez problemu (czyli zmianie nazw bibliotek + dodaniu opóźnienia w fragmencie oczekiwania na połączenie). Po kilku sekundach pojawia się adres, zaś ESP działa bez zarzutów

obraz.thumb.png.f19f2245da2adb2a2c889a9d3b1ae58c.png

Mogę bez problemu się połączyć

obraz.thumb.png.81f4940ea7fd537e859415a818b5f3a3.png

To normalnie że po uruchomieniu pojawiają się "śmieci". Musisz zweryfikować czy podajesz dobrą nazwę sieci oraz hasło. Być może z innych powodów nie chce się łączyć z siecią i wynika to z ustawień sieci. Dla pewności poniżej masz kod który już działa.

#include <Arduino.h>
#include <FS.h>
#include <ESP8266WiFi.h>  
#include <ESPAsyncWebServer.h>

#define SSID "nazwa sieci"
#define PASS "hasło"

AsyncWebServer serwer(80); //utwórzmy obiekt serwera na porcie 80

void setup() {
  Serial.begin(9600);                      //zainicjujmy port szeregowy
  WiFi.begin(SSID, PASS);                  //połącz z naszą siecią wifi  
  while (WiFi.status() != WL_CONNECTED){
    delay(1000);						   //poczekajmy aż ESP połączy się z naszą seicią 
  }  
  Serial.printf("\nAdres IP:");
  Serial.println(WiFi.localIP());          //wypisz adres IP naszego ESP przez port szeregowy

  //tutaj odbywa sie obsługa zapytań
  serwer.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ //na otrzymane od klienta zapytanie pod adresem "/" typu GET, 
    request->send_P(200, "text/plain", "Witaj! :)");           //odpowiedz mu kodem 200, danymi tekstowymi, o treści "Witaj! :)"
  });

  serwer.begin();                          //zainicjujmy nasz serwer 
} 

void loop() {
}

 

Więcej już nie umiem pomóc od tego momentu.
 

 

Link to post
Share on other sites

Plik mam dokładnie taki jak Twój. Nazwa sieci i hasło OK. Dla układów ESP zaprogramowanych pod LUA i które aktualnie pracują w sieci WIFI - mam zdefiniowane w ruterze przekierowania na zewnętrzny adres IP rutera. Ale to chyba nie może mieć związku z problemem? Być może podstawiłem niewłaściwą płytkę ESP, albo niewłaściwą bibliotekę. Spróbuję zdefiniować od nowa nowy projekt jak odpocznę od tego parę dni. 

A nawiasem mówiąc w LUA brakowało mi funkcji automatycznego odświeżania wartości parametrów w serwerze na przeglądarce. Dzięki twojemu tematowi zauważyłem, że można to robić przy pomocy Websocket. Platforma LUA ma jakiś.

 

Edytowano przez czeslaw
Link to post
Share on other sites

Drażąc temat komunikacji pomiędzy serwerem ESP a przegladarką pojawia sie kwestia adresu IP. Zakładając że w lokalnej sieci WI-FI chcemy postawić wiele takich serwerków na ESP. Jak te losowo generowane adresy ogarniemy? Jak to zafunkcjonuje po zresetowaniu rutera albo poszczegolnych plytek ESP? Czy te adresy sie nie pozmieniają? Jesli tak to taka idea jest do d... Przepraszam jesli pytanie jest głupie. Ja ze swoimi serwerkami postawionymi na platformie LUA esp poszedłem w odwrotną stronę, czyli na każdym ESP zadałem indywidualny adres IP oraz port. A w platformie arduino nie można tak zrobić?

Link to post
Share on other sites
32 minuty temu, czeslaw napisał:

A w platformie arduino nie można tak zrobić?

A dlaczego niby nie można? Jest taka metoda WiFi.config(), warto poczytać sobie dokumentację zanim się zada jakieś dziwne pytanie.

33 minuty temu, czeslaw napisał:

Jak te losowo generowane adresy ogarniemy?

Np. odwołując się przez nazwę[1] - np. do ustawień mojego miernika na ESP32 wchodzę poprzez adres http://miernik.local

37 minut temu, czeslaw napisał:

Jak to zafunkcjonuje po zresetowaniu rutera albo poszczegolnych plytek ESP? Czy te adresy sie nie pozmieniają?

A dlaczego miałyby się zmienić? Serwer DHCP (w tym przypadku router) stara się przypisać każdemu adresowi MAC ten sam adres który miał poprzednio. A adresów MAC chyba nie zmieniasz?

---

[1] Dotyczy systemów operacyjnych umiejących rozwiązywać nazwy mDNS. Niestety, nie Windows (przynajmniej bez instalowania dodatkowego softu) i nie Android (a ten to chyba długo nie).

Link to post
Share on other sites

No cóż, autor zapowiedział część drugą. Jest też istotna kwestia widoczności tego naszego serwera spoza lokalnej sieci (chociaż sądząc po zainteresowaniu forumowiczów tematem a raczej jego braku, nie zdziwiłbym się gdyby zrezygnował z dalszej publikacji).

Link to post
Share on other sites
26 minut temu, czeslaw napisał:

Jest też istotna kwestia widoczności tego naszego serwera spoza lokalnej sieci 

A co to ma wspólnego z tematem artykułu?

Link to post
Share on other sites

@ethanak "warto poczytać sobie dokumentację zanim się zada jakieś dziwne pytanie."

Bardzo dobra, mądra rada. Czyli idź i sobie poczytaj, nie zadawaj tutaj głupich pytań. Dobra to jest rada ale dla profesjonalistów raczej, nie dla amatorów ( takich jak ja) . A amator, ktory sobie próbuje coś zdłubać z natury rzeczy bazuje na gotowcach czyli na przykładach kompletnych, które działają, które moze sobie nastepnie probować modyfikować, ucząc sie na nich i nie siedzieć calymi dniami nad dokumentacjami, githubami itp i szukaniem w necie nie wiadomo czego (od tym względem łatwiej jest pod platformą NodeMCU custom builds (nodemcu-build.com) bo ten pakiet biblioteczny jest w jednym miejscu).

 

 

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.