Ciao a tutti, ho realizzato lo schema di questo progetto per gestire una serra in modo autonomo e riscontro adesso problemi di disturbo o interferenze soprattutto nei relè.
Spiengandomi meglio se spengo tutto il progetto e lo riaccendo si crea un disturbo tale da azionare i relè quando questi non dovrebbero farlo, se guardate lo sketch della scheda Relè il primo relè si accende solo se riceve dalla Scheda Sensori un input =1 e dopo 2 min si accende il secondo relè per attivare la Scheda Motore.
Quello che succede invece che si attivano IN1 e IN2 della Scheda Relè insieme e di conseguenza fa attivare i relè della Scheda Motore.
Capita pure ma non sempre che il relè collegato alla Scheda Sensori che riguarda la ventola il led IN1 rimane acceso ma il relè non si apre,questo relè è l'unico che ho collegato con una alimentazione esterna.
Sarei lieto di accettare i vostri consigli per un miglioramento di questo progetto e anche per condividerlo con voi e ringraziare tutti coloro che hanno contribuito alla sua realizzazione
SCHEDA SENSORI
/* Questo progetto utilizza due Igrometri e un sensore DHT11 per gestire una Serra Automatica
*/
int lettura = A0 ; // Pin analogico a cui è collegato il sensore 1
int lettura1 = A1 ; // sensore 2
int pompa = 9 ; //Pin a cui è collegato i rele' per attivare al pompa
int dht11 = 10 ;
int hc12 = 11 ;
int sensorValue = 1008; // Valore del sensore 1 immerso in acqua
int sensorValue1 = 1010; // Valore del sensore 2 immerso in acqua
#include <HygrometerSensor.h>
#include <Adafruit_Sensor.h>
//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
#include <LiquidCrystal_I2C.h> // Libreria LCD I2C
// LCD I2C address
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
delay(1000);
//I2C LCD
Serial.begin(9600);
lcd.begin(20,4);
Serial.println("Serra Automatica");
pinMode(pompa,OUTPUT); // Uscita relè pompa
digitalWrite(pompa, LOW); // Stato relè spento
// PIN 10 al relè - IN2
pinMode(dht11, OUTPUT); // Uscita relè sensore DHT11
digitalWrite(dht11, HIGH);
pinMode(hc12,OUTPUT);
digitalWrite(hc12, HIGH); // HC-12 Trasmittente
// Avvio sensore DHT11
dht.begin();
}
void loop(){
// Igrometro 1
lettura = analogRead(A0);
sensorValue = map (lettura, 1008, 319, 0, 100); // converto il valore analogico in percentuale
Serial.print("Umidità terra 1 : ");
Serial.print(sensorValue);
Serial.println ("%"); //Stampa a schermo il valore
// Igrometro 2
lettura1 = analogRead(A1);
sensorValue1 = map (lettura1, 1010, 215, 0, 100); // converto il valore analogico in percentuale
Serial.print("Umidità terra 2 : ");
Serial.print(sensorValue1);
Serial.println ("%"); //Stampa a schermo il valore
if ((lettura >= 775) && (lettura1 >= 775))
{
digitalWrite (pompa,HIGH); //... attiva la pompa
digitalWrite (hc12,LOW); // invio dati
} else {
digitalWrite (pompa,LOW); //.... spegne la pompa
digitalWrite (hc12,HIGH); // nessun dato
}
delay(10000);
// Lettura umidità e temperatura del sensore DHT11n
int h = dht.readHumidity();
int t = dht.readTemperature();
// Misura la temperatura e se maggiore di ... gradi attiva relè per accendere la ventola
if (t >= 25 )
digitalWrite (dht11, LOW); // Attiva Relè 2
else
digitalWrite (dht11, HIGH); // 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' Aria: ");
lcd.print(h);
lcd.print("%");
// imposta il cursore sulla terza riga:
lcd.setCursor(0,2);
lcd.print("Umid..Terra 1: ");
lcd.print(sensorValue);
lcd.print("%");
lcd.setCursor(0,3);
lcd.print("Umid..Terra 2: ");
lcd.print(sensorValue1);
lcd.print("%");
}
SCHEDA RELÈ
#define RELAY1 9 // Elettrovalvola pompa
#define RELAY2 10 // Motore irrigazione
#define pin_sensore A0
void setup() {
pinMode(RELAY1, OUTPUT); // Elettrovalvola
digitalWrite(RELAY1, HIGH);
pinMode(RELAY2, OUTPUT); // Motore
digitalWrite(RELAY2, HIGH);
pinMode(pin_sensore, INPUT);
}
void loop() {
if(digitalRead(pin_sensore) == 0 ){
digitalWrite(RELAY1,HIGH);
digitalWrite(RELAY2,HIGH);
}
else {
digitalWrite(RELAY1,LOW); // Start l'elettrovalvola
digitalWrite(RELAY2,HIGH); // Relè on/off spento
delay(120000);
digitalWrite(RELAY2,LOW);
delay(500); //Attesa riempimento impianto
digitalWrite(RELAY2,HIGH); // Avvio motore per irrigare
delay(210000); // Attesa spegnimento elettrovalvola
digitalWrite(RELAY1,HIGH); // Elettrovalvola spento
delay(5000);
}
}
SCHEDA MOTORE
#define in1 10
#define in2 11
#define fcS 13 //Finecorsa Sinistro ( posizione di reset iniziale )
#define fcD 12 //Finecorsa Destro
#define pin_sensore A0
byte stato_fc = 1 ;
void setup() {
digitalWrite(in1, HIGH) ;
digitalWrite(in2, HIGH) ;
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(fcS, INPUT_PULLUP);
pinMode(fcD, INPUT_PULLUP);
pinMode(pin_sensore, INPUT_PULLUP);
while (digitalRead(fcS) == HIGH) { // legge finecorsa sinistro
digitalWrite(in2, LOW) ; // avvia motore indietro fino alla posizione iniziale
}
digitalWrite(in2, HIGH) ; // motore_stop
}
void loop() {
if (digitalRead(pin_sensore) == 0 ) { // attende lo start
delay(100);
stato_fc = 1 ;
digitalWrite(in1, LOW) ; // motore_avanti
while (stato_fc != 0 ) {
if (digitalRead(fcD) == 0 ) {
digitalWrite(in1, HIGH); // motore_stop
stato_fc = 0 ;
}
}
delay(3000);
stato_fc = 1 ;
digitalWrite(in2, LOW) ; // motore_indietro
while (stato_fc != 0 ) {
if (digitalRead(fcS) == 0 ) {
digitalWrite(in2, HIGH); // motore_stop
stato_fc = 0 ;
}
}
delay(100);
}
}// fine loop
Arduino Nano con HC-12 per invio dati quando si aziona la pompa
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); //RX, TX
const byte buttonPin = 9;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
mySerial.begin(9600);
}
void loop() {
byte buttonState = digitalRead(buttonPin);
if(buttonState == 0){ //se il pulsante è premuto
mySerial.println("w1234");//invia un valore preceduto da w
}
delay(200);
}
