Serra o semenzaio domotica con Arduino Uno

Ciao a tutti sto lavorando a un progetto di serra domotica con Arduino. Una piccola serra da 1 metro quadrato per sviluppare i semi nella prestigione e poi trapiantarli in orto. Mi sono rifatto a un progetto open source che poi ho ampliato. Qualcuno mi vuole aiutare?
Grazie mille
PS. Purtroppo non sono esperto di Arduino e non riesco a fare tante cose

Volevo in una piccola serra
Metterci una luce per la crescita delle piante comandata da un crepuscolare e da un relè
Un controllo temperatura interna e umidità e far partire una ventola per il ricambio d'aria o utilizzare un servomotore che mi alzi il pannello superiore della piccola serra.
Un sensore per l'umidità del terreno (igrometro) e far partire un'irrigazione localizzata a goccia.
Un sensore temperatura del terreno e far partire una lampada infrarosso a resistenza tipo quella per riscaldare i rettili.
Ho copiato qua e là del codice cercando di capire come funzionano i vari componenti singolarmente e unirli in un unico sketch. Vorrei che venisse eventualmente corretto e se qualcuno esperto mi poteva aiutare suggerendomi delle modifiche o delle critiche costruttive per migliorare o rendere più performante il sistema.
Vi ringrazio anticipatamente per il cortese aiuto.

const int valore_limite = 990; //Valore dell'igrometro al quale il relay sarà ON

//DHT11 Sensor:
#include "DHT.h"
#define DHTPIN 12     // Sensore collegato al PIN 12
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);


//I2C LCD:
#include <Wire.h> // Libreria WIRE (da aggiornare se non funziona)
#include <LiquidCrystal_I2C.h> // Libreria LCD I2C

// LCD I2C address
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // da cambiare se si ha un modello diverso


void setup()
{
// PIN 9 al Relè - IN1
Serial.begin(9600);
 pinMode(9, OUTPUT);

// PIN 10 al relè - IN2
 pinMode(10, OUTPUT);

// PIN 11 al relè - IN3
 pinMode(11, OUTPUT);

// PIN 12 al relè - IN4
 pinMode(12, OUTPUT);

//PIN 13 al LED
 pinMode (13, OUTPUT);

//I2C LCD
Serial.begin(9600);
 lcd.begin(20,4);
 Serial.println("Serra Autonoma di Reshitoze");
 
// Avvio sensore DHT11  
 dht.begin();
}


void loop()
{

// Fotoresistore
int Lumen = analogRead (A0); // Lumen come intero della lettura del pin A0
Serial.print("Sensore crepuscolare: ");
Serial.println(Lumen, DEC); // Stampa un valore decimale del fotoresistore
 
if (Lumen > 750)
 digitalWrite (11, HIGH); // Se il valore di Lumen è superiore a 750 attiva relè
else
 digitalWrite (11, LOW); // altrimenti spegne relè
delay (2000);  // Intervallo di 2 secondi


//Livello Acqua
int water = analogRead(A1);
Serial.print ("Sensore acqua: ");
Serial.println(water, DEC);  // Stampa il valore decimale del sensore di livello acqua
 
 if (water >= 100) {
   
   lcd.setCursor(0,3);  // Indica posizione del cursore su LCD
   lcd.print("Acqua: OK"); // Stampa su LCD il testo
 }
 else    
   {
   lcd.setCursor(0,3);  // Indica posizione del cursore su LCD
   lcd.print("Acqua: BASSA"); // Stampa su LCD il testo
   alarm();
   flash();
   delay(2000); // Intervallo di 2 secondi
   }

// Igrometro
int igro = analogRead(A3); // Legge il valore analogico
int umdtrr = 0; // Variabile umidità suolo
umdtrr = map (igro, 100, 990, 100, 0); // converto il valore analogico in percentuale
Serial.print("Umidità del terreno: ");
Serial.print(umdtrr);
Serial.println ("%"); //Stampa a schermo il valore

if (igro <= valore_limite)
 digitalWrite(9,LOW); // Attiva Relè 1
else
 digitalWrite(9,HIGH); // Spegni Relè 1
delay(2000); // Attende due secondi

// Riscaldatore Infrarosso
int celsius = analogRead (A2); // Temperatura terreno in A2
Serial.print("Temperatura del terreno: ");
Serial.println(celsius, DEC); // Stampa un valore decimale della temperatura
 
if (celsius < 20)
 digitalWrite (8, HIGH); // Se il valore di temperatura è inferiore a 20 attiva relè
else
 digitalWrite (8, LOW); // altrimenti spegne relè
delay (1000);  // Intervallo di 1 secondi


// Lettura umidità e temperatura del sensore DHT11
int h = dht.readHumidity();
int t = dht.readTemperature();

// Misura la temperatura e se maggiore di 40 gradi attiva relè per accendere la ventola
if (t >= 40 )
  digitalWrite (10, HIGH); // Attiva Relè 2
else
  digitalWrite (10, LOW); // Spegni Relè 2
delay (2000);

 Serial.print("Temp: ");
 Serial.print(t);
 Serial.print("C, Umid: ");
 Serial.print(h);
 Serial.println("%");


// impostare cursore sulla prima riga:
lcd.setCursor(0, 0);
lcd.print("Temperatura: ");
lcd.print(t);
lcd.print("C");
 
// imposta cursore sulla seconda riga:
lcd.setCursor(0,1);
lcd.print("Umidita': ");
lcd.print(h);
lcd.print("%");

// imposta il cursore sulla terza riga:
lcd.setCursor(0,2);
lcd.print("Umidita' terra: ");
lcd.print(umdtrr);
lcd.print("%");

// imposta il cursore sulla terza riga:
lcd.setCursor(0,3);
lcd.print("Temperatura terra: ");
lcd.print(t);
lcd.print("C");
}

