Skocz do zawartości

Serwer www oraz odczyt parametrów z czujników dla nodeMCU


maykazw

Pomocna odpowiedź

Część, napisałem sobie składaka z różnych tutoriali w internecie i nie mogę dojść do tego dlaczego nie można używać jednocześnie server.handelClient + jakiejkolwiek innej funkcji. (ew pewnie nie umiem tego pogodzić - co jest bardziej prawdopodobne 😄 )

Chciałbym aby  działało to tak: Cały czas sprawdzamy czy wartość czujnika się nie zmieniła + można wejść w dowolnej chwili sprawdzić jaka jest konkretna wartość na tym czujniku. Będzie ich tu kilka ale na te chwile nie mogę tego odpalić przy jednym.. Czy ktoś może mi podpowiedzieć jak to powinno wyglądać ? 
Bez switch_water - działa, jak odkomentuje to przestaje odpowiadać serwer..

 

// Load Wi-Fi library
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

// Replace with your network credentials
const char* ssid     = "Tp-link";
const char* password = "***";

// Set web server port number to 80
ESP8266WebServer server(80);

// Auxiliar variables to store the current output state
int output36State = 0;
// Assign output variables to GPIO pins
const int output5 = 12;

void switch_water() {
   output36State = analogRead(A0);
    if (output36State > 500) { // jeżeli przycisk przejdzie w stan niski
      digitalWrite(output5, HIGH);
    }else{
      digitalWrite(output5, LOW);   // przekaźnik załączy się
    }
}

void setup() {
  Serial.begin(115200);
  // Initialize the output variables as outputs
  pinMode(output5, OUTPUT);
  // Set outputs to LOW
  digitalWrite(output5, LOW);
  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  
  server.begin();
  Serial.println("HTTP server started");
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="{\"soil\": " + String(output36State) + "} ";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
  }

void handle_OnConnect() {
   server.send(200, "text/html", SendHTML());  
}

void loop(){
  server.handleClient();
  //switch_water();
}

 

Edytowano przez maykazw
Link do komentarza
Share on other sites

Ja tam handleclient wywołuję co kilkaset milisekund i też jest płynnie.

Nie ma sensu się napinać na "ciągłą" obsługę www. Zwłaszcza jak informacje z czujnika nie muszą być błyskawicznie.

Zresztą wtedy lepiej użyć Ajax'a i JS

 

Link do komentarza
Share on other sites

Parę lat temu szukałem sposobu jak to zorganizować i niestety poradniki prezentowały tylko proste działanie, to było OK dla jednego czujnika, ale jak chciałem to oglądać na www co robi ESP na bieżąco  to wymyślałem np. odświeżanie co 1s, moduł działał losowo od kilku minut do kilku godzin, a im więcej elementów na stronie tym szybciej umierał, bo robiło się z tego sporo tekstu do wysyłania. Może coś tam z tym poprawili w core przez te lata, ale nie mam już potrzeby sprawdzać. 

Rozwiązaniem było zrobienie tego na Websockets, czyli to co pisze @kostuch, to podobne mechanizmy, WS raczej jest aktualny, zacząłem poszukiwania od Ajax, ale do niczego nie doszedłem w Arduino, a do Websockets znalazłem fajny przykład, szybki kurs youtubowy HTML, JS, CSS na kanale pasja informatyki i zaczęło to mi działać jak chciałem.

Można sobie zrobić dowolny panel sterowniczy, online, nie ma potrzeby podłączania wyświetlacza ani robienia menu. Chcę  mieć DS po numerze i muszę zmienić na nowy? Wystarczy wkleić nowy numer i kliknąć SEND. Ustawić godzinę z palca - jednym suwakiem o zakresie 0-1339.

Screenshot_21.thumb.png.cb461f477eb13149e8959eeb9ec81344.png

W załączniku masz prosty przykład, z OTA i WIFImanager.

 

ESP8266 core3.1.2.zip

Link do komentarza
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

@kaczakat był fajny projekt o nazwie remoteme ale niestety nie jest już wspierany, można było wygenerować kod zarówno serwera jak i klienta. Teraz pewnie jest mnóstwo podobnych kreatorów zwłaszcza powiązanych z mqtt. Dla mnie idealnie by było gdyby kod strony można było zapisać w sekcji nvs espka a nie bezpośrednio w w kodzie

  • Lubię! 1
