Controllo temperatura con salvataggio dati

Ciao a tutti, sono nuovo del mondo arduino mi sono già presentato ma questo è il mio primo progetto. Le mie conoscenze sono molto basilari, quindi quando mi sono trovato di fronte alla scelta dei componenti hardware da acquistare ho avuto non pochi dubbi.

Intanto vi spiego cosa vorrei fare:
una piccola serra in cui monitorare temperatura e umidità, mostrare tali valori su un display LCD, accendere una ventola in caso la temperatura superi una soglia prestabilita e salvare i dati su una scheda sd con cadenza oraria in modo da poterne fare un grafico al pc.

Mi scuso se online si trovano molti esempi di serre automatizzate, ma quella che vorrei realizzare io è molto più semplice e più che altro vorrei imparare a usare arduino. Copiando un progetto già esistente non credo imparerei molto.

Ho il seguente materiale:
-sensore DHT22
-sensore Dallas 18B20
-modulo per leggere la scheda SD
-display LCD da kit (senza I2C)
-ventola per pc da 12 V
-alimentatore da 12 V MeanWell

Ho già imparato a usare i sensori e a leggerne i valori al pc, sto aspettando il display e la ventola.

Visto che già utilizzo un alimentatore da 12 V collegato a un timer per accendere e spegnere le luci vorrei usare la stessa alimentazione per arduino dato che il programma deve funzionare solo quando le luci sono accese.

I dubbi che ho avuto finora sono questi:

E' possibile con il materiale che ho a disposizione realizzare il progetto che ho in mente?
Ho bisogno di un modulo RTC per salvare i dati ogni ora o posso gestire il salvataggio col codice del programma?
Inoltre a ogni ciclo arduino si spegne e si accende, ogni volta che si accende può creare, senza RTC, un file di testo con nome diverso se già ne esiste uno sulla SD?
Per accendere e spegnere la ventola posso usare un mosfet o è necessario un relay?
Ho visto che arduino può essere alimentato a 12 V sul jack, però non ho capito se è consigliabile o meno utilizzare una tensione più bassa per evitare surriscaldamenti. Cosa mi consigliate?

Grazie a chi dedicherà del tempo per rispondere alle mie domande! Paolo

Edit:
Ho aggiunto una foto con lo schema dei collegamenti per sensore e ventola può andare bene?
Facendo lo schema mi è venuto un altro dubbio: sulla guida dello starter kit, quando utilizza due voltaggi diversi (12 per il motore e 5 per i sensori), viene raccomandato di mettere la messa a terra in comune. E' necessario anche in questo caso?
Più che altro il DHT 22 pensavo di collegarlo direttamente a arduino, visto che non ha bisogno di alcun altro componente...

Sì allora:
Modulo RTC obbligatorio, dato che la precisione dei tempi di arduino è inadatta
Basta un fet per la ventola, ma serve diodo di ricircolo.
Serve un alimentatore separato da diciamo 7 volt, non tanto per il riscaldamento del regolatore. Piuttosto per separare le alimentazioni e quindi i disturbi
Metà di quelli che fanno quello che vuoi fare tu viene, dopo, qui a lamentare malfunzionamenti, la soluzione è sempre separare le alimentazioni.
Se ti domandi cosa fa l'altra metà di quello che fanno quello che vuoi fare tu la risposta è semplice: separano le alimentazioni prima e non si lamentano dopo.
Uomo avvisato...

completo

Capisco il povero Wile E. Coyote quando viene piantato li da Road Runner

Standardoil:
Sì allora:
Modulo RTC obbligatorio, dato che la precisione dei tempi di arduino è inadatta
Basta un fet per la ventola, ma serve diodo di ricircolo.
Serve un alimentatore separato da diciamo 7 volt, non tanto per il riscaldamento del regolatore. Piuttosto per separare le alimentazioni e quindi i disturbi
Metà di quelli che fanno quello che vuoi fare tu viene, dopo, qui a lamentare malfunzionamenti, la soluzione è sempre separare le alimentazioni.
Se ti domandi cosa fa l'altra metà di quello che fanno quello che vuoi fare tu la risposta è semplice: separano le alimentazioni prima e non si lamentano dopo.
Uomo avvisato...

