Go Down

Topic: Nuovo Progetto Serra automatizzata (Read 457 times) previous topic - next topic

aquilacieca

Ciao a tutti,
come detto in presentazione sono un appassionato di botanica e vorrei fare l'"upgrade" alla mia serra growbox.
Sto studiando tramite libri, tutorial,forum etc tutta la parte elettronica.
Possiedo il kit starter arduino uno.

il mio progetto vorrebbe prevedere una serra con:
1) luce accesa per 16 ore al giorno
2) 2 ventole ( ventole da pc a 12v) che si accendono in base alla temperatura e umidità (sensore dht122) presente all'interno.
3) rilevatore di umidità terreno tramite igrometro
4) Display led

ho a disposizione un alimentatore di un vecchio pc riconvertito ad alimentatore con boccole per corrente a 12, 5 e 3,3 v.
la mia lista della spesa credo debba prevedere oltre al dht122 e igrometro una scheda relè.

sto studiando per capire come scrivere lo sketch e soprattutto come eseguire tutti i vari collegamenti senza rischiare di bruciare tutto.
ho tempo 3 mesi, per la befane mi sono prefissato di accendere il tutto.

Ho aperto questo thread per poter far domande, ricevere suggerimenti e consigli con i vari step che andrò a fare.
se è il posto sbagliato vi prego di spostarlo.

grazie per la collaborazione

Daniele

fabpolli

#1
Sep 28, 2018, 04:58 pm Last Edit: Sep 28, 2018, 04:58 pm by fabpolli
Ciao, benvenuto, ti consiglio di aggiungere alla lista un bell'RTC che ti servirà a garantire che le luci si accendano ad un orario prefissato e preciso e altrettanto per lo spegnimento (alla lunga millis() introduce troppo errore).
La scheda relé dipende da cosa vuoi comandarci, le ventole le puoi pilotare anche senza relé, per l'illuminazione a cos'hai pensato? Se sono strip led a 12V anche quelle le piloti con un mosfet e ti eviti la scheda relé.
In base alle tue capacità ed esperienza guarda da cosa ti conviene partire (Es. gestione della luce) e andare allo step successivo aolo quando la funzionalità precedente è corretta e funzionante.

aquilacieca

Grazie, hai ragione, lo aggiungo alla lista della spesa.
Per quanto riguarda la luce userò lampada vegetativa per serre alimentata da 220.
Il mio obiettivo è studiare bene la programmazione e poi iniziare uno step alla volta.. Iniziare con le luci poi passo passo aggiungerò gli altri componenti.

gpb01

#3
Sep 29, 2018, 03:51 am Last Edit: Sep 29, 2018, 03:54 am by gpb01
Per quanto riguarda la luce userò lampada vegetativa per serre alimentata da 220.
... ti consiglio di NON nominare più la cosa e di NON chiedere né di come collegarla, né di come controllarla, né altre informazioni.

Ti ricordo il REGOLAMENTO, punto 15 (... e suoi sottopunti), per cui NON sono ammesse discussioni che parlino di qualsiasi cosa alimentata oltre la "bassisima tensione".

Se dovessi vedere apparire ancora in questa discussione, un qualche cosa a 220V, dovrò chiudere immediatamente il thread.

Uomo avvisato ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

fabpolli

