Salve a tutti.
Come da titolo sto tentando di collegarmi a Blynk, con i dati di SSID, Password della wifi e token che vengono inseriti dapprima in AP Mode dalla pagina 192.168.4.1 e poi salvati in EEPROM (che sostituirò con una SD nel caso, non vorrei danneggiarla per sovrascritture anche se comunque saranno dati che non verranno sempre modificati.
Il codice funziona così: in un primo momento se non ci sono dati già inseriti in EEPROM, ci sarà una la modalità AP che alla pagina 192.168.4.1 mi farà inserire i dati, fatto questo, al riavvio se ci sono dati già salvati, verranno utilizzati questi per connettersi a Blynk. Inoltre nei 5 secondi iniziali di avvio se premo il pulsante sul pin D7, i dati inseriti in EEPROM verranno cancellati e quindi avrò di nuovo la possibilità di avere l'AP mode, e di inserire nuovi dati.
Il tutto funziona tranne che per l'inizializzazione di Blynk.begin - infatti il codice si ferma a questa, e non va avanti, non riesce a connettersi. Ho provato anche con il metodo Blynk.config(auth) e Blynk.connected. Ma non riesco a stabilire una connessione.
Se provo a collegarmi a blynk con il metodo tradizionale, ovvero così:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char ssid[] = "miossid";
char pass[] = "miapass";
#define BLYNK_AUTH_TOKEN "oD************************7Iz"
void setup(){
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}
non ho assolutamente problemi. Se invece provo a collegarmi come descritto prima, non riesce ad andare avanti rispetto al Blynk.begin(). Questo è il codice:
#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <EEPROM.h>
#include <BlynkSimpleEsp8266.h>
#define buttonPin D7
const char* ssid = "ESP8266-AP";
const char* password = "password";
AsyncWebServer server(80);
void handleForm(AsyncWebServerRequest *request){
if(request->args() > 0){
String SSID_inserita;
String Password_inserita;
String BLYNK_TEMPLATE_ID;
String BLYNK_TEMPLATE_NAME;
String BLYNK_AUTH_TOKEN;
for(uint8_t i=0; i<request->args(); i++){
if(request->argName(i) == "SSID"){
SSID_inserita = request->arg(i);
}
if(request->argName(i) == "password"){
Password_inserita = request->arg(i);
}
if(request->argName(i) == "template_id"){
BLYNK_TEMPLATE_ID = request->arg(i);
}
if(request->argName(i) == "template_name"){
BLYNK_TEMPLATE_NAME = request->arg(i);
}
if(request->argName(i) == "auth_token"){
BLYNK_AUTH_TOKEN = request->arg(i);
}
}
// Stampa i dati inseriti
Serial.println("SSID inserita: " + SSID_inserita);
Serial.println("Password inserita: " + Password_inserita);
Serial.println("BLYNK_TEMPLATE_ID inserita: " + BLYNK_TEMPLATE_ID);
Serial.println("BLYNK_TEMPLATE_NAME inserita: " + BLYNK_TEMPLATE_NAME);
Serial.println("BLYNK_AUTH_TOKEN inserita: " + BLYNK_AUTH_TOKEN);
// Salva l'SSID, la password e le altre variabili nell'EEPROM
int indirizzo = 0;
for (int i = 0; i < SSID_inserita.length(); i++) {
EEPROM.write(indirizzo, SSID_inserita[i]);
indirizzo++;
}
EEPROM.write(indirizzo, '\0');
indirizzo++;
for (int i = 0; i < Password_inserita.length(); i++) {
EEPROM.write(indirizzo, Password_inserita[i]);
indirizzo++;
}
EEPROM.write(indirizzo, '\0');
indirizzo++;
for (int i = 0; i < BLYNK_TEMPLATE_ID.length(); i++) {
EEPROM.write(indirizzo, BLYNK_TEMPLATE_ID[i]);
indirizzo++;
}
EEPROM.write(indirizzo, '\0');
indirizzo++;
for (int i = 0; i < BLYNK_TEMPLATE_NAME.length(); i++) {
EEPROM.write(indirizzo, BLYNK_TEMPLATE_NAME[i]);
indirizzo++;
}
EEPROM.write(indirizzo, '\0');
indirizzo++;
for (int i = 0; i < BLYNK_AUTH_TOKEN.length(); i++) {
EEPROM.write(indirizzo, BLYNK_AUTH_TOKEN[i]);
indirizzo++;
}
EEPROM.write(indirizzo, '\0');
EEPROM.commit();
// Accendi il LED sul pin D4
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
request->send(200, "text/html",
"<html>"
"<head>"
"<style>"
"body {"
"background-color: #F2F2F2;"
"font-family: Arial, sans-serif;"
"text-align: center;"
"}"
"h1 {"
"color: #4A90E2;"
"margin-top: 50px;"
"}"
"</style>"
"</head>"
"<body>"
"<h1>In connessione</h1>"
"</body>"
"</html>"
);
}
else{
request->send(200, "text/html",
"<html>"
"<head>"
"<style>"
"body {"
"background-color: #F2F2F2;"
"font-family: Arial, sans-serif;"
"text-align: center;"
"}"
"h1 {"
"color: #4A90E2;"
"margin-top: 50px;"
"}"
"form {"
"background-color: white;"
"border: 1px solid #BFBFBF;"
"box-shadow: 0px 0px 10px #BFBFBF;"
"border-radius: 10px;"
"margin: 0 auto;"
"padding: 30px;"
"width: 500px;"
"}"
"input[type='text'], input[type='password'] {"
"background-color: #EAEAEA;"
"border: none;"
"border-radius: 5px;"
"font-size: 16px;"
"margin: 10px 0;"
"padding: 10px;"
"width: 100%;"
"}"
"input[type='submit'] {"
"background-color: #4A90E2;"
"border: none;"
"border-radius: 5px;"
"color: white;"
"cursor: pointer;"
"font-size: 16px;"
"margin: 10px 0;"
"padding: 10px 20px;"
"width: 100%;"
"}"
"</style>"
"</head>"
"<body>"
"<h1>ESP32 Web Page</h1>"
"<form action='/' method='post'>"
"<input type='text' name='SSID' placeholder='Nome reti WiFi'>"
"<input type='password' name='password' placeholder='Password'>"
"<input type='text' name='template_id' placeholder='BLYNK_TEMPLATE_ID'>"
"<input type='text' name='template_name' placeholder='BLYNK_TEMPLATE_NAME'>"
"<input type='text' name='auth_token' placeholder='BLYNK_AUTH_TOKEN'>"
"<input type='submit' value='Connetti'>"
"</form>"
"</body>"
"</html>"
);
}
}
void setup() {
Serial.begin(115200);
EEPROM.begin(512);
pinMode(buttonPin, INPUT_PULLUP); // Configura il pin del pulsante come input con pull-up
// Controlla se il pulsante è premuto entro 5 secondi dall'accensione
unsigned long startTime = millis();
while (millis() - startTime < 5000) {
if (digitalRead(buttonPin) == LOW) {
// Se il pulsante è premuto, cancella le stringhe nell'EEPROM
for (int i = 0; i < 512; i++) {
EEPROM.write(i, 0);
}
EEPROM.commit();
Serial.println("Le stringhe nell'EEPROM sono state cancellate.");
break;
}
yield();
}
String SSID_salvata = "";
String Password_salvata = "";
String BLYNK_TEMPLATE_ID_salvata = "";
String BLYNK_TEMPLATE_NAME_salvata = "";
String BLYNK_AUTH_TOKEN_salvata = "";
int indirizzo = 0;
char ch = EEPROM.read(indirizzo);
while (ch != '\0') {
SSID_salvata += ch;
indirizzo++;
ch = EEPROM.read(indirizzo);
}
indirizzo++;
ch = EEPROM.read(indirizzo);
while (ch != '\0') {
Password_salvata += ch;
indirizzo++;
ch = EEPROM.read(indirizzo);
}
indirizzo++;
ch = EEPROM.read(indirizzo);
while (ch != '\0') {
BLYNK_TEMPLATE_ID_salvata += ch;
indirizzo++;
ch = EEPROM.read(indirizzo);
}
indirizzo++;
ch = EEPROM.read(indirizzo);
while (ch != '\0') {
BLYNK_TEMPLATE_NAME_salvata += ch;
indirizzo++;
ch = EEPROM.read(indirizzo);
}
indirizzo++;
ch = EEPROM.read(indirizzo);
while (ch != '\0') {
BLYNK_AUTH_TOKEN_salvata += ch;
indirizzo++;
ch = EEPROM.read(indirizzo);
}
// Rimani nel setup finché non vengono inseriti tutti i dati
while (SSID_salvata == "" || Password_salvata == "" || BLYNK_TEMPLATE_ID_salvata == "" || BLYNK_TEMPLATE_NAME_salvata == "" || BLYNK_AUTH_TOKEN_salvata == "") {
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
server.on("/", HTTP_GET, handleForm);
server.on("/", HTTP_POST, handleForm);
server.begin();
Serial.println("Dati non presenti, collegati a: ");
// Stampa l'indirizzo IP assegnato all'ESP32
Serial.println(WiFi.softAPIP());
Serial.println("per inserire i dati");
delay(1000); // Aggiungi un ritardo per evitare un ciclo infinito troppo veloce
}
// Una volta inseriti tutti i dati, passa alla modalità WIFI_STA e tenta di connettersi alla rete WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(SSID_salvata.c_str(), Password_salvata.c_str());
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connessione alla rete WiFi...");
}
Serial.println("Connesso alla rete WiFi");
char blynk_auth[33];
char blynk_ssid[33];
char blynk_pass[33];
BLYNK_AUTH_TOKEN_salvata.toCharArray(blynk_auth, sizeof(blynk_auth));
SSID_salvata.toCharArray(blynk_ssid, sizeof(blynk_ssid));
Password_salvata.toCharArray(blynk_pass, sizeof(blynk_pass));
// Avvia Blynk
Blynk.begin(blynk_auth, blynk_ssid, blynk_pass);
}
void loop() {
Blynk.run();
}
Ci sto sbattendo la testa, ma non riesco a venire fuori. Grazie per eventuali suggerimenti.
