Ciao a tutti! Ho un piccolo progetto che vorrei realizzare! In pratica vorrei creare un piccolo umidificatore/deumidificatore per una cantinetta vino..
Il funzionamento è questo.. Un sensore (DHT22) legge la temperatura e l'umidità e li scrive su un display LCD 16x2. Quando l'umidità è inferiore ad un valore impostato, fa partire una ventola pista sopra ad un barattolo pieno d'acqua, fino al raggiungimento del valore impostato.. Mentre se l'umidità è più alta fa partire una ventola posta sopra un barattolo contenente dei sali deumidificanti (la ventola è posizionata in modo da tirare l'aria all'interno del barattolo). Prima domanda: secondo vuoi può essere efficace? Per l'umidificazione credo di si, mentre per la parte della deumidificazione non ne sono sicuro..
Inoltre vorrei posizionare una/due ventole in modo da smuovere l'aria all'interno della cantinetta per uniformare il tutto..
Volevo utilizzare anche un sensore a contatto tipo questo www.robot-italy.com/it/3562-miniature-magnetic-contact-switch-br-2023.html, attaccandolo alla porta della cantinetta, in modo che quando viene aperta tutte le ventole si fermino.. Devo quindi gestirlo con un interrupt.. Ma quel sensore come bisogna collegarlo? Non trovo nessuno schema.. So che arduino uno gestisce gli interrupt sui piedini 2 e 3..
E nella parte di programmazione, una volta che chiamo l'interrupt, come faccio quando chiudo la cantinetta a ritornare nello stato prima dell'interrupt?
Grazie mille ragazzi!
Se devi controllare l'umiditá di un piccolo volume Ti funziona. Per una stanza o appartamento non hai abbastanza potenza umidificante / deumificante.
Inoltre nell acqua farai crescere alghe, muffe e batteri.
Ciao Uwe
uwefed:
Se devi controllare l'umiditá di un piccolo volume Ti funziona. Per una stanza o appartamento non hai abbastanza potenza umidificante / deumificante.
Inoltre nell acqua farai crescere alghe, muffe e batteri.
Ciao Uwe
Si la cantinetta è circa 50x50x75 cm, internamente qualcosa meno.. L'acqua comunque la cambierò spesso, quindi non dovrebbero esserci molti problemi per le muffe..
Mentre per il sensore di contatto da mettere nella porta, in modo che si fermino tutte le ventole che mi puoi dire? Appena finisco lo schema e una prima bozza dello sketch lo posto!
Quel sensore comunica in digitale quindi ti fornisce 1 quando la porta è chiusa e 0 quando la porta è aperta.
Per fermare le ventole quando apri la porta e farle ripartire quando la chiudi hai diverse possibilità, la più semplice è:
metti un MOSFET che chiude il circuito delle ventole e controllane il gate tramite il sensore. Ma a questo punto ancora meglio metti un interruttore come quelli dei frigoriferi invece di sensore + MOSFET + circuito.
Se invece vuoi che sul display ti appaia una scritta quanto apri la porta o vuoi mettere un allarme acustico che suona se rimane aperta ... allora devi entrare da un pin ma a cosa ti serve l'interrupt? Se la ventola si spegne qualche millisecondo dopo aver aperto la porta, cosa ti cambia? Anche se si spegnesse un secondo dopo, cosa ti cambia?
Essendo veramente negato per l'elettronica, avrei preferito usare un sensore tipo quello che ho postato.. In modo che quando si apriva la cantinetta e il sensore passava da HIGH a LOW facesse partire l'interrupt.. L'interrupt lo volevo usare perchè se apro la porta mentre arduino è nel ciclo in cui sta facendo aumentare o diminuire l'umidità, non riuscirebbe ad arrivare al valore impostato e quindi le ventole continuerebbero a girare..
Però, per far partire linterrupt a livello di programmazione ho capito come fare, ma per far ritornare tutto come prima quando chiudo la cantinetta, come si fa?
E quel sensore, come si collega ad arduino?
Grazie e scusate la mia ignoranza
... e collegare lo switch della porta direttamente al comune delle ventole, in modo che non interferiscano con il programma e si fermino in ogni caso, qualsiasi sia lo stato ? (con magari un secondo reed connesso ad un timer, che se la porta rimane aperta piu di "tot" secondi fa partire un bel cicalino da 120db ? ... ok, magari qualche db in meno XD)
Alle buone, vecchie, semplici soluzioni "da elettricista" non ci pensa piu nessuno ... vergogna, vergogna ... XD XD XD
Etemenanki:
Alle buone, vecchie, semplici soluzioni "da elettricista" non ci pensa piu nessuno ... vergogna, vergogna ... XD XD XD
Veramente era la mia prima proposta...
Per quanto attiene agli interrupt: lo richiami al cambio di stato e lo associ ad una subroutine (ops... terminologia forse da vecchio basic...) che verifica se la porta è aperta, in tal caso stacca le ventole, o se è chiusa, in tal caso le attacca. Ma credo sia sufficiente mettere un IF nel loop, è meno complicato.
Da quello che ho inteso, il tuo loop consisterebbe in alcuni IF o un case, insomma qualcosa come:
se troppa umidità --> ventola deumidificatore ON - ventola umidificatore OFF
se poca umidità --> ventola umidificatore ON - ventola deumidificatore OFF
se umidità normale OPPURE porta aperta --> entrambe le ventole OFF
e poi il loop si ripete
Quanto tempo credi che ci metterà ad accorgersi della porta aperta?
Siccome di elettronica e di "elettricistica" non ci capisco nulla, preferirei attuare il tutto "informaticamente", in quanto sono perito informatico.. E anche se ormai sono passati 4 anni da quando andavo a scuola, la parte di programmazione bene o male me la ricordo..
Il problema di non usare un interrupt è il seguente, metto un pezzetto di codice (logico):
If (umidita<tot)
Umidifica();
void Umidifica()
While (umidita<tot)
ventola umidificatore ON;
Il problema sorge quando mentre sta svolgendo il ciclo while per umidificare e io apro la porta, non si fermeranno mai le ventole, perché non si verificherà mai la condizione per uscire da ciclo while.. Per questo vorrei usare l'interrupt..
Ma per quale motivo vuoi che il codice rimanga in quel while?
E' più semplice in ogni loop verificare se l'umidità è bassa e in tal caso mandare in ON la ventola.
Se la ventola è già ON la mandi ancora in ON... e così accadrà ogni volta che si ripete il loop e l'umidità è bassa.
La stessa cosa per la ventola del deumidificatore.
L'umidità può essere in tre stati:
bassa
buona
alta
quindi non accadrà mai che si accendano tutte e due le ventole.
Ad ogni ciclo, si accenderà quella appropriata (o nessuna delle due se l'umidità è nel range considerato buono).
P.S. non succede niente di grave se mandi in stato ALTO un PIN che è già ALTO, se era questo il motivo per il quale volevi restare nel while .
paulus1969:
Ma per quale motivo vuoi che il codice rimanga in quel while?
E' più semplice in ogni loop verificare se l'umidità è bassa e in tal caso mandare in ON la ventola.
Se la ventola è già ON la mandi ancora in ON... e così accadrà ogni volta che si ripete il loop e l'umidità è bassa.
La stessa cosa per la ventola del deumidificatore.
L'umidità può essere in tre stati:
bassa
buona
alta
quindi non accadrà mai che si accendano tutte e due le ventole.
Ad ogni ciclo, si accenderà quella appropriata (o nessuna delle due se l'umidità è nel range considerato buono).
P.S. non succede niente di grave se mandi in stato ALTO un PIN che è già ALTO, se era questo il motivo per il quale volevi restare nel while .
Sei un geniooooo!!
Non so perché mi ero fissato con sto interrupt e sto ciclo while! Non avevo pensato a questa logica! Ora per colpa tua dovrò riscrivere l'intero sketch ahah
Appena finito lo posto per vedere se può andare!
Ps: sapevo che mandare in stato ALTO un pin già ALTO non succedeva niente
Sto scrivendo il programma.. Ma mi è sorto un altro piccolo dubbio.. I valori della temperatura e umidità ricavati dal sensore DHT22 li vorrei mettere in una variabile T e UR di tipo float.. E' possibile però visualizzare i valori con solo una cifra dopo la virgola (arrotondato in modo esatto!)?
Un'altra domanda: ma se l'umidità la volessi di tipo intero è possibile, o il valore che restituisce è solo di tipo float? Per esempio, una cosa così può funzionare:
In questo modo in UR ottieni solo il valore intero (I decimali vengono troncati), ma io, avendo avuto problemi in passato con soluzioni simili ti consigliere di provare così:
float UR=dht22.getHumidity();
int UR2= int(UR)
L'idea è questa, potrei aver sbagliato qualche maiuscola, non ho modo di testare il codice al momento
A parte il riscrivere anche le parti fisse delle scritte sul display... ed altre sottigliezze sul display che qualcuno che ha più pratica di me con questi oggetti potrà spiegarti meglio (ci sono modi per risparmiare memoria)...
Dovresti impostare un range di umidità accettabile, invece fai accendere una ventole se UR < 67 ed un'altra se UR >= 68...
Metti un if (ur < 65) umidifica, else if (ur > 70) deumidifica, else statti fermo.
Altrimenti, a parte l'inutilità dell'else, avresti un continuo attacca e stacca delle ventole quando sei in prossimità del valore di soglia.
Così invece avresti un range fra 65 e 70 considerato "buono".
Ovviamente ho messo due valori qualsiasi, lo saprai tu quali sono quelli da adoperare.
Il problema è che dovrebbe star il più possibile stabile a 67% di umidità.. Il fatto di continuare ad accendere e spegnere le ventole può provocare qualche danno?
Per il discorso display l'avevo fatto perché nel caso in cui apro la porta, sul display viene visualizzata una frase, che quando chiudo la porta deve sparire completamente e ritornare la schermata principale..
Vedrò comunque se posso migliorarla
paulus1969:
Allora metti <67 nel primo IF, > 67 nell'else if e ==67 nell'elese.
Per il display, potresti inserire una funzione che ti scrive le parti fisse e la richiami all'inizio e poi quando viene chiusa la porta.
Però in quel caso devo mettere UR di tipo int, perché tenendola di tipo flot nel caso fosse 67,45673 è maggiore di 67, ma non deve partire a deumidificare..
E quindi torniamo al caso precedente...
nell'if metti < 67 e partirà la ventola da 66.9999
nell'else if metti >68 e partirà la ventola da 68.0001
nell'else (senza condizioni) sarai fra 67 e 68 e qui le ventole staranno ferme
o puoi anche mettere le due soglie a 66.5 e 67.5, insomma lo sai tu come ti serve