Skocz do zawartości

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


Pomocna odpowiedź

@PiotrekEl Kwestia1. Zastanawiam sie w jakim celu miałbym wystawiać "na świat" serwer rejestrujący takie wykresy temperatur w domu? 

Kwestia2.  Napisałeś " A jak ktoś się już dostanie do sieci to skanowanie urządzeń/portów trwa bardzo króciutko."

To ja pytam a jeśli ktoś dostanie Ci się do sieci mimo tego, że nie miałeś ustawionego dostępu "ze świata" to co ci to pomoże?

Kwestia3: Widząc na wykresie temperatury przekraczające 28stC, zastanowiłem się czy to nie jest wykres temperatur z fali maksymalnych letnich upałów (jakoś mi ten wykres kwestionuje argumentację, którą z niego wywiodłeś)? Nie wiem jak u kogo ale u mnie temperatury pomieszczeń w sezonie grzewczym zawierają się w widełkach 18-21sC.

Link do komentarza
Share on other sites

33 minuty temu, czeslaw napisał:

@PiotrekEl Kwestia1. Zastanawiam sie w jakim celu miałbym wystawiać "na świat" serwer rejestrujący takie wykresy temperatur w domu?

 

48 minut temu, czeslaw napisał:

Powiedzmy że mamy w domu urządzenia, których wrażliwe parametry chcemy mieć pod kontrolą w czasie gdy jesteśmy poza domem. Co więcej, chcemy mieć zdalną możliwość korygowania pracy tych urządzeń. Wtedy ta zabawa może być naprawdę użyteczna i warta świeczki.

A to jak wystawisz co innego niż temperatury to już nie będzie "niebezpieczne"? To nie ma znaczenia co wystawiasz na świat, sam fakt że wystawiasz na świat dostęp do swojej sieci to ryzyko. I nie zmienia tego stanu rzeczy fakt, że zabezpieczysz to hasłem czy  czymkolwiek innym.

Nie chcę Ci "dopiec" ani nic z tych rzeczy, po prostu uświadomić, że to nie jest bezpieczne mimo zabezpieczeń.

53 minuty temu, czeslaw napisał:

Kwestia2.  Napisałeś " A jak ktoś się już dostanie do sieci to skanowanie urządzeń/portów trwa bardzo króciutko."

To ja pytam a jeśli ktoś dostanie Ci się do sieci mimo tego, że nie miałeś ustawionego dostępu "ze świata" to co ci to pomoże?

Nic mi to nie pomoże ale hasło klucz to "jeśli". Nie mam dostępu z zewnątrz i szansa na to jest nieporównywalnie mniejsza.

37 minut temu, czeslaw napisał:

Nie wiem jak u kogo ale u mnie temperatury pomieszczeń w sezonie grzewczym zawierają się w widełkach 18-21sC.

Żyłem niegdyś w rzeczywistości, w której miałem zimą w mieszkaniu temperatury rzędu 13-17 stopni celsjusza. 17 to już było dla mnie przyjemne ciepło. Mnóstwo ludzi w to nie wierzy jak im czasem opowiadam ale jakoś nie mam potrzeby tego nikomu udowadniać;) Jestem szczęśliwy że teraz mam ciepło i to dość niskim kosztem.

37 minut temu, czeslaw napisał:

Widząc na wykresie temperatury przekraczające 28stC, zastanowiłem się czy to nie jest wykres temperatur z fali maksymalnych letnich upałów

28 to wartość szczytowa, jak popatrzysz dobrze zobaczysz że temperatura oscyluje wokół 26. 6m2 pomieszczenia, dobre ocieplenie, dwa komputery chodzące non stop, człowiek. Tak, to możliwe:)

Link do komentarza
Share on other sites

Witam

Dziekuję autorowi za bardzo czytelny artykuł.

Pozwoliłem sobie przerobić kod , bez wykorzystania  SPIFFS co moim zdaniem mały projekt upraszcza.

Użyłem Wemos D1 mini , który pracuje na esp8266 (jest trochę różnic między esp32)

Kod działa

Arduino kod:

#include "ESP8266WiFi.h"
#include "ESPAsyncTCP.h"
#include "ESPAsyncWebServer.h"
 
