ciao ragazzi sto costruendo un sistema di controllo temperature e relè per dei terrai,
ho introdotto che la luce si accenda alle 7&30 ed si spenga alle 20&30 l'app mi serve per controllarlo da remoto fuori casa; il fattore che quando do il comando di accensione/spegnimento lui fa l'azione ma poi cambia stato, vi posto lo skech cosi mi aiutate sto uscendo pazzo.
// P R O G E T T O T E R R A I O
// di IVAN
// LIBRERIE PER OROLOGIO
#include <Time.h>
#include "RTClib.h"
RTC_DS1307 rtc;
// LIBRERIE PER DISPLAY e SENSORE Temperatura e Umidita
#include <SoftwareSerial.h> // includo la libreria per la comunicazione seriale
SoftwareSerial mySerial(10, 11); // imposto i pin per la comunicazione seriale
// Collegare i pin nel seguente modo: RX=>11 TX=>10
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// i pin delle 2 luci
#define Luce_Terraio 13 // pin 13
#define Luce_Terraio2 12 // pin 12
// i pin dei 2 sensori
DHT dht1(2, DHT11); // pin 2
DHT dht2(3, DHT11); // pin 3
// tipologia display
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
mySerial.begin(9600); // setto la comunicazione
Serial.println("Ivan Scordato Creation");
delay(10000);
Serial.begin(57600);
// controllo se il Sensore è collegato
if (!rtc.begin()) {
Serial.println("Sensore RTC non collegato");
}
dht1.begin();
dht2.begin();
lcd.init();
lcd.backlight();
pinMode(Luce_Terraio, OUTPUT);
pinMode(Luce_Terraio2, OUTPUT);
// imposta che all'accensione le due luci del terraio sono spente
digitalWrite(Luce_Terraio, HIGH);
digitalWrite(Luce_Terraio2, HIGH);
}
void loop() {
{
while (mySerial.available()) {
char dato = mySerial.read(); // "dato" è il valore che viene ricevuto dalla seriale
switch (dato) {
case 'A': // Se ricevo la lettera A,
{
digitalWrite(12, HIGH); // eccito il relè collegato al pin12
mySerial.println("Relè 1 ON");
break;
}
case 'a': // Se ricevo la lettera a
{
digitalWrite(12, LOW); // Spenfo il relè
mySerial.println("Relè 1 OFF");
break;
}
// E così anche di seguito...
case 'B':
{
digitalWrite(13, HIGH);
mySerial.println("Relè 2 ON");
break;
}
case 'b':
{
digitalWrite(13, LOW);
mySerial.println("Relè 2 OFF");
break;
}
}
}
}
DateTime now = rtc.now();
// controllo se orologio funziona
Serial.print("Data : ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.println(now.day(), DEC);
Serial.print("Ora : ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.println(now.second(), DEC);
Serial.println();
delay(10000);
int t1 = dht1.readTemperature();
int h1 = dht1.readHumidity();
int t2 = dht2.readTemperature();
int h2 = dht2.readHumidity();
// imposto il display per la visualizzazione della temperatura e umidità
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T1:" + String(t1) + char(0xDF));
lcd.setCursor(8, 0);
lcd.print("H1:" + String(h1) + "%");
lcd.setCursor(0, 1);
lcd.print("T2:" + String(t2) + char(0xDF));
lcd.setCursor(8, 1);
lcd.print("H2:" + String(h2) + "%");
// se non arriva niente da tastiera ....
// inizia la procedura automatica
if (Serial.available() == 0) {
// imposto condizione temperatura 40 gradi
if (t1 > 40) {
digitalWrite(Luce_Terraio, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T1 >40 gradi");
lcd.setCursor(0, 1);
lcd.print("T2:" + String(t2) + char(0xDF));
lcd.setCursor(8, 1);
lcd.print("H2:" + String(h2) + "%");
}
// imposto accensione espegnimento luci alle 7.30 e alle 20.00
if (now.minute() >= 30 && now.hour() >= 7) {
digitalWrite(Luce_Terraio, LOW);
digitalWrite(Luce_Terraio2, LOW);
}
if (now.minute() >= 30 && now.hour() >= 20) {
digitalWrite(Luce_Terraio, HIGH);
digitalWrite(Luce_Terraio2, HIGH);
}
}
// ---------------------------------------------------------
/* se arriva qualche comando da tastiera ....
con il tasto A accendo luce terraio 1
con il tasto S spengo la luce terraio 1
il comando viene attivato dopo qualche secondo perchè prima
fa tutto il loop del sistema con i sensori ...
*/
else {
char comandoricevuto = Serial.read();
if (comandoricevuto == 'A') {
digitalWrite(Luce_Terraio, HIGH);
Serial.println("Luce_Terraio Acceso");
}
if (comandoricevuto == 'S') {
digitalWrite(Luce_Terraio, LOW);
Serial.println("Luce_Terraio spento");
}
} // fine del comando seriale
}