Go Down

Topic: ESP8266 wi-fi client e server in contemporanea  (Read 238 times) previous topic - next topic

voidbrain

Ciao a tutti,
sto cercando di inviare e ricevere dati via wi-fi, il problema è che il server ESP non risponde quando aggiungo la parte del client (mentre risponde correttamente se commento il codice)

Da quello che capisco è il problema di watchdog timeout, quindi credo la soluzione sia usare delay() e/o wdtDisable() ma non capisco come dovrei modificare il codice.

L'idea è di usare l'ESP come "modem" di un Arduino quindi dovrebbe chiamare un server web (a) e rispondere a chiamate da internet (b), non appena siano disponibili dati forniti da Arduino (a) o dal web (b)

Grazie mille

Code: [Select]



#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const int httpPort = 80;
const char* ssid     = "ssid";
const char* password = "password";
ESP8266WebServer server(80);
WiFiClient client;
const char* host = "www.test.com";
char* url = "";
String str;

void setup() {
    Serial.begin(74880);   
    WiFi.disconnect(); // Disconnect AP
    WiFi.mode(WIFI_STA); 
    WiFi.begin(ssid, password); // Connect to WIFI network

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println(".");
    }
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
 
    server.on("/endpoint", handleWebToArduinoRequests);
    server.begin(); // Start HTTP server
    Serial.println("HTTP server started.");

    //ESP.wdtDisable(); // try #1
    // while(1);        //
}
 
void loop() {   
    server.handleClient();
   
 
    client.stop();
    if (!client.connect(host, httpPort)) {
        // delay(0); // try #2
        Serial.println("connection failed");
        return;
    }
   
    String msg = "";
    while(Serial.available()==0) {
      // delay(0); // try #2
    }
    msg = Serial.readString();
    Serial.println(msg);

    Serial.print("Requesting URL: ");
    char* fullurl = strcat("/temp/grover/ajax/moduli/api/redneck/endpoint?", msg.c_str());
    Serial.println(fullurl);
    client.print(String("GET ") + fullurl + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
   
    client.println("Connection: close");
    client.println();
    int timeout = millis() + 5000;
    while (client.available() == 0) {
        // delay(0); // try #2
        if (timeout - millis() < 0) {
            Serial.println(">>> Client Timeout !");
            client.stop();
            return;
        }
        String line = client.readStringUntil('\r');
        Serial.print(line);
    }
    Serial.println();
    Serial.println("closing connection");
}

void handleWebToArduinoRequests() {
    // delay(0); // try #2
    String message = "";
    for (int i = 0; i < server.args(); i++) {
        message += server.argName(i) + ": " + server.arg(i) + "\n";
    }
    Serial.println(message);
    server.send(200, "text/plain", message);       //Response to the HTTP request
}


SukkoPera

Un'architettura del genere mi sembra un po' insensata, spiega meglio cosa vuoi fare, innanzitutto.

E poi, se proprio vuoi fare così, ogni quanto sto client si deve connettere?
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

voidbrain

#2
Apr 20, 2018, 10:26 pm Last Edit: Apr 20, 2018, 10:34 pm by voidbrain
Arduino controlla delle sonde e delle pompe;
periodicamente, diciamo ogni ora, deve effettuare delle letture, eventualmente avviare per tot secondi le pompe, quindi inviare ad una pagina web le letture, ecco perché la parte client.

in più da web vorrei poter interrogare le sonde o eventualmente accendere spegnere le pompe.

Perché dici insensata?

voidbrain

inizialmente mi ero orientato sull'usare l'esp come slave e comandarlo da arduino con comandi AT (master-slave) ma solo dopo aver ricevuto il primo nodemcu e aver iniziato i test coi primi sketch ho capito che (in teoria) ho sovrascritto il framework AT con quello arduino, perdendo la capacità di esp di rispondere ai comandi AT.

Quindi ho optato per una logica "peer to peer", usando l'ide Arduino su entrambi e provando a farli comunicare sulla serial.

Ho anche provato a reinstallare il framework AT sul node ma ho risolto solo di aver brasato il boot loader (credo).  :smiley-confuse:

SukkoPera

#4
Apr 21, 2018, 11:37 am Last Edit: Apr 21, 2018, 11:40 am by SukkoPera
Non credo che tu possa avere sovrascritto il bootloader, non so nemmeno se ci sia e se sia modificabile! Se vuoi usarlo come "modem" per Arduino devi assolutamente rimetterci il firmware AT, basta un adattatore seriale/USB.

Ma se non hai bisogno di troppi pin puoi usarlo anche in standalone, funziona molto bene.

Continuo a non capire a che serve la parte client. Non puoi far sì che sia "la pagina web" a collegarsi ad Arduino per estrarre i dati? Comunque, se lo devi fare una volta ogni tanto non dovrebbe essere un grosso problema, tieni solo presente che in quell'attimo le connessioni in entrata dovranno aspettare.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

voidbrain

uno dei miei ultimi acquisti è l'FT232RL FTDI USB a TTL ( https://www.amazon.it/gp/product/B01C2P9GD2/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1 ) a questo punto devo capire dove trovare e come rimettere il firmware AT ( ricordo che ero un po' impazzito nel capire quale fosse quello giusto e visto che non ci son riuscito..)