Link do komentarza
Share on other sites

6 godzin temu, _LM_ napisał:

Dla mnie idealnie by było gdyby kod strony można było zapisać w sekcji nvs espka a nie bezpośrednio w w kodzie

Jaki problem?

Wrzucasz kod strony na partycję littlefs i "serwujesz" tak samo jakby był zaszyty w kodzie.

Link do komentarza
Share on other sites

@_LM_ teraz jest też Tasmota, wiele rzeczy, które potrzebowałem można zastąpić gotowcem, ale znowu trzeba się nauczyć jak to konfigurować, a wszystkie opcje to by była spora biblia, multum osób to opracowuje.

Jest też chatGPT, miałem jedno okienko tekstowe na początku i ciągle odkładałem by się w to zagłębić, jak zrobić ich kilka wierszy, ale z jedną funkcją, tak by sobie zidentyfikowała, z którego okna jest kliknięcie, dokleiła id i komunikat, potem mi jeszcze wytłumaczył jak inkubować i która rasa jest kur znosi najwięcej jajek rocznie. 

Kod strony w ogóle nie musi być w ESP, można sobie go zapisać na dysku i stąd otworzyć, tylko podać numer do IP WS ESP. Miałem też wersję w SPIFF z grafikami, gierka w wisielca z kursu JS, ale zrezygnowałem jak znalazłem opcję "R"rawliteral", bez grafiki też działa OK, ma być astetyczny.

Link do komentarza
Share on other sites

Ja nie jestem biegły w tych sprawach, na swoje potrzeby kopiuję tylko podstawową stronę z ustawieniami wifi a resztę obsługuję w ramach własnych aplikacji i na swoim serwerze mqtt

Link do komentarza
Share on other sites

1 godzinę temu, kaczakat napisał:

Miałem też wersję w SPIFF z grafikami, gierka w wisielca z kursu JS, ale zrezygnowałem jak znalazłem opcję "R"rawliteral"

Ale mając kod strony www na filesystemie możesz go modyfikować po prostu aktualizując pliki .html i .js (po prostu uploadując przeglądarką)

Przy rawliteral  musisz przeprogramować cały kod przez ota/usb. Na dodatek miejsce na program zajmujesz tekstem html. Nie widzę żadnych zalet takiego podejścia.

Link do komentarza
Share on other sites

No właśnie mam doklejone OTA więc i tak to wysyłam online. Najbardziej rozbudowana wersja na razie zajmuje mi 8kB, 1%? Oczywiście na pewnym etapie rozbudowy strony WWW może być to konieczne, jednak nie planuję robić takich wodotrysków, rozdzielać pliki HTML, JS, CSS. Jak potrzebuję oglądać wykresy to wysyłam na serwer HA lub ThingSpeak. Gdyby to zrobić na Atmega328 z shieldem Ethernet to miałoby bardziej sens, bo Atmega nie ma flash do szastania, ale na razie to odpuściłem, ta biblioteka niby to obsługuje, ale w wersji 1.x i chyba tylko jako klient. 

Link do komentarza
Share on other sites

No tak. Przy 8kB nie ma się co przejmować.

Ale wystarczy jakiś png/jpg jako tło strony czy inne fajerwerki i licznik leci do dziesiątek/setek kilo 🙂

Na szczęście jest jeszcze obsługa plików .gz więc można (przynajmniej html) pokompresować.

 

Link do komentarza
Share on other sites

11 minut temu, kostuch napisał:

można (przynajmniej html) pokompresować.

 

jquery po kompresji ma ponad 30k...

 

Link do komentarza
Share on other sites

19 godzin temu, ethanak napisał:

jquery po kompresji ma ponad 30k...

Dlatego nie używam 🙂

Wszystko można przy odrobinie wysiłku zrobić "na piechotę" w js bez wytaczania ciężkiej artylerii.

A już samo potraktowanie .js minimizerem pozwala zaoszczędzić sporo miejsca

Link do komentarza
Share on other sites

To właśnie jest mini 🙂

A takich, co potrafią coś poważniejszego zrobić w czystym przeglądarkowym JS to przeciętny stolarz na palcach jednej ręki pewnie policzy 😞

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.