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
#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
}
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?
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?
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).
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.
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.
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?
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.
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
Non so, io ho scritto la mia guida (vedi firma), ma la parte Windows è mancante.
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
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)
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