Salve a tutti;
Per prima cosa voglio augurare a tutto il forum un buon fine anno e un felice 2020.
Dunque, come da oggetto ho realizzato un cronotermostato utilizzando un esp8266-01s, un stm32f103c8t6 e un display lcd5110 e questo e lo sketch relativo a esp8266-01s:
/*
Name : TelegramBot.ino
Nome BOT telegram : CronoTermo
Creato : 17/12/2019
Autore : Amedeo Di Vito <amedeodivito@gmail.com>
Librerie : CTBot V 1.40, arduinojson (Versione 5.13.5 con versioni superiori non funziona)
Hardware : esp8266-01s - stm32f103c8t6 - display lcd5110
Descrizione : esempio di come funziona
1) riceve un messaggio
2) se riceve un comando valido lo esegue e lo notifica al mittente
3) altrimenti invia un messaggio al mittente con la spiegazione dei comandi
4) 2 utenti abilitati, ma se ne possono aggiungere altri
*/
#include "CTBot.h"
#include <Esp.h>
#define LED 2
#define LOOP 5
CTBot myBot;
uint32_t amedeo = mia id; // la tua ID di aministratore del BOT
uint32_t daniela = altra id; // la tua ID di utente abilitato
String ssid = "ssid"; // la ssid della rete Wi-Fi
String pass = "password"; // la password della rete Wi-Fi
String token = "token del BOT"; // sostituire con il proprio token
String comando;
String dati;
byte verifica = LOOP; // loop prima della verifica
char *emoticon;
void setup() {
delay(1000);
Serial.begin(115200);
pinMode(LED, OUTPUT);
ESP.wdtDisable(); // disabilita SW WDT
lampeggia(20); // il led esp8266 lampeggia n volte
myBot.wifiConnect(ssid, pass); // connessione alla rete Wi-Fi
myBot.setTelegramToken(token); // imposta il token di telegram
}
void loop() {
emoticon = " \xE2\x9C\x85"; // OK // reimposta emoticon di default
TBMessage msg; // variabili contenenti i dati del messaggio
chkSerial(msg.sender.id); // verifica disponibilita nuovo messaggio seriale da stm32f103c8t6
if (LOOP == verifica) { // dopo 10 loop verifica la connessione
verifica = 0;
testConnessione();
}
// se arriva un nuovo messaggio...
if (myBot.getNewMessage(msg) &&
( msg.sender.id == amedeo ||
msg.sender.id == daniela ))
{
comando = msg.text.substring(0, 4); // divide il comando dai dati
dati = msg.text.substring(4, msg.text.length());
if (comando == "/inf" ||
comando == "/acc" ||
comando == "/spe" ||
comando == "/tem" ||
comando == "/led" ||
comando == "/ora") {
Serial.println(msg.text); // invia il comando
}
else if (comando == "/hel") help(msg.sender.id); // invia la lista dei comandi
else {
emoticon = "\xE2\x9A\xA0"; // emoticon HELP
dati = "Ciao " + String(msg.sender.firstName) + ";\nMemoria disponibile: " + String(ESP.getFreeHeap()) + "\nPer la lista dei comandi:\nPREMI \"/help\" " + emoticon;
myBot.sendMessage(msg.sender.id, dati); // notifica i comandi al mittente
}
}
delayMicroseconds(500000);
yield();
ESP.wdtFeed(); // alimenta il watchdog
verifica++;
lampeggia(1); // il led esp8266 lampeggia n volte
}
// ****************************************************************************************
// chkSerial() - VERIFICA/RICEVE I DATI RICHIESTI TRAMITE BOT TELEGRAM
// ****************************************************************************************
void chkSerial(uint32_t utente) {
int disponibili = Serial.available();
if (disponibili > 0) {
char c;
String buf = "";
if (Serial.read() != '#') { // se primo carattere diverso da "#" il flusso non e' valido
clearSerialBuffer();
return;
}
for (int ciclo = 1; ciclo <= disponibili - 3; ciclo++) { // esclude # iniziale e # CRLF finale
c = Serial.read();
if (c != '#') {
buf += c;
}
delay(10); // delay() alimenta HW WDT
}
if (c != '#') { // se non e' # rifiuta il messaggio
buf = "** ERRORE RICEZIONE DATI **";
emoticon = "\xF0\x9F\x98\xA9"; // ERRORE
}
clearSerialBuffer(); // svuota il buffer della seriale
if (buf == "CALDAIA ACCESA A MANO" || buf == "CALDAIA SPENTA A MANO") { // ipotetica accensione con pulsante fisico
utente = amedeo; // in tal caso notifica solo a me
}
myBot.sendMessage(utente, buf + emoticon); // e invia notifica al mittente
}
}
// ****************************************************************************************
// clearSerialBuffer() - svuota IL BUFFER DELLA SERIALE
// ****************************************************************************************
void clearSerialBuffer() {
char c;
while (Serial.available() > 0) {
c = Serial.read();
delayMicroseconds(10000);
}
}
// ****************************************************************************************
// testConnessione() - VERIFICA LA PRESENZA DELLA CONNESSIONE A INTERNET
// ****************************************************************************************
bool testConnessione() {
ESP.wdtFeed(); // alimento HW WDT
while (myBot.testConnection() == false) {
lampeggia(5); // lampeggia n volte e ritenta
}
while(ESP.getFreeHeap() < 45000) { // segnala se la ram scende sotto una determinata soglia
lampeggia(10);
// ESP.reset();
}
return true;
}
// ****************************************************************************************
// lampeggia() - IL LED ESP8266 LAMPEGGIA n VOLTE
// ****************************************************************************************
void lampeggia(byte lampi) {
for (int ciclo = 1; ciclo <= lampi; ciclo++) {
digitalWrite(LED, LOW);
delayMicroseconds(50000);
digitalWrite(LED, HIGH);
delayMicroseconds(50000);
}
}
// ****************************************************************************************
// help() - INVIA AL MITTENTE LA LISTA DEI COMANDI
// ****************************************************************************************
void help(uint32_t utente) {
String hlp = "/info Stato dell'impianto\n";
hlp += "/accendi Accende la caldaia\n";
hlp += "/spegni Spegne la caldaia\n";
hlp += "/tem [99.9] Set Comfort\n";
hlp += "/ledon Accende il display\n";
hlp += "/ledoff Spegne il display\n";
hlp += "/ora [aaaa-mm-gg hh:mm:ss]\n";
myBot.sendMessage(utente, hlp); // notifica i comandi al mittente
}
funziona tutto perfettamente finchè faccio prove e modifiche fino a notte inoltrata ma la mattina successiva esp8266 sembra morto, non risponde più.
eppure utilizzo il HW WDT che funziona benissimo in caso di disconnessione da WiFi o da mancanza temporanea di internet.
Ho terminato le mie modestissime risorse e quindi chiedo aiuto a voi.
vi ringrazio.