Ho un paio di nodeMCU quindi posso testare senza paura.

Voglio controllare 3/4 sonde, un relè e un paio di motori per nodo + alcune altre sonde e motori, a monte.
Nel progetto finale i nodi sarebbero 4 oppure 8, ho fatto i conti dei pin... ed ecco perché ho puntato subito sull'Arduino Mega e relegato ESP solo a modem.

Quote
Continuo a non capire a che serve la parte client. Non puoi far sì che sia "la pagina web" a collegarsi ad Arduino per estrarre i dati?
Ho dovuto ragionare un po' su questo punto, non mi era venuto in mente questo scenario: preferirei essere avvertito da Arduino nel momento in cui fa un intervento, invece di interrogarlo per chiedergli "cos'hai fatto in questo tempo?" ...
Mi fa sentire più "sicuro" nel caso una lettura sia sballata o manchi di intervenire... etc, ma in effetti la cosa sembra funzionare anche così (e non mi vengono in mente controindicazioni se non che, in caso di disastri, me ne accorgo al massimo dopo un'ora).
Dovrei calcolare i tempi per essere sicuro di aver già fatto letture e interventi prima della chiamata e girare il codice per memorizzare letture e interventi fino alla prossima richiesta, poi svuotare e ricominciare.

Resta il fatto che la soluzione migliore sarebbero i comandi AT?

SukkoPera

Non lo so, devi contare tu esattamente quanti pin ti servono e vedere se un NodeMCU può bastare da solo.

Se fai solo da server puoi fare la richiesta anche più spesso di una volta all'ora.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

voidbrain

Penso che seguirò due strade, Arduino + esp solo server
E
Arduino + esp at command

Posso seguire questo tutorial per l'AT firmware?
https://www.google.it/amp/www.instructables.com/id/ESP8266-Firmware-Upgrade/%3famp_page=true
Grazie

SukkoPera

Non so, io ho scritto la mia guida (vedi firma), ma la parte Windows è mancante.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

voidbrain

Avevo guardato la tua guida ma non ricordavo spiegassi anche come gestire l'at firmware, quel giorno ero concentrato sul problema della porta seriale e evidentemente non l'ho notato.

Grazie, ora me la riguardo subito.

PS: ho un mac :smiley-twist:

voidbrain

#10
Apr 21, 2018, 07:05 pm Last Edit: Apr 22, 2018, 01:27 am by voidbrain
allora.. seguendo la tua guida, al comando esptool.py flash_id ottengo
manifacturer: ef
device: 4016

quindi pensando andasse bene uno spudorato copia incolla del tuo esempio (modificando solo la porta)

esptool.py --port /dev/tty.usbserial-A5XK3RJT write_flash \
   0x00000 'boot_v1.5.bin' \
   0x01000 512+512/user1.1024.new.2.bin \
   0x3fc000 esp_init_data_default.bin \
   0x7e000 blank.bin \
   0x3fe000 blank.bin \
   -fs 32m -fm dio -ff 40m

La procedura di scrittura va a buon fine, ma poi il led del NodeMCU resta fisso acceso e la porta stampa caratteri non riconosciuti (non so con che frequenza, penso di averle provate tutte), è sicuramente un fatal ma qui mi blocco... (ho provato anche la ver 2 ma niente)

voidbrain

Finalmente funziona: scaricando la versione 1.6.1 dell' ESP AT ( https://www.espressif.com/en/products/software/esp-at/resource ) e adattando la stringa

esptool.py --port /dev/tty.usbserial-A5XK3RJT write_flash \
   0x00000 'boot_v1.7.bin' \
   0x01000 at/1024+1024/user1.2048.new.5.bin \
   0x3fc000 esp_init_data_default_v08.bin \
   0xfe000 blank.bin \
   0x3fe000 blank.bin \
   -fs 32m -fm dio -ff 40m

Non dà errori e risponde ai comandi AT !!! Gioia

Go Up