Posso chiederti di quanto sbagliarei senza RTC? Vorrei semplicemente salvare il valore della temperatura ogni tot per capirne l'andamento, poi se sbaglio di qualche secondo o qualche minuto non è un problema.
Grazie per il consiglio sull'alimentatore, non avevo proprio pensato ai possibili disturbi. Ne ho uno da 6V a cui ho saldato il jack per arduino, userò quello.

brunello22:
completo

Grazie mille per lo schema completo, mi hai chiarito un po' le idee su come sistemare il tutto senza breadboard, mi sarà molto utile!
Penso che non userò il dallas, li ho confrontati ed è più preciso del dht, ma i valori non differiscono poi di tanto e mi serve comunque il dht per l'umidità..
Posso chiederti a cosa servono le resistenze sul gate del mosfet e sul pin del dht? Ho visto che alcuni le mettono, e altri no.
Col dht ho provato entrambe le configurazioni, sia con la resistenza tra il pin e i 5 V, sia collegando direttamente il pin all'ingresso di arduino e i valori letti erano gli stessi...

Polks:
Posso chiederti di quanto sbagliarei senza RTC?

Acceso 24/24 ore? Dopo una giornata ti puoi trovare anche con decine di minuti di errore ...
... purtroppo l'oscillatore di Arduino UNO NON è quarzato e l'errore, su tempi lunghi, NON è affatto trascurabile.

Guglielmo

gpb01:
Acceso 24/24 ore? Dopo una giornata ti puoi trovare anche con decine di minuti di errore ...
... purtroppo l'oscillatore di Arduino UNO NON è quarzato e l'errore, su tempi lunghi, NON è affatto trascurabile.

Guglielmo

Sta acceso per 16 ore, poi si spegne e dopo 8 ore si riaccende. In questo modo l'errore si azzera o sbaglio?

Polks:
Sta acceso per 16 ore, poi si spegne e dopo 8 ore si riaccende. In questo modo l'errore si azzera o sbaglio?

Nel senso che fisicamente, accendi Arduino, dopo 16 ore gli togli l'alimentazione e dopo 8 ore lo riaccendi e così via ?

Guglielmo

gpb01:
Nel senso che fisicamente, accendi Arduino, dopo 16 ore gli togli l'alimentazione e dopo 8 ore lo riaccendi e così via ?

Guglielmo

Si, è tutto collegato a un timer.
Per ora mi va bene anche così, poi se volessi lasciare Arduino sempre acceso e registrare la temperatura anche con le luci spente, da quanto ho capito, avrei bisogno del modulo RTC.
Più avanti proverò a aggiungere anche questo componente, grazie per la spiegazione

Ma secondo me ti serve un RTC anche solo per sapere l'ora della misura,

Ok per ora vorrei tralasciare il salvataggio dei dati, non è quello il problema, come ho giá detto a casa ho solo la ventola e il DHT.

Piuttosto qualcuno mi può spiegare a cosa servono le resistenze sul gate del MOSFET e sul pin di lettura del dht?? Entrambi funzionano sia con che senza...

Il resistore sul DHT è una resistenza di PullUp e serve ad avere un livello logico stabile quando il pin passa da Input a Output

Il resistore ( da 100 Ohm ) sul Gate del Mosfet serve come protezione del pin di Arduino

brunello22:
Il resistore sul DHT è una resistenza di PullUp e serve ad avere un livello logico stabile quando il pin passa da Input a Output

Il resistore ( da 100 Ohm ) sul Gate del Mosfet serve come protezione del pin di Arduino

Ok grazie Brunello ora mi è più chiaro, anche se nel codice che ho scritto il dht é sempre un input.
Non ho una resistenza da 100 ohm per il Mosfet, posso metterne una da 220?

Ok sono riuscito a far funzionare la ventola col sensore di temperatura, ho seguito lo schema di Brunello e come consigliatomi da Standardoil ho usato un alimentatore separato per arduino.

Se a qualcuno dovesse interessare questo è il codice che ho scritto:

//DHT22
#include <DHT.h>;
DHT dht (8,DHT22);
float Hum;
float Temp;
float Tmax=-100;
float Tmin=100;
int num = 1;

//Gate ventola
const int Gate = 9;

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(Gate, OUTPUT);

  }