const char* ssid = "nazwawifi";
const char* password = "hasło";

#define LED 5                    //numer pinu gdzie mamy podłączoną diodę 
AsyncWebServer serwer(80); //utwórzmy obiekt serwera na porcie 80

String htmlStrona = String("<!DOCTYPE HTML>") + 
    "<html lang='pl'><head>" +
    "<meta charset='utf-8'>" +                  
    "</head>" +
    "<html><body><center>" +
    "<p id='pomiar'>Wartość:</p>" +
    "<button id='on'>Włącz</button>" +
    "<button id='off'>Wyłącz</button><br>" +
    "<script>" +
    "document.getElementById('on').onclick = function () { " +   //po nacisinięciu elementu o ID "on"
        "const zapytanie = new XMLHttpRequest(); " +           //wyślijmy zapytanie GET, pod adresem /on      
       "zapytanie.open('GET', '/on'); " +
       "zapytanie.send(); " +                               
     "}; " +
    "document.getElementById('off').onclick = function () {" +     //po nacisinięciu elementu o ID "off"
        "const zapytanie = new XMLHttpRequest();" +                //wyślijmy zapytanie GET, pod adresem /off   
        "zapytanie.open('GET', '/off');" +
        "zapytanie.send();" +                               
    "};" +
    "</script>" +
    "</body>" +
    "</html>" +
    "\r\n";

void setup() {
  pinMode(LED, OUTPUT);
  //digitalWrite(5, LOW);
  
  Serial.begin(115200);                    //zainicjujmy port szeregowy
  WiFi.begin(ssid,password );                  //połącz z naszą siecią wifi  
  while (WiFi.status() != WL_CONNECTED){   //poczekajmy aż ESP połączy się z naszą seicią 
  delay(1000); //dla ESP8266
  } 
  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(200, "text/html",htmlStrona);           //odpowiedz mu kodem 200, danymi tekstowymi, o treści "Witaj! :)"
  });

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

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

void loop() {
}

 Pozdrawiam

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

Cześć! Świetny artykuł, ma dokładnie to czego chciałem się nauczyć <3.

Proszę czy mógłbyś mnie naprowadzić jak przesłać jakieś dane (np. JSON) i odebrać je na ESP? Tj. w ramach ćwiczenia chciałem zrobić coś takiego, że na stronie internetowej jest text input, którego zawartość zostanie wyświetlona na LCD.

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

Dnia 16.09.2021 o 15:06, daneil737 napisał:

Cześć! Świetny artykuł, ma dokładnie to czego chciałem się nauczyć <3.

Proszę czy mógłbyś mnie naprowadzić jak przesłać jakieś dane (np. JSON) i odebrać je na ESP? Tj. w ramach ćwiczenia chciałem zrobić coś takiego, że na stronie internetowej jest text input, którego zawartość zostanie wyświetlona na LCD.

Jeżeli problem aktualny, można to tego wykorzystać formularze w przypadku np. parametrów jakie chcemy zadać.

Po stronie przeglądarki będzie wyglądać to mniej więcej  tak

       <div id="wifi-settings-display" class="wifi-settings">
                <form id="wifi-settings-form" action="/settings-update" method="GET" target="bg-form">
                    <h2>Sieć WiFi</h2>
                    <input id="ssid" name="ssid" type="text" placeholder="Nazwa sieci"><br>
                    <input id="password" name="password" minlength="8" type="password" placeholder="Hasło"><br>
                </form>
                <button class="save-button">Zapisz</button>
            </div>

id lub parametr name (już dokładnie nie pamiętam) elementów będą wskazywały nazwy wysyłanych parametrów

zaś po stronie ESP mniej więcej tak

server.on("/settings-update", HTTP_GET, [](AsyncWebServerRequest *request)
              {
                  request->send(200);

                  if (request->hasParam("ssid") || request->hasParam("password"))
                  {
                      String wifi_ssid, wifi_pass;
                      wifi_ssid = request->getParam("ssid")->value();
                      wifi_pass = request->getParam("password")->value();
                      update_config("ssid", wifi_ssid);
                      update_config("password", wifi_pass);
                  }                 
              });