void alarm(){
 tone(3,850,700);  // Imposta tono acustico su PIN 3
 delay(150);       // Aspetta per 0,15 secondi
 tone(3,850,700);  // Imposta tono acustico su PIN 3
 delay(150);       // Aspetta per 0,15 secondi
}

void flash() {
 digitalWrite(13, HIGH);   // Imposta il LED su ON
 delay(1000);               // Aspetta per 1 secondo
 digitalWrite(13, LOW);    // Impostiamo il LED su OFF
 delay(1000);               // Aspetta per 1 secondo
}

>Stevenarsenal: allora, non avendolo tu ancora fatto, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

Ciao a tutti chiedo scusa per non essermi presentato sul forum.
Ho ovviato a questo inconveniente facendolo sull’apposita pagina.
Ho inseriro il codice nel tag.
Grazie per i vostri suggerimenti.

Ciao a tutti, volendo sarà possibile con il modulo SD card registrare i dati dei sensori per elaborarli successivamente al PC? Grazie

Direi di NO visto che hai utilizzato i pin usati dal bus SPI per altri scopi (10,11,12,13) ed i moduli SD lavorano con tale bus.

Puoi spostare il tutto su altri pin e lasciare liberi quelli indicati ? Ricorda che, occorrendo, i pin analogici possono essere normalmente usati anche come pin digitali :slight_smile:

Guglielmo

P.S.: QUI e QUI dei tutorials sul bus SPI

Ciao.
Lo sketch sembra fare quello che vuoi fare. Alcune cose potrebbero essere migliorate, più che altro per una "buona prassi" di programmazione...

  • all'inizio definisci una costante col valore limite per l'igrometro... avrebbe senso fare lo stesso anche per gli altri sensori, così hai raggruppato in un unico posto tutte le soglie
  • all'inizio definisci il pin del DHT con una define... avrebbe senso fare lo stesso anche con i pin degli altri sensori, così hai raggruppato in un unico posto tutti i pin
  • ci sono molti delay() che bloccano il programma per diversi secondi... sicuro che serva aspettare così tanto? forse basta un delay unico alla fine del loop()

Per la SD ti ha già risposto Guglielmo

Grazie mille per le vostre risposte.
Chiedo 2 cose

  1. posso aggiungere un modulo pressione atmosferica e orologio per avere data e ora?
  2. se aggiungo più sensori e le righe sono solo 4 posso avere un autoscroll del display in verticale così visualizzo temperatura, umidità, livello acqua, ora e data, pressione atmosferica ecc? Ho trovato vari esempi ma tutti con scroll orizzontale.
    Grazie

PS. Farò delle modifiche al codice secondo i vostri suggerimenti