void loop() {

  //lettura sensore
  Hum = dht.readHumidity();
  Temp= dht.readTemperature();

  //accensione e spegnimento ventola
  if (Temp >= 27){
  digitalWrite(Gate, HIGH);
   }
  if (Temp <= 25) {
    digitalWrite(Gate, LOW);
  }

  //Definizione Tmax e Tmin
    if ( Temp > Tmax ){
    Tmax = Temp ;}
     if ( Temp < Tmin ){
    Tmin = Temp ;}

    //comunicazione serial
    Serial.print(num);
    Serial.print(") Hum: ");
    Serial.print(Hum);
    Serial.print(" % Temp: ");
    Serial.print(Temp);
    Serial.println("°C");
    num++;
   
     delay (1000);
    

}

Il delay alla fine lo uso per non avere troppi aggiornamenti sul seriale: per ora non ho lo schermo LCD quindi devo collegare arduino al pc per leggere i valori di temperatura e umidità.
Quando al posto di serial.print userò il comando lcd.print non c'è bisogno di alcun delay giusto?

Comunque grazie a tutti, da solo non credo che sarei riuscito a far funzionare tutto :slight_smile:

..... ora mi è più chiaro, anche se nel codice che ho scritto il dht é sempre un input.

Il tuo codice non c'entra niente. Per il DHT usi una libreria ed è lei a gestire il colloquio.
Quando richiedi l'umidità o la temperatura, il pin viene messo in Outpt e viene inviata la richiesta al sensore, poi nuovamente in input per leggere il dato

Polks:
Ok grazie Brunello ora mi è più chiaro, anche se nel codice che ho scritto il dht é sempre un input.

Questo lo credi TU ;D perché, probabilmente, non ti sei studiato come funziona la libreria DHT altrimenti ...
... avresti scoperto che il colloquio (se così si può chiamare) è in realtà bidirezionale; il DHT invia i deti dopo la richiesta da parte della MCU. Ti allego uno schema base di colloquo ...


Guglielmo

_Edit: mi sono sovrapposto con Brunello _ :grin:

brunello22:
Il tuo codice non c'entra niente. Per il DHT usi una libreria ed è lei a gestire il colloquio.
Quando richiedi l'umidità o la temperatura, il pin viene messo in Outpt e viene inviata la richiesta al sensore, poi nuovamente in input per leggere il dato

gpb01:
Questo lo credi TU ;D perché, probabilmente, non ti sei studiato come funziona la libreria DHT altrimenti ...
... avresti scoperto che il colloquio (se così si può chiamare) è in realtà bidirezionale; il DHT invia i deti dopo la richiesta da parte della MCU. Ti allego uno schema base di colloquo ...

Guglielmo

Ok allora non avevo capito molto, grazie per la spiegazione la prossima volta cerco di capire come funzionano le librerie prima di usarle.
Sto aspettando ancora il resto dei componenti, appena mi arriva altro vi aggiorno!

Ok ieri mi è arrivato il display, ma ho avuto un problema ..
Prima ho provato il display da solo e funzionava.
Poi ho provato a collegare tutto:
-Alimentatore da 12v e 75w per luci e ventola
-alimentatore da 6v per Arduino e sensori

Una volta acceso, il display e Arduino funzionavano correttamente, ma la ventola restava sempre accesa.
Dopo qualche prova ho capito di aver bruciato il Mosfet IRF520N visto che i pin centrale è quello a destra sono sempre in conduzione.

Ho sbaglaito a collegare la ventola allo stesso alimentatore delle luci?
In ogni caso controllando il datasheet del Mosfet non me lo spiego, dovrebbe sopportare picchi di correnti molto maggiori dei 6,25 A erogabili al massimo da quell'alimentatore.
Mi viene da pensare che possa essersi bruciato dopo un surriscaldamento, anche se mi sembra che la ventola funzionasse prima che ci mettessi mano..

Metto una foto per farvi un'idea di quello che avevo fatto, per quanto riguarda i collegamenti ho seguito lo schema di qualche post fa.

Polks:
... il Mosfet IRF520N ...

Tra le tante cose ... lo abbiamo detto e ripetuto decine e decine di volte, gli IRF non sono "logic level" e NON vanno bene con Arduino ... occorre usare gli IRL, es. IRL540, che sono "logic level" !

Guglielmo

gpb01:
Tra le tante cose ... lo abbiamo detto e ripetuto decine e decine di volte, gli IRF non sono "logic level" e NON vanno bene con Arduino ... occorre usare gli IRL, es. IRL540, che sono "logic level" !

Guglielmo

Ma era nel kit di Arduino com'è possibile che non sia compatibile??