odebrane parametry można wpisać do zmiennych, a następnie np. do pliku JSON.

Jeżeli chodzi o typowe przesyłanie plików, nie testowałem tego bo nie miałem potrzeby. Musiałbym to sprawdzić.

Polecam przeanalizować ten przykład. Jest tam z tego co pamiętam również wgrywanie plików.

https://github.com/me-no-dev/ESPAsyncWebServer/blob/master/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino

 

Dnia 6.01.2022 o 14:19, tadek09 napisał:

Witam

Mam problem jak wgrać stronę HTML do SPIFFS.

Gdzie leży problem? Do wgrania konieczne jest utworzenie w projekcie folderu "data" w którym znajdują się pliki do wgrania do SPIFFS.

Link do komentarza
Share on other sites

Dnia 6.01.2022 o 14:19, tadek09 napisał:

Witam

Mam problem jak wgrać stronę HTML do SPIFFS.

Jeśli używasz platformy Arduino to pod załączonym linkiem masz krok po kroku, ludzkim językiem opisany sposób obsługi SPIFFS dla ESP8266 i ESP32. 

Możesz niniejszy projekt zamiast na platformie VSC+platformIO wgrać i uruchomić na platformie Arduino. Mnie Arduino mimo wszystko wydaje się bardziej klarowne.

https://randomnerdtutorials.com/esp8266-web-server-spiffs-nodemcu/

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

- przeczytałem, skopiowałem, poprawiłem dla esp8266 i katalogu DATA, wgrałem pliki do /DATA.

-  uruchomiłem program pod arduino i przegladarkę wg podanego adresu, zaświeciłem LEDem , zgasiłem LED, załadowałem obrazek.

- teraz mam Lene na cały ekran i więcej nic.

- jak odzyskać klawisze i ADC ? bez resetu PC.

Edytowano przez 99teki
Link do komentarza
Share on other sites

2 godziny temu, 99teki napisał:

- przeczytałem, skopiowałem, poprawiłem dla esp8266 i katalogu DATA, wgrałem pliki do /DATA.

-  uruchomiłem program pod arduino i przegladarkę wg podanego adresu, zaświeciłem LEDem , zgasiłem LED, załadowałem obrazek.

- teraz mam Lene na cały ekran i więcej nic.

- jak odzyskać klawisze i ADC ? bez resetu PC.

Czy próbowałeś odświeżyć stronę? Załadowałeś obrazek, znaczy się, pokazuje na cały ekran po pobraniu, czy po dodaniu do kodu?


Wydaje mi się że jednak mały błąd wkradł się do kodu i w tym fragmencie

serwer.on("/download", HTTP_GET, [](AsyncWebServerRequest *request){ //na otrzymane od klienta zapytanie pod adresem "/off" typu GET, 
   request->send(SPIFFS, "/Lenna.png", "image/png", false);           //odeślij odpowiedź w postaci pliku png o nazwie obrazek.png z SPIFFS i umożliwij pobranie    
  });

zamiast

request->send(SPIFFS, "/Lenna.png", "image/png", false);       

powinno być

request->send(SPIFFS, "/Lenna.png", "image/png", true);

 

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

 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){  //na otrzymane od klienta zapytania pod adresem "/" typu GET, 
    request->send(SD, "/index.html", "text/html");         //odpowiedz plikiem index.html z SPIFFS (można to zmienić na kartę SD) 
  
  });

Niestety ale dla wersji NodeMCU (ESP8266) nie przechodzi kompilacji opcja z karta SD:

 

Compilation error: no matching function for call to 'AsyncWebServerRequest::send(SdFat&, const char [12], const char [10])'

 

biblioteka #include "SdFat.h"

 

Chciałbym przetrzymywać strony na karcie SD - ktoś miał podobny problem i sobie poradził?

Link do komentarza
Share on other sites

Dzień dobry, posiadam płytkę Nodemcu v3 i korzystając z tego artykułu napisałem dla niej program, który odczytuje plik html z SPIFFS i wysyła jako odpowiedź do klienta. Program działał poprawnie, ale gdy zamieniłem SPIFFS na kartę SD wyskakuje błąd podczas kompilacji. Oto mój kod:

#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <SD.h>

