Buongiorno a tutti,
ho creato uno sketch per una piccola automazione utilizzando un modulo ESP32 e Telegram.
E' tutto funzionante, però lo vedo a vole poco reattivo.
Capita di avere dei ritardi nel ricevere messaggi o nel leggere l'ingresso, oppure a volte capita di ricevere messaggi doppi dopo una richiesta.
Non so se questo sia dovuto al sistema (ESP32/Telegram) oppure se il mio sketch non è ben ottimizzato.
Grazie a chi mi risponderà
Alessandro
#include <WiFi.h> //libreria per il wifi
#include <WiFiClientSecure.h> //libreria per il wifi
#include <UniversalTelegramBot.h> //libreria per telegram
#include <ArduinoJson.h>
#define WIFI_SSID "xxx" //nome wifi
#define WIFI_PASSWORD "xxx" //password wifi
#define BOT_TOKEN "xxx" //token chatbot telegram
#define CHAT_ID "xxx"
#define uscita_aux 21 //output
#define led_rosso 25 //output
#define sensore_namur 27 //input - sensore NAMUR
int namurState = 0; //memorizzo il valore del NAMUR
int lastNamurState = 0; //memorizzo l'ultimo valore del NAMUR
String chat_id;
boolean mycid = false;
WiFiClientSecure secured_client; //wifi client
UniversalTelegramBot bot(BOT_TOKEN, secured_client); //telegram client
void setup() {
pinMode(uscita_aux, OUTPUT);
pinMode(led_rosso, OUTPUT);
pinMode(sensore_namur, INPUT);
Serial.begin(115200); //inizializzo la seriale (115200 baudrate)
Serial.println(); //debug su seriale
Serial.print("Connetto alla rete wifi "); //debug su seriale
Serial.print(WIFI_SSID); //debug su seriale
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); //connetto al wifi
secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); //connetto a Telegram utilizzando un certificato di sicurezza
while (WiFi.status() != WL_CONNECTED) { //fino a quando il wifi non è connesso attendi
Serial.print("."); //debug su seriale
delay(500);
}
Serial.print("\nWifi connesso. Indirizzo IP: "); //debug su seriale
Serial.println(WiFi.localIP()); //debug su seriale
}
unsigned long t1;
void loop() {
//controllo messaggi
if ((millis() - t1) > 1000) {
t1 = millis();
//verifica di telegram
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages) {
Serial.println("ci sono messaggi");
handleNewMessages(numNewMessages);
handleNewMessages2(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
}
//se ha ricevuto il comando "attiva_namur" vado a verificare lo stato del namur, se il namur cambia stato metto aux HIGH
namurState = digitalRead(sensore_namur);
if (mycid == true) {
if (namurState == HIGH) {
digitalWrite(uscita_aux, HIGH);
}
if (lastNamurState == 0 && namurState == 1 || lastNamurState == 1 && namurState == 0) { //mando un messaggio solo al cambio di stato del namur
lastNamurState = namurState;
bot.sendMessage(chat_id, "RILEVATA ANOMALIA", "");
}
}
if (mycid == false) {
digitalWrite(uscita_aux, LOW);
}
}
void handleNewMessages(int numNewMessages) { //funzione per la gestione della chat telegram
for (int i = 0; i < numNewMessages; i++) {
String chat_id = bot.messages[i].chat_id; //id della chat
String text = bot.messages[i].text; //l'utente invia del testo in chat
String from_name = bot.messages[i].from_name; //chi manda il messaggio
if (from_name == "")
from_name = "Utente non autorizzato"; //utente sconosciuto
if (text == "/menu") { //se il testo ricevuto è /menu visualizzo la lista dei comandi
String welcome = "Menu\n";
welcome += "\n";
welcome += "Lista dei comandi:\n";
welcome += "/stato_in_out\n";
welcome += "/attiva_namur\n";
welcome += "/disattiva_namur\n";
welcome += "/uscita_aux_ON\n";
welcome += "/uscita_aux_OFF\n";
welcome += "/ledrosso_ON\n";
welcome += "/ledrosso_OFF\n";
welcome += "\n";
bot.sendMessage(chat_id, welcome);
}
if (text == "/uscita_aux_ON") { //se il testo ricevuto è uscita_aux_ON attiva manualmente l'uscita aux ***** FUNZIONA SOLO SE ABBIAMO ATTIVATO IL NAMUR *****
bot.sendMessage(CHAT_ID, "aux attivo","");
digitalWrite(uscita_aux, HIGH);
}
if (text == "/uscita_aux_OFF") { //se il testo ricevuto è uscita_aux_OFF disattiva manualmente l'uscita aux
bot.sendMessage(CHAT_ID, "aux disattivato","");
digitalWrite(uscita_aux, LOW);
}
if (text == "/ledrosso_ON") { //se il testo ricevuto è ledrosso_ON allora accendi il LED rosso
bot.sendMessage(CHAT_ID, "Il led rosso è acceso","");
digitalWrite(led_rosso, HIGH);
}
if (text == "/ledrosso_OFF") { //se il testo ricevuto è ledrosso_OFF allora spegni il LED rosso
bot.sendMessage(CHAT_ID, "Il led rosso è spento","");
digitalWrite(led_rosso, LOW);
}
//vado a leggere i GPIO dopo che viene inviata una richiesta "stato"
if (text == "/stato_in_out") {
int stato_aux = digitalRead(uscita_aux);
int stato_led_rosso = digitalRead(led_rosso);
int stato_namur = digitalRead(sensore_namur);
String msg_verde = String(stato_aux);
String msg_rosso = String(stato_led_rosso);
String msg_sensore = String(stato_namur);
bot.sendMessage(CHAT_ID, "aux " + msg_verde, "");
bot.sendMessage(CHAT_ID, "led rosso " + msg_rosso, "");
bot.sendMessage(CHAT_ID, "namur " + msg_sensore, "");
}
}
}
void handleNewMessages2(int numNewMessages){
for (int i = 0; i < numNewMessages; i++){
String text = bot.messages[i].text;
//attivo/disattivo il sensore namur
if (text == "/attiva_namur") {
mycid = true;
chat_id = bot.messages[i].chat_id;
bot.sendMessage(chat_id, "namur attivo", "");
Serial.println("namur pronto");
}
if (text == "/disattiva_namur") {
mycid = false;
chat_id = bot.messages[i].chat_id;
bot.sendMessage(chat_id, "namur disattivato", "");
Serial.println("namur disattivato");
}
}
}