Trigger umidità elevata

Salve a tutti, sono nuovo di arduino e del saldatore ed ho appena preso una Yun che mi età dando grosse soddisfazioni..

sono riuscito con successo a fare il datalogging di un sensore di umidità e temperatura dht22 ora mi piacerebbe creare un trigger che mandi una mail quando l'umidità sale o scende oltre un determinato valore ma non ho idea di come iniziare...

cosa é il Tuo problema? rilevare il limite o spedire il SMS? Ciao Uwe

Il mio è problema è mandare l'email una sola volta quanto il valore supera un certo livello

se uso if umidita> 70 tutte le volte il sensore legge il valore superiore manda una mail

mentre io vorrei fare una cosa del tipo che se in precedenza il sensore aveva già superato il livello di guardia non si attivi il trigger

non so se mi sono spiegato

raxpa: ... mentre io vorrei fare una cosa del tipo che se in precedenza il sensore aveva già superato il livello di guardia non si attivi il trigger

Ok, ma ... per quanto tempo ???

Ovvero, superi il livello di guardia e mandi l'eMail ... poi l'umidità scende, risale, riscende ... quanto aspetti prima di dover reinviare l'eMail ???

Guglielmo

MI sono spiegato male in pratica vorrei che funzionasse così

fisso il limite a 70%

T1 um=68 → non mando email

T2 um=71 → mando email

T3 um=72 → non mando email perché T2era già > di 70 quindi l’avviso è stato già mandato

t4 un=69 → Mando email perché T3>70 e t4<70

spero di essermi spiegato meglio e grazie dell’attenzione

Quindi ... se ho ben capito ... tu vuoi UNA sola eMail OGNI VOLTA che si attraversa (in su o in giù) il limite del 70% di umidità ?

Giusto ?

Se è così ti bastano due variabili byte che usi come flag TRUE/FALSE per ricordarti che hai inviato l'eMail ... quando metti a TRUE una metti a FALSE l'altra e viceversa ad ogni passaggio attraverso il 70% ;)

Guglielmo

Grazie Mille Guglielmo, se avessi due righe di codice sottomano ...farei ancora prima :) come ti dicevo stò ancora imparando

Ti do qualche indicazione e poi tu ci metti del tuo a svilupparla … :wink:

// dichiari due variabili che userai come flag

byte fSotto = false;
byte fSopra = false;

....
....

// all'interno del loop()

 -- leggi l'umidità --

if (umidità > 70) {
   if (! fSopra) {
      // Non hai ancora mandato l'eMail per > 70
      -- manda l'email --
      fSopra = true;
   }
   fSotto = false;
}
else {
   if (! fSotto) {
      // Non hai ancora mandato l'eMail per < 70
      -- manda l'eMail --
      fSotto = true;
   }
   fSopra = false;
}

E’ già molto semplice, ma si potrebbe fase ancora più semplice usando UNA sola variabile.

Il vantaggio con le due variabili è che, anche all’avvio, sei sicuro che manda la prima email per Sopra o Sotto (… ok, anche questo sarebbe possibile con una sola variabile, usando TRE valori numerici invece di vero/falso) :wink:

Dimmi se ti è chiaro come funziona o hai difficoltà …

Guglielmo

Sei sicuro che la negazione puó essere fuori dalle parentesi?

if !(fSopra)

e non

if (!fSopra)

? Ciao Uwe

uwefed: Sei sicuro che la negazione puó essere fuori dalle parentesi?

Ooopppsss ... è tutto il pomeriggio che programmo in un altro linguaggio che ... sono rimasto con la sua sintassi XD XD XD

Post corretto, GRAZIE Uwe ;)

Guglielmo

grazie ad entrambi... sono doppiamente soddisfatto perché ci ero arrivato da solo...

raxpa: sono doppiamente soddisfatto perché ci ero arrivato da solo...

BENE !!! Hai visto che ... non era poi così difficile ... ;)

Guglielmo

ho separato i controlli sopra e sotto perché può capitare che l'umidità oscilli attorno al valore

Da una prova effettuata il sistema non mi funziona ad ogni cambiamento di stato pensavo di procedere così che ne pensate?

raxpa:
Da una prova effettuata il sistema non mi funziona ad ogni cambiamento di stato pensavo di procedere così che ne pensate?

Quale non ti funziona ??? :astonished:

Le mie indicazioni, se le hai implementate correttamente, funzionano … e se hai problemi attorno al 70% … basta che crei un po’ d’isteresi …

Guglielmo

come si crea l’isteresi? Non ne avevo mai sentito parlare … ho imparato una cosa nuova!

raxpa: come si crea l'isteresi?

Facile, prendi un isterico e lo filtri, quello che rimane è l'isteresi :grin:

Scherzi a parte, l'isteresi sono due soglie, una maggiore e una minore, entro le quali una grandezza fisica variabile, p.e. una tensione, non comporta nessun cambio di stato al sistema, solo se la grandezza fisica supera queste soglie è consentito il cambio di stato. Praticamente è lo stesso concetto degli stati logici con ingressi digitali dotati del triggger di Schmitt, se la tensione è maggiore di un certo valore lo stato logico è 1 se è minore di un altro valore è 0, qualunque valore di tensione compreso tra le soglie non comporta nessun cambio di stato logico rispetto a quello corrente.

Allora, nei controlli seri si usa un PID (fai una ricerca su google) ... tel tuo caso è inutile incasinarsi tanto la vita e si può seguire una strada più semplice ...

---- (70 + x)%

--------- 70%

---- (70 - x)%

... quella zona tra -x% e +x% crea una zona che evita le oscillazioni attorno al punto esatto 70% quindi ... segnalazione per sopra 70% quando in realtà superi il (70 + x)% e segnalazione per sotto quando scendi sotto il (70-x)% ... in questo modo, piccole oscillazioni all'intorno del 70% preciso sono ininfluenti e non hai raffiche di messaggi.

La grandezza di x va scelta proprio in funzione delle oscillazioni che ti aspetti ...

Guglielmo

Edit : Astro mi ha preceduto con la spiegazione tecnica ;)

Ho appena studiato su wikipedia... il vero problema sono le mie basi minuscole... mai preso fino ad una settimana fa il saldatore in mano... ma devo dire che la community e la documentazione in giro aiutano ;)

Che ne dite così può andare?

//SET HUMIDITY LEVEL
int setPoint=70;
//SET ISTERESI
float isteresi=0.8;

// FLAG
byte fSotto = false;
byte fSopra = false;

....
....

// all'interno del loop()

 -- leggi l'umidità --

if (umidità > setPoint + isteresi) {
   if (! fSopra) {
      // Non hai ancora mandato l'eMail per > 70
      -- manda l'email --
      fSopra = true;
   }
   fSotto = false;
}
else if (umidità < setPoint - isteresi) {
   if (! fSotto) {
      // Non hai ancora mandato l'eMail per < 70
      -- manda l'eMail --
      fSotto = true;
   }
   fSopra = false;
}