Diciamo che volendo partire dalla gestione della luce (a led in bassissima tensione) prima di arrivare al relè dovrai padroneggiare il display è l'rtc, e di carne al fuoco già ne hai tanta tanta, gestire visualizzazione sui display dell'ora corrente tutto sommato sarà abbastanza semplice, gestire le schermate e la logica per gestire i vari settaggi già ti complica la cosa e richiesta un po'di tempo e studio. Visto che ci sei aggiungi alla lista della spesa condensatori e resistenze per il debounce hardware dei pulsanti per l'immissione dei settaggi e, visto che dovrai sicuramente fate più cose assieme (ventole, lettura dell'umidità, ecc) non cadere nel tranello di usare il delay, imposta da subito la logica del programma per funzionare con millis, altrimenti ti troverai a stravolgere il programma dopo. Credo che come base di studio puoi cercare sul forum
Uso di millis

Debounce hardware
Uso di millis
Macchina a stati finiti
Uso di millis
E visto che hai già un kit gli argomenti che ti ho suggerito li puoi studiare e realizzare senza hardware aggiuntivo (simuli il tutto con due pulsanti e due led ad esempio) nel frattempo che ti arriva il materiale

aquilacieca

#5
Sep 29, 2018, 08:23 am Last Edit: Sep 29, 2018, 08:26 am by aquilacieca
... ti consiglio di NON nominare più la cosa e di NON chiedere né di come collegarla, né di come controllarla, né altre informazioni.

Ti ricordo il REGOLAMENTO, punto 15 (... e suoi sottopunti), per cui NON sono ammesse discussioni che parlino di qualsiasi cosa alimentata oltre la "bassisima tensione".

Se dovessi vedere apparire ancora in questa discussione, un qualche cosa a 220V, dovrò chiudere immediatamente il thread.

Uomo avvisato ... ;)

Guglielmo
Non ho chiesto nulla, ho semplicemente risposto ad una domanda che chiarisce il mio progetto.
Grazie cmq Guglielmo del promemoria


Diciamo che volendo partire dalla gestione della luce (a led in bassissima tensione) prima di arrivare al relè dovrai padroneggiare il display è l'rtc, e di carne al fuoco già ne hai tanta tanta, gestire visualizzazione sui display dell'ora corrente tutto sommato sarà abbastanza semplice, gestire le schermate e la logica per gestire i vari settaggi già ti complica la cosa e richiesta un po'di tempo e studio. Visto che ci sei aggiungi alla lista della spesa condensatori e resistenze per il debounce hardware dei pulsanti per l'immissione dei settaggi e, visto che dovrai sicuramente fate più cose assieme (ventole, lettura dell'umidità, ecc) non cadere nel tranello di usare il delay, imposta da subito la logica del programma per funzionare con millis, altrimenti ti troverai a stravolgere il programma dopo. Credo che come base di studio puoi cercare sul forum
Uso di millis

Debounce hardware
Uso di millis
Macchina a stati finiti
Uso di millis
E visto che hai già un kit gli argomenti che ti ho suggerito li puoi studiare e realizzare senza hardware aggiuntivo (simuli il tutto con due pulsanti e due led ad esempio) nel frattempo che ti arriva il materiale

Grazie delle dritte. Sto prendendo confidenza realizzando i piccoli progetti del kit più altri trovati online. Seguirò il tuo consiglio e inizierò a studiare l'uso di millis.
Grazie ancora

aquilacieca

buongiorno,
ho preparato la lista della spesa, allego le foto:

dht22
igrometro
DS3231

sono corretti?

sto studiando uso dei millis

grazie ancora


fabpolli

Il materiale in se direi di si, l'importante è avere tutta la documentazione tecnica per l'utilizzo con Arduino, per l'RTC e il DHT22 non ci sono problemi c'è tutto e di più su internet, l'igrometro non lo conosco, se hai librerie e documentazione disponibile allora non ci sono problemi

aquilacieca

#8
Nov 07, 2018, 02:55 pm Last Edit: Nov 07, 2018, 02:56 pm by aquilacieca
ciao a tutti,
dopo aver fatto diversi test con i singoli componenti ho iniziato ad assemblare il tutto, schema e codice.
vi allego lo schema e sotto riporto il codice.
il mio intento è quello di far accendere le luci led da 12 v alle 6 di mattina e spegnerle alle 10 di sera;
far avviare 2 ventole da 12 v quando la temperatura supera i 30 gradi;
accendere led quando la soglia di umidità del terreno scende sotto un determinato valore.
in futuro aggiungerò un sensore di co2

Con la vostra esperienza potete consigliarmi migliorie? vedete grossi errori? avete dubbi che a me non sono sorti al momento?

vi ringrazio se vorrete aiutarmi


sotto vi allego il codice:


Code: [Select]


//TEMPERATURA VENTOLA E LCD

#include "DHT.h"
#include "LiquidCrystal.h"
LiquidCrystal lcd(2, 3, 4, 5, 11 ,12);
#define DHTPIN 6 // PIN DEL DHT22
#define DHTTYPE DHT22  
DHT sensor(6, DHT22);
int relay_ventola = 9; // PIN DEL RELè PRIMA VENTOLA
int relay_ventola2 = 10; // PIN DEL RELè SECONDA VENTOLA

// ORARIO PER LUCE
#include <DS3232RTC.h>    
#include <Time.h>
#include <Wire.h>
int val ;
int relay_luci = 7; // PIN DEL RELè LUCE

// IGROMETRO
const int soglia_critica = 300; //Soglia alla quale il led sarà ON

void setup()

{
// TEMPERATURA LCD E VENTOLE

lcd.begin(16,2);
sensor.begin();
pinMode(9, OUTPUT);  //relay PRIMA ventola
pinMode(10, OUTPUT);  //relay SECONDA ventola
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);

// ORARIO E LUCI
Serial.begin(9600);
  pinMode(7, OUTPUT); //relay luce
  setTime(17, 59, 00, 07, 11, 2018); //IMPOSTO ORA, MINUTI, SECONDI, GIORNO, MESE ANNO
  RTC.set(now());
  
  
      
// IGROMETRO

Serial.begin(9600);
pinMode(13, OUTPUT); // LED PIN PER IGROMETRO
}


