Ho sperimentato un programma, preso da internet, per cambiare stato a 3 LED da pagina HTML con Mozilla via WiFi verso ESP8266 e Arduino uno.
Risponde bene a 5 comandi poi si blocca.
Ho riscritto lo sketch con gli Array al posto di String ma il problema persiste.
Ho fatto stampare il connectionId ad ogni step e risulta che apre con “Id” 0 e chiude “Id” 0 poi apre con “Id” 1 e chiude con “Id” 1 e così via sino a “Id” 4 poi si blocca.
Ho verificato che effettivamente l’ESP gestisce “Id” da 0 a 4 ma, considerato che c’è un solo client, pensavo che continuasse ad aprire e chiudere con “Id” 0, oppure che dopo aver chiuso “Id” 4 ricominciasse ad aprire con “Id” 0, invece si blocca.
Allego pagina HTML e sketch
Grazie dell'aiuto.
<!DOCTYPE html>
<html>
<head>
<title>ESP8266 LED Control</title>
<script src="jquery-3.4.1.min.js"></script>
<script>
$(document).ready(function(){
$(".led").click(function(){
var p=$(this).attr('id');
$.get("http://192.168.4.1:80/", {pin:p});
});
});
</script>
</head>
<body>
<!-- in the <button> tags below the ID attribute is the value sent to arduino-->
<button id="13" class="led">Toggle ROSSO</button> <!-- button for pin 13-->
<button id="12" class="led">Toggle GIALLO</button> <!-- button for pin 12-->
<button id="11" class="led">Toggle VERDE</button> <!-- button for pin 11-->
</body>
</html
//ESP8266HTML_1
#include <SoftwareSerial.h>
#define DEBUG true
SoftwareSerial esp8266(9,10);//RX,TX
void setup(){
Serial.begin(9600);
esp8266.begin(9600);
pinMode(11,OUTPUT); digitalWrite(11,LOW);
pinMode(12,OUTPUT); digitalWrite(12,LOW);
pinMode(13,OUTPUT); digitalWrite(13,LOW);
sendData("AT+RST\r\n",2000,DEBUG); // resetta modulo
sendData("AT+CWMODE=2\r\n",1000,DEBUG); // configura come access point
sendData("AT+CIFSR\r\n",1000,DEBUG); // ottieni un indirizzo ip
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // configura per connessioni multiple
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // avvia server sulla porta 80
}
void loop(){
if(esp8266.available()) {
if(esp8266.find("+IPD,")){
delay(1000);
int connectionId = esp8266.read()-48;
esp8266.find("pin=");
//Serial.print(Serial.read());
delay(1000);
int pinNumber = (esp8266.read()-48)*10;
pinNumber += (esp8266.read()-48);
Serial.print("pin ="); Serial.println(pinNumber);
digitalWrite(pinNumber, !digitalRead(pinNumber));
String closeCommand = "AT+CIPCLOSE=";
closeCommand+=connectionId;
closeCommand+="\r\n";
sendData(closeCommand,1000,DEBUG);
}
}
}
//Funzione usata per inviare i dati al modulo ESP8266
String sendData(String command, const int timeout, boolean debug){
String response = "";
esp8266.print(command);
long int time = millis();
while((time+timeout) > millis()){
while(esp8266.available()){
char c = esp8266.read();
response+=c;
}
}
if(debug){
Serial.print(response);
}
return response;
}