const char* nazwa = "SSID";
const char* haslo = "HASŁO";
WiFiClient client;
AsyncWebServer serwer(80);

void setup() {
  SD.begin(D8);
  WiFi.begin(nazwa, haslo);
  Serial.begin(9600);
  Serial.println("Łączenie");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(750);
  }
  Serial.println("Połączono");
  if (!SD.begin(D8)) {
    Serial.println("Nie wykryto karty SD");
    return;
  }
  Serial.println("Wykryto karte SD");
  serwer.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SD, "/index.html", "text/html");         
  });                                                             
  serwer.begin();
}

void loop() {
 
}

Oto opis błędów:

Cytat

Arduino:1.8.19 (Windows 10), Płytka:"NodeMCU 0.9 (ESP-12 Module), 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, 4MB (FS:2MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

C:\Users\HP\Documents\Arduino\nodemcu4\nodemcu4.ino: In lambda function:
nodemcu4:29:49: error: no matching function for call to 'AsyncWebServerRequest::send(SDClass&, const char [12], const char [10])'
   29 |     request->send(SD, "/index.html", "text/html");
      |                                                 ^
In file included from C:\Users\HP\Documents\Arduino\nodemcu4\nodemcu4.ino:2:
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:236:10: note: candidate: 'void AsyncWebServerRequest::send(AsyncWebServerResponse*)'
  236 |     void send(AsyncWebServerResponse *response);
      |          ^~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:236:10: note:   candidate expects 1 argument, 3 provided
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:237:10: note: candidate: 'void AsyncWebServerRequest::send(int, const String&, const String&)'
  237 |     void send(int code, const String& contentType=String(), const String& content=String());
      |          ^~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:237:19: note:   no known conversion for argument 1 from 'SDClass' to 'int'
  237 |     void send(int code, const String& contentType=String(), const String& content=String());
      |               ~~~~^~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:238:10: note: candidate: 'void AsyncWebServerRequest::send(AsyncWebServerRequest::FS&, const String&, const String&, bool, AwsTemplateProcessor)'
  238 |     void send(FS &fs, const String& path, const String& contentType=String(), bool download=false, AwsTemplateProcessor callback=nullptr);
      |          ^~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:238:19: note:   no known conversion for argument 1 from 'SDClass' to 'AsyncWebServerRequest::FS&' {aka 'fs::FS&'}
  238 |     void send(FS &fs, const String& path, const String& contentType=String(), bool download=false, AwsTemplateProcessor callback=nullptr);
      |               ~~~~^~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:239:10: note: candidate: 'void AsyncWebServerRequest::send(AsyncWebServerRequest::File, const String&, const String&, bool, AwsTemplateProcessor)'
  239 |     void send(File content, const String& path, const String& contentType=String(), bool download=false, AwsTemplateProcessor callback=nullptr);
      |          ^~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:239:20: note:   no known conversion for argument 1 from 'SDClass' to 'AsyncWebServerRequest::File' {aka 'fs::File'}
  239 |     void send(File content, const String& path, const String& contentType=String(), bool download=false, AwsTemplateProcessor callback=nullptr);
      |               ~~~~~^~~~~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:240:10: note: candidate: 'void AsyncWebServerRequest::send(Stream&, const String&, size_t, AwsTemplateProcessor)'
  240 |     void send(Stream &stream, const String& contentType, size_t len, AwsTemplateProcessor callback=nullptr);
      |          ^~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:240:23: note:   no known conversion for argument 1 from 'SDClass' to 'Stream&'
  240 |     void send(Stream &stream, const String& contentType, size_t len, AwsTemplateProcessor callback=nullptr);
      |               ~~~~~~~~^~~~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:241:10: note: candidate: 'void AsyncWebServerRequest::send(const String&, size_t, AwsResponseFiller, AwsTemplateProcessor)'
  241 |     void send(const String& contentType, size_t len, AwsResponseFiller callback, AwsTemplateProcessor templateCallback=nullptr);
      |          ^~~~