void loop()

{
  
lcd.clear();
float t = sensor.readTemperature(); //reading the temperature from the sensor
// Checking if the sensor is sending values or not
if (isnan(t)) {
lcd.print("Failed");

return;
}
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
if (t > 30){
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  lcd.setCursor(0,1);
  lcd.print("Fan is ON ");
  delay(10);
}
else{
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  lcd.setCursor(0,1);
  lcd.print("Fan is OFF ");
}

// IGROMETRO

int sensorValue = analogRead(A0); //Legge il valore analogico
Serial.println(sensorValue); //Stampa a schermo il valore
if (sensorValue <= soglia_critica)
digitalWrite(13,HIGH); //Accendi led
else
digitalWrite(13,LOW); //Spegni led


delay(2000); //Attende due secondi

AutomaticProgram();




}
void AutomaticProgram()

// ORARIO E LUCI
{
   val = (hour()); // uso solo l'ora
    if ((6 == val))  // alle ore 6
    {
    digitalWrite(7, HIGH); // accendo luci
    }
    else if (val == 22) // alle 22
    {
    digitalWrite(7, LOW); // spengo luci
    }
    else
    {
    digitalWrite(7, LOW);}
     }  

Claudio_FF

#9
Nov 09, 2018, 07:54 pm Last Edit: Nov 09, 2018, 07:55 pm by Claudio_FF
Ventola: in prossimità dei 30 gradi la lettura potrebbe variare avanti e indietro di poco causando continue partenze e arresti. Meglio accenderla a 30.2 e spegnerla a 29.8, o altro intervallo.

Luci: finché l'ora vale 6 sono accese, cosa succede quando solo le 7?

Orario: il 'setTime' nel setup imposta ogni volta quell'ora e data ad ogni accensione o reset.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

aquilacieca

Ventola: in prossimità dei 30 gradi la lettura potrebbe variare avanti e indietro di poco causando continue partenze e arresti. Meglio accenderla a 30.2 e spegnerla a 29.8, o altro intervallo.

Luci: finché l'ora vale 6 sono accese, cosa succede quando solo le 7?

Orario: il 'setTime' nel setup imposta ogni volta quell'ora e data ad ogni accensione o reset.
grazie mille per i consigli, regolerò come mi suggerisci le temperature.
Luci: vorrei si accendessero alle 6 e si spegnessero alle 22, alle 7 devono rimanere accesse, come posso cambiare il codice?

orario: al momento del post ho inserito l'ora di quel momento; la batteria dell'rct non tiene memorizzata l'ora? la mia idea di progetto è che arduino lavori 24h su 24. se dovessi spegnere o resettare dovrò ricollegare il portatile ad arduino; puoi consigliarmi un modo diverso?

grazie ancora

aquilacieca

ho collegato tutto il circuito e caricato il codice.

