Ciao, ho progettato un sistema di allarme che mi monitora dei sensori e fino qui tutto ok. In aggiunta ho messo il modulo gsm che invia sms di allarme,e fino qui funziona.. ora vorrei fare se possibile che una volta inviato l allarme continui con il loop e ogni 4 ore mi invia se il caso il prossimo allarme, è fattibile? grazie mille
ciao...suggerimento...mettiamo che hai 8 sensori...potresti usare un byte sul quale alzi il bit del rispettivo sensore...quindi questo byte non sarà più a "0" e quindi abiliti l'invio dei messaggi e potresti anche sapere qale sensore è in allarme...
ma per il sensore in allarme non è un problema usando un if che mi invia l allarme nel messaggio scrivo il sensore e valore, solo non vorrei che ripete l sms ogni 20secondi ma uno ogni 4 ore
se ti servono 4 ore precise meglio usare un modulo RTC...se ti servono circa 4 ore usa millis()...quando si alza un allarme memorizzi millis() e poi verifichi se sono trascorsi 14400000 ...se si invii di nuovo e risalvi millis().
1 sms ogni 20 secondi?... Basta verificare che siano trascorse 4 ore dal precedente, altrimenti non lo invia.
con l attuale sketch se non lo blocco ogni 20 secondi fa il loop, per quello vorrei fare che lo invia ogni 4 ore ma se possibile continuare il loop.
Appunto: devi verificare che siano trascorsi 14.400.000ms.
si esatto ma come?
memorizzi millis() in una variabile unsigned long e poi fai un if.
ok ma come faccio a digli dopo il primo inviato di resettare millis() per calcolare le prossime ore?
non sapendo come hai strutturato il programma...direi:
creare due variabili (byte od int a seconda di quanti allarmi devi inviare)...una che memorizza il nuovo allarme ed una di copia...chiamiamole allarme e copiaAllarme
quindi al verificarsi di un allarme setti l'apposito bit nella variabile; e fai un if del genere (pseudocodice):
if(allarme ^ copiaAllarme || millis()-myMillis>=14400000){
invio messaggio;
copiaAllarme = allarme;
myMillis = millis();
}
con lo XOR (^) verifichi solo i nuovi allarmi...se metti un "diverso" (!=), all'interno della if, potresti anche verificare se un allarme è stato attivato o resettato.
PS: anche con lo XOR verifichi se un allarme è stato attivato o disattivato...quindi il controllo va fatto dentro la if
allora la parte di allarme è così:
if(leggiTemp()< 6)
{
digitalWrite(led4, HIGH);
sms.beginSMS(numeroallarme);
sms.print("ALLARME GELO !!");
sms.println("Temperatura: ");
sms.print(leggiTemp());
sms.print(" Gradi");
sms.endSMS();
}
else
{
digitalWrite(led4, LOW);
}
Ma come scritto da te calcola solo una volta 4 ore? o il millis() viene resettato appena letto l'if? scusa ma non lo capisco bene, è la prima volta che mi tocca fare dei ritardi così.. Grazie mille
Lungo o corto non fa differenza (il ritardo intendo) è che se non hai padronanza dell'uso di millis non riesci a codificare ciò che vuoi, per capire le basi con cui si usa millis() consiglio prima la lettura di QUESTO post esplicativo, dopo di che lo studio di come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... alla fine il tutto dovrebbe essere più chiaro ![]()
la variabile "numeroallarme" cos'è?...che valori può avere?...possono esserci più allarmi diversi contemporaneamente?
Numero allarme stava per una char la cui impostava il numero di telefono da inviare il messaggio.
Ma gli allarmi li faccio solo con un if esempio if(temperatura < 5) || (volts < 10) …. poi nel messaggio mi manda i dati letti, dunque è un allarme generico per quello lo volevo solo ogni 4 ore per avere il tempo di andare sul posto e resettarlo o sistemare il problema.
Ho fatto uno sketch di prova il quale non serve a questo progetto se vuoi lo posto e sembrerrebbe funzionare come lo hai descritto..
Grazie mille.
ah ok...non avevo visto che è nel "sms.beginSMS"...quello che vorrei dire è che, se fossi io, non farei tutte le if con all'interno l'invio del messaggio...creerei una funzione apposita per l'invio ed alla quale passerei la variabile con i BIT per gli allarmi ed al suo interno la codifica...creerei anche una funzione per ritornare questa variabile alla quale passerei un membro di una enumerazione con/per indice allarmi...la funzione "invio allarme" farebbe riferimento ad un'array const di stringhe per composizione SMS.
così il tutto dovrebbe risultare più manutentabile nel senso che potresti espandere, modificare,aggiustare più semplicemente.
bho...prova a postare il codice che ci diamo un occhio.
il codice è il seguente:
#include <GSM.h>
GSM gsmAccess;
GSM_SMS sms;
char telefono[13];
char numeroallarme[13]="xxx"; //inserire il numero per l'invio dei allarmi
int led4=4;
int led5=5;
int led6=6;
int led8=8;
int led9=9;
int led10=10;
int led11=11;
int led12=12;
int ledVerde=13;
void setup()
{
Serial.begin(9600);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);
pinMode(led11, OUTPUT);
pinMode(led12, OUTPUT);
pinMode(ledVerde, OUTPUT);
boolean connessione = true;
while(connessione) // se connesso accendi il Led
{
if(gsmAccess.begin()==GSM_READY)
connessione = false;
}
digitalWrite(ledVerde,HIGH);
}
int i=0;
char vettore[10];
char ricevuto[10];
String casting;
float valoreSensore=0;
float tensioneLetta=0;
float valoreAcquisito=0;
float leggiTemp()
{
valoreSensore=analogRead(A0);
tensioneLetta=(valoreSensore/1024.0)*5.0;
return (tensioneLetta-0.5)*100;
}
float misura = 0;
float conversione = 0;
float volts = 0;
float statobatt()
{
misura = analogRead(A1);
conversione = map(misura,0,711,0,1200);
volts = (conversione/100)+0.04;
}
void allarme()
{
sms.beginSMS(numeroallarme);
sms.print("ALLARME !!");
sms.println("Temperatura: ");
sms.print(leggiTemp());
sms.print(" Gradi");
sms.endSMS();
}
void loop()
{
Serial.println(leggiTemp());
if(leggiTemp()> 24)
{
digitalWrite(led4, HIGH);
allarme();
delay(60000);
}
else
{
digitalWrite(led4, LOW);
}
if(leggiTemp()< 6)
{
digitalWrite(led4, HIGH);
allarme();
delay(60000);
}
else
{
digitalWrite(led4, LOW);
}
if(statobatt()< 8)
{
digitalWrite(led4, HIGH);
sms.beginSMS(numeroallarme);
sms.print("ALLARME !!");
sms.println("Tensione batteria bassa: ");
sms.print(statobatt());
sms.print(" volts");
sms.endSMS();
delay(60000);
}
else
{
digitalWrite(led4, LOW);
}
char c;
if (sms.available())
{
sms.remoteNumber(telefono,13);
while(c=sms.read())
{
Serial.print(c);
vettore[i]=c;
i++;
}
delay(1000);
for(int j=0;j<i;j++)
ricevuto[j]=vettore[j];
casting=String(ricevuto);
if(casting.equals("Stato"))
{
sms.beginSMS(telefono);
sms.print("CASA ARDUINO");
sms.println("Temperatura: ");
sms.print(leggiTemp());
sms.print(" Gradi");
sms.println("Batteria:");
sms.print(statobatt());
sms.print(" Volts");
sms.endSMS();
i=0;
pulisciStringa(ricevuto,10);
}
sms.flush();
}
delay(1000);
}
void pulisciStringa(char* tmp,int dim)
{
int x;
for (x=0; x < dim; x++)
tmp[x] = 0;
tmp[0] = '\0';
}
però non ho ancora inserito il sistema di ritardo dei sms..
allora...ti allego circa quelo che farei io...più una libreria (PString).
prova ad analizzarlo ed adattarlo ai tuoi scopi...a disposizione
Gestione_SMS_allarmi.ino (4.39 KB)
PString3.zip (3.89 KB)
mi sono accorto che non porto mai a true la variabile "alarmActive"...dovresti farlo nelle if dove verifichi i range dei valori per allarmi...e ovviamente trovare un modo per resettare il tutto.
Ok grazie mille per l'aiuto.. ci studio su e vedo di adattarlo al mio progetto, sei veramente molto gentile
grazie ancora