C:\Users\HP\Documents\Arduino\libraries\ESPAsyncWebServer-master\src/ESPAsyncWebServer.h:241:29: note:   no known conversion for argument 1 from 'SDClass' to 'const String&'
  241 |     void send(const String& contentType, size_t len, AwsResponseFiller callback, AwsTemplateProcessor templateCallback=nullptr);
      |               ~~~~~~~~~~~~~~^~~~~~~~~~~
Znaleziono wiele bibliotek w "SD.h"
Wykorzystane: C:\Users\HP\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\SD
Niewykorzystane: C:\Program Files (x86)\Arduino\libraries\SD
exit status 1
no matching function for call to 'AsyncWebServerRequest::send(SDClass&, const char [12], const char [10])'

Byłbym bardzo wdzięczny gdyby ktoś pomógł mi w rozwiązaniu mojego problemu.

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

Próbuję uruchomić funkcję pobierania tekstu "getElementByid i przekazywania jej w postaci zmiennej do programu serwera.

Za wykonanie zadania odpowiada kod (supersvr.ino) :

  server.on("/mycode", HTTP_GET, [](AsyncWebServerRequest * request) { 
 Serial.print ("moj kod: ");
 Serial.println(mycode);   
    request->send(200);    
  });

Oraz kod HTML (index.html):

        function inptext(){
        var mycode = document.getElementById("field").value;        
        document.getElementById("mycode").innerHTML = mycode;
            const zapytanie = new XMLHttpRequest();        
            zapytanie.open("GET", "/mycode");
            zapytanie.send();
}
 

W wyżej zacytowanych kodach  tkwi błąd ponieważ wartość zmiennej "mycode" nie jest przekazywana do programu serwera.

Poniższy zrzut ekranu obrazuje reakcje na wprowadzoną wartość a monitor arduino wskazuje reakcję na klikniecie ale wyświetla tylko znaczek 'x' który jest zadeklarowany w serwerze:

309014427_Zrzutekranu2023-09-16100602.thumb.png.cce8767d3da9f328291c160c8a946420.png

 

Całość kodów:

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


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

#define SSID "xxxxx"   //nazwa sieci
#define PASS "yyyyy"  //haslo sieci

//#define LED 16 //D0         //numer pinu gdzie mamy podlaczona diode
//#define LED 5  //D1
//#define LED 4  //D2
//#define LED 0  //D3
//#define LED 2  //D4
#define LED 14 //D5
//#define LED 12 //D6
//#define LED 13 //D7
//#define LED 15 //D8


#define ADC 0 //    34       //numer pinu adc

String mycode="x";


AsyncWebServer server(80);  //utwĂłrzmy obiekt servera na porcie 80


void setup() {
  Serial.begin(115200);                    //zainicjujmy port szeregowy
  SPIFFS.begin();                          //zainicjujmy system plikow
  pinMode(LED, OUTPUT);                    //ustawmy nasze pin jako wyjscie
  WiFi.begin(SSID, PASS);                  //polacz z nasza siecia wifi
  while (WiFi.status() != WL_CONNECTED) {  //poczekajmy az˝ ESP polaczy sie z nasza siecia
    delay(1000); //dla ESP8266
  }
  Serial.printf("\nAdres IP:");
  Serial.println(WiFi.localIP());  //wypisz adres IP naszego ESP przez port szeregowy

  //tutaj odbywa sie obsluga zapytan
  server.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 (mozna to zmienic na karte SD)
                                                                 //zawierajacym nasza strone bedaca plikem tekstowym HTML
  });

  server.on("/on", HTTP_GET, [](AsyncWebServerRequest * request) { //na otrzymane od klienta zapytanie pod adresem "/on" typu GET,
    digitalWrite(LED, LOW);                                        //zapal diode
    request->send(200);                                            //odeslij odpowiedz z kodem 200 OK
  });

  server.on("/off", HTTP_GET, [](AsyncWebServerRequest * request) { //na otrzymane od klienta zapytanie pod adresem "/off" typu GET,
    digitalWrite(LED, HIGH);                                        //zgas diode
    request->send(200);                                             //odeslij odpowiedz z kodem 200 OK
  });

  server.on("/adc", HTTP_GET, [](AsyncWebServerRequest * request) { //na otrzymane od klienta zapytanie pod adresem "/off" typu GET,
    String wartosc = String(analogRead(ADC));                       //wykonaj pomiar ADC i zapisz do Stringa
    request->send(200, "text/plain", wartosc);                      //odeslij odpowiedz z kodem 200 OK i odczytem z wartością
  });


  server.on("/download", HTTP_GET, [](AsyncWebServerRequest * request) { //na otrzymane od klienta zapytanie pod adresem "/off" typu GET,
    request->send(SPIFFS, "/Lenna.png", "image/png", false);             //odeslij odpowiedz w postaci pliku png o nazwie obrazek.png z SPIFFS i umozliwij pobranie (true)
  });

  server.on("/mycode", HTTP_GET, [](AsyncWebServerRequest * request) { 
 Serial.print ("moj kod: ");
 Serial.println(mycode);   
    request->send(200);    
  });