c'erano 2 errori nel setup che ho corretto. uno però è rimasto: il display visualizza la prima riga tutta scura e nella seconda nulla. non capisco l'errore.



Code: [Select]


//TEMPERATURA VENTOLA E LCD
    #include "DHT.h"
    #include "LiquidCrystal.h"
    LiquidCrystal lcd(2, 3, 4, 5, 11 ,12);
    #define DHTPIN 6 // PIN DEL DHT22
    #define DHTTYPE DHT22 
    DHT sensor(6, DHT22);
    int relay_ventola = 9; // PIN DEL RELè PRIMA VENTOLA
    int relay_ventola2 = 10; // PIN DEL RELè SECONDA VENTOLA

// ORARIO PER LUCE
    #include <DS3232RTC.h>   
    #include <Time.h>
    #include <Wire.h>
    int val ;
    int relay_luci = 7; // PIN DEL RELè LUCE

// IGROMETRO
    const int soglia_critica = 300; //Soglia alla quale il led sarà ON
    unsigned long time_iniziale;     
    unsigned long time;

  void setup()
   
// TEMPERATURA LCD E VENTOLE
    {
    lcd.begin(16,2);
    sensor.begin();
    pinMode(9, OUTPUT);  //relay PRIMA ventola
    pinMode(10, OUTPUT);  //relay SECONDA ventola
   
// ORARIO E LUCI
    Serial.begin(9600);
    pinMode(7, OUTPUT); //relay luce
    setTime(17, 59, 00, 07, 11, 2018); //IMPOSTO ORA, MINUTI, SECONDI, GIORNO, MESE ANNO
    RTC.set(now());
       
// IGROMETRO
    Serial.begin(9600);
    pinMode(13, OUTPUT); // LED PIN PER IGROMETRO

// USO DEI MILLIS
    time_iniziale = millis();   //Riempo la variabile con il valore di millis attuali
    }

  void loop()
 
//TEMPERATURA VENTOLA E LCD
    {
    {
    lcd.clear();
    time = millis();   //Metto nel loop la variabile del tempo in millis attuale
    if ( time > time_iniziale + 3600000 )  //Semplice if dove controllo se i millis attuali di "time" sono maggiori di "time_iniziale" piu il tempo da me scelto ( 1 ora )
    { 
    float t = sensor.readTemperature(); //reading the temperature from the sensor

// Checking if the sensor is sending values or not

    if (isnan(t))
    {
    lcd.print("Failed");
    return;
    }
    lcd.setCursor(0,0);
    lcd.print("Temp: ");
    lcd.print(t);
    lcd.print(" C");
    if (t > 30,2)
    {
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    lcd.setCursor(0,1);
    lcd.print("Fan is ON ");
    delay(10);
    }
    else
    {
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    lcd.setCursor(0,1);
    lcd.print("Fan is OFF ");
    time_iniziale = millis();         //Aggiorno il valore di "time_iniziale" al valore dei millis correnti per fare una ripetizione infinita de loop
    }

// IGROMETRO
    {
    time = millis();   //Metto nel loop la variabile del tempo in millis attuale
    if ( time > time_iniziale + 3600000 ) //Semplice if dove controllo se i millis attuali di "time" sono maggiori di "time_iniziale" piu il tempo da me scelto ( 1 ora )
    {
    int sensorValue = analogRead(A0); //Legge il valore analogico
    Serial.println(sensorValue); //Stampa a schermo il valore
    if (sensorValue <= soglia_critica)
    digitalWrite(13,HIGH); //Accendi led
    else
    digitalWrite(13,LOW); //Spegni led
    time_iniziale = millis();         //Aggiorno il valore di "time_iniziale" al valore dei millis correnti per fare una ripetizione infinita de loop
    }   
// ORARIO E LUCI     
    {
    val = (hour()); // uso solo l'ora
    if ((val >= 6 && val <22))  // dalle ore 6 alle 22
    {
    digitalWrite(7, HIGH); // accendo luci
    }
    else if (val >= 22 && val <= 6) // dalle 22 alle 6
    {
    digitalWrite(7, LOW); // spengo luci
    }
    else
    {
    digitalWrite(7, LOW);
    }
    }
    }
    }
    }
    }

Go Up