Due parole sul cosa sto cercando di fare e a che punto sono.
Il tema è quello di misurare la temperatura del luogo dove metterò l'arduino (sta arrivando il BME280) E fin qui niente di speciale.
Voglio fare data logger su file di testo, un file per giorno (stanno arrivando la slitta SPI per la SD e l'RTC DS3231).
L'idea è di misurare la temperatura ogni 20 minuti (poi decido se questo intervallo di tempo fa per me) , archiviarla su file e mandare Arduino in sleep per far risparmiare la pila : non mi arriva la corrente dove metterò l'arduino.
Inoltre ogni volta che la temperatura scende sotto ad una certa soglia accodare un messaggio HTML in coda che mi avvisa che è scesa e quando è scesa.
Non appena è disponibile una connessione di rete WIFI tra le 5 possibili (non la faccio andare 24 h su 24 e la prima potrebbe attivarsi dopo giorni) fare l'upload via FTP di tutti file archiviati fino a ieri (quello di oggi lo sto ancora scrivendo) e scaricare la coda dei messaggi via chat.
Ora, senza i componenti che mi stanno arrivando ho potuto solo gestire i messaggi via chat, e funziona!
Genero un messaggio fittizio ogni 10 secondi giusto per riempire la coda (a regime sarà la temperatura del sensore a inserire un messaggio in coda) e la scarico quando è disponibile il WIFI.
Visto che il WIFI va a singhiozzo non posso mettere WiFi.begin() nel metodo setup() poichè mi serve fare il check sullo stato nel loop() e nel caso non sia connessa provare a riconnettersi.
Visti i tempi non è così essenziale ottimizzare il codice perchè una lettura ogni 20 minuti posso anche permettermi di attendere 1 secondo l'animazione della matrice a led (per altro utile se vedo direttamente l'arduino) ma mi piacerebbe comunque capire. Se avete voglia e tempo per aiutarmi a farlo.
Ora posto il codice e mi espongo un pò a critiche ma sono sicuro che saranno costruttive.
#include <WiFiS3.h>
#include "WiFiSSLClient.h"
#include "arduino_secrets.h"
#include <cppQueue.h>
#include "RTC.h"
#include "send_message.h"
#include "coda.h"
#include "Arduino_LED_Matrix.h"
#define IMPLEMENTATION FIFO
char Telegram_BOT[50] = TELEGRAM_BOT;
char Telegram_chatID[15] = TELEGRAM_CHATID;
bool connected = false;
ArduinoLEDMatrix matrix;
cppQueue q_telegram(100, 24, IMPLEMENTATION); // Instantiate queue -- 24 mesaggi da 100 caratteri ?
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// while (!Serial) {; }
matrix.begin();
//Telegram_BOT = TELEGRAM_BOT;
//Telegram_chatID = TELEGRAM_CHATID;
// set RTC clock
RTC.begin();
RTCTime startTime(5, Month::DECEMBER, 2023, 15, 53, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE);
RTC.setTime(startTime);
Serial.println("Arduino uno R4 Wifi - Telegram message on channel");
q_telegram.push("Arduino uno R4 Wifi - Telegram message on channel");
}
void loop() {
RTCTime currentTime;
RTC.getTime(currentTime);
// Se l'evento è verificato accoda il messaggio Telegram
if (currentTime.getSeconds() % 10 ==0 ){
char messaggioHTML[100] ;
int h = currentTime.getHour();
int m = currentTime.getMinutes();
int s = currentTime.getSeconds();
sprintf(messaggioHTML, "Ecco il messaggio delle ore %d:%d:%d ", h,m,s);
Serial.print(" messaggio composto : ") ;Serial.println(messaggioHTML);
q_telegram.push(&messaggioHTML);
}
if (currentTime.getSeconds() % 2 ==0){
// Stampa ora ogni 5 secondi
Serial.print(currentTime.getHour());Serial.print(":");Serial.print(currentTime.getMinutes());Serial.print(":");Serial.print(currentTime.getSeconds());Serial.println("");
Serial.print("Stato WIFI : "); Serial.println(WiFi.status());
}
if (q_telegram.getCount()>0 && currentTime.getSeconds() % 10 ==0){
Serial.print("La coda TELEGRAM contiene "); Serial.print(q_telegram.getCount()); Serial.println(" messaggi");
}
// Svuolta la coda di messaggi Telegram
unsigned int t1 = millis();
while(!q_telegram.isEmpty() && millis() - t1 < 1000 ){
if (WiFi.status()!=WL_CONNECTED ){
matrix.loadFrame(coda[q_telegram.getCount()]);
connected = connetti();
}
if (WiFi.status()==WL_CONNECTED ){
char mg[100];
q_telegram.pop(&mg);
bool res = Telegram_Send(mg); // Uncomment for PRODUCTION , commente for TEST
//bool res = Telegram_Send_Simulate(mg); // Uncomment for TEST , commente for PRODUCTION
if(res){
anim_send();
}
// Se il messaggio non è stato spedito inseriscilo nuovmaente in coda.
// Questo serve quando ci sono problemi con l'invio
if (!res && !q_telegram.isFull()){
q_telegram.push(&mg);
Serial.print("il messaggio '"); Serial.print(mg); Serial.println("' stato rimesso in coda perchè non consegnabile");
}
}
}
}
void anim_send(){
int size = sizeof(send_message) / sizeof(send_message[0]);
for (int i = 0 ; i<size ; i++){
matrix.loadFrame(send_message[i]);
delay(35);
}
}
bool connetti(){
//bool connected = false;
// Connessione alla rete
if (!connected){
char ssid[] = SECRET_SSID1;
char pass[] = SECRET_PASS1;
connected = connetti_rete(ssid,pass);
}
if (!connected){
char ssid[] = SECRET_SSID2;
char pass[] = SECRET_PASS2;
connected = connetti_rete(ssid,pass);
}
if (!connected){
char ssid[] = SECRET_SSID3;
char pass[] = SECRET_PASS3;
connected = connetti_rete(ssid,pass);
}
if (!connected){
char ssid[] = SECRET_SSID4;
char pass[] = SECRET_PASS4;
connected = connetti_rete(ssid,pass);
}
if (!connected){
char ssid[] = SECRET_SSID5;
char pass[] = SECRET_PASS5;
connected = connetti_rete(ssid,pass);
}
return connected;
}
bool Telegram_Send_Simulate(char MessaggioHTML[]){
bool res = true;
Serial.println("*** MESSAGGIO TELEGRAM SIMULATO ");
Serial.print(" "); Serial.println(MessaggioHTML);
return res;
}
bool Telegram_Send(char MessaggioHTML[]){
bool res = false;
WiFiSSLClient client;
if(!client.connect("api.telegram.org",443)){
Serial.println("Non connesso");
}else{
Serial.println("Mando messaggio...");
client.println("GET /" + (String)Telegram_BOT + "/sendMessage?chat_id=" + (String)Telegram_chatID + "&parse_mode=html&text="+ MessaggioHTML +" HTTP/1.1");
client.println("Host: api.telegram.org");
client.println("Connection: close");
client.println("");
unsigned int t1 = millis();
bool timeout = false;
while(client.available()==0 && !timeout){
if(millis() - t1 > 5000){
Serial.println("Non inviato");
Serial.println("Timeout");
timeout= true;
}
}
if (client.available()){
res = true;
Serial.println("Inviato");
}
client.stop();
}
return res;
}
bool connetti_rete(char NetName[], char NetPwd[]){
bool c = false;
unsigned int SOGLIA_MS_RICERCA_RETE = 200;
Serial.print("Try to connect to '"); Serial.print(NetName); Serial.println("' ...");
WiFi.begin(NetName,NetPwd);
unsigned int t1 = millis();
while (WiFi.status()!=WL_CONNECTED && millis() - t1 < SOGLIA_MS_RICERCA_RETE ){
delay(50);
Serial.print(".");
}
// Se è passato troppo tempo smetti di cercare questa rete
if(millis() - t1 > SOGLIA_MS_RICERCA_RETE && WiFi.status()!=WL_CONNECTED ){
Serial.println("Esco per troppo tempo passato");
return false;
}
if (WiFi.status()==WL_CONNECTED){
c = true;
//Serial.print("Stato : "); Serial.println(WiFi.status());
//Serial.print("Connected to nework '"); Serial.print(NetName); Serial.println("'");
//Serial.print("IP : "); Serial.println(WiFi.localIP());
char messaggioHTML[100];
messaggioHTML[0] = '\0';
strcat(messaggioHTML,"Connesso sulla rete : ");
strcat(messaggioHTML,NetName);
q_telegram.push(&messaggioHTML);
}
Serial.println("");
return c;
}