//    server.on("/mycode, /", HTTP_GET, [](AsyncWebServerRequest * request) {
//    String wartosc = String("moj kod:)+  ")+(mycode);
//    request->send(200, "text/plain", wartosc);     
//  });





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

void loop() {
}

 

<!DOCTYPE html>
<html>

<head>
    <title>Strona</title>
    <meta charset="UTF-8" />
</head>

<body bgcolor="#ccccff">

    <p id="pomiar"><font size=4>Wartość:</p>
    <button id="off"><font color="#008800"><font size=4>Włącz</button>&nbsp;&nbsp;
    <button id="on"><font color="#880000"><font size=4>Wyłącz</button><br><br><br><br>


    <button id="mycode"><font size=4>Kod</button><br>
<input type="text" id="field" />
<input type="submit" value="<-INPUT" onclick="inptext()" />
<div id="mycode"></div>

<br>

    <script>
        function inptext(){
        var mycode = document.getElementById("field").value;		
        document.getElementById("mycode").innerHTML = mycode;
            const zapytanie = new XMLHttpRequest();        
            zapytanie.open("GET", "/mycode");
            zapytanie.send();
}


        document.getElementById("on").onclick = function () {  //po nacisinięciu elementu o ID "on"
            const zapytanie = new XMLHttpRequest();            //wyślijmy zapytanie GET, pod adresem /on      
            zapytanie.open("GET", "/on");
            zapytanie.send();
        };

        document.getElementById("off").onclick = function () {  //po nacisinięciu elementu o ID "on"
            const zapytanie = new XMLHttpRequest();             //wyślijmy zapytanie GET, pod adresem /off   
            zapytanie.open("GET", "/off");
            zapytanie.send();
        };

        setInterval(function () {
            const zapytanie = new XMLHttpRequest();            //wyślijmy zapytanie jak poprzednio
            zapytanie.open("GET", "/adc");
            zapytanie.send();
            zapytanie.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    document.getElementById("pomiar").innerHTML = "Wartość:" + this.responseText;
                }
            };
        }, 500);








    </script>


 </body>
</html>

 

 

 

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

Rozumiem, że jest to zadanie z cyklu: "Znajdź błąd w tym programie".

Odpowiem, po szybkim rzuceniu okiem, pytaniem pomocniczym: w jaki sposób - czy możesz to jeszcze dopisać - ta wartość mycode jest "przekazywana" do kodu serwera?

PS. Drugie pytanie pomocnicze: czy w kodzie programu serwera (Python) jest jakieś miejsce, gdzie zmienna mycode, zainicjalizowana na wartość "x", jest następnie modyfikowana?

Link do komentarza
Share on other sites

@ReniferRudolf

Ad1. No tak...

Ad2 Tak jak napisałem powyżej, powinna być przekazywana przez te dwa kody, zacytowane powyżej.

Pierwszy znajduje się w pliku serwera arduino a drugi w pliku 'index. html' wgranym do spissf. Przypuszczam, że błąd jest w tym drugim zacytowanym kodzie.

Ad3, zmienna tekstowa 'mycode'  o nadanej wstępnie przypadkowej wartości "x" jest zaimplementowana w kodzie serwera. Po pobraniu tekstu przesłanego z formularza html powinna być zastąpiona tym tekstem. Ta wartość nie jest na razie w serwerze modyfikowana.

Edytowano przez czeslaw
  • Lubię! 1
Link do komentarza
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.