ecco qua lo sketch ..
è abbastanza chiaro.
per qualsiasi cosa chiedetemi e provo a spegarvi..
vi faccio ugualmente un piccolo riassunto:
Rem1=pulsante che attiva la zona A
Rem2=pulsante che attiva la zona B
entrambi non si interrompono in automatico e quindi vanno ripremuti (in automatico resetta l'arduino)
Rem3=pulsante attiva la routin (è la stessa attivata dall'RTC)
Rem4=interruttore modalità RUN/PAUSE (su pause l'arduino non fa niente, qualsiasi pulsante premuto non va, anche la routin con l'RTC) (su run funziona tutto come la normalità)
il tasto della piscina non l'ho mai collegato ma mi sembra che il comando funzioni
grazie ancora
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <avr/io.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_2S); while(1) {}
int rele[] = {2, 3, 4, 5};
int igrometro = 6;
int remoto[] = {11, 9, 12, 10, 8};
int led[] = {17, 16, 15, 14};
boolean isOn1;
boolean isOn2;
boolean isOn3;
boolean acceso;
tmElements_t tm;
boolean accendiPiscina;
unsigned long timer;
void setup() {
acceso = true;
isOn1 = false;
isOn2 = false;
isOn3 = false;
accendiPiscina = false;
Serial.begin(9600);
while (!Serial) ; // wait for serial
tmElements_t tm;
if (RTC.read(tm)) {
Serial.print("Ok, Time = ");
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.print(", Date (D/M/Y) = ");
Serial.print(tm.Day);
Serial.write('/');
Serial.print(tm.Month);
Serial.write('/');
Serial.print(tmYearToCalendar(tm.Year));
Serial.println();
if (digitalRead(igrometro) == 1)
Serial.print("terreno secco");
else
Serial.print("terreno umido");
}
for(int i = 0; i < 4; i++) {
pinMode(rele[i], OUTPUT);
pinMode(remoto[i], INPUT);
pinMode(led[i], OUTPUT);
}
pinMode(igrometro, INPUT);
}
static void rem1()
{
delay(250);
if(!isOn1)
{
isOn2 = false;
digitalWrite(led[1], LOW);
digitalWrite(rele[2], HIGH);
digitalWrite(rele[1], LOW);
digitalWrite(rele[0], HIGH);
digitalWrite(led[0], HIGH);
isOn1 = true;
} else{
digitalWrite(rele[2], LOW);
digitalWrite(rele[0], LOW);
digitalWrite(led[0], LOW);
isOn1 = false;
digitalWrite(led[3], HIGH);
delay(1000);
Reset_AVR();
}
delay(250);
}
static void rem2()
{
delay(250);
if(!isOn2)
{
isOn1 = false;
digitalWrite(led[0], LOW);
digitalWrite(rele[2], HIGH);
digitalWrite(rele[0], LOW);
digitalWrite(rele[1], HIGH);
digitalWrite(led[1], HIGH);
isOn2 = true;
} else{
digitalWrite(rele[2], LOW);
digitalWrite(rele[1], LOW);
digitalWrite(led[1], LOW);
isOn2 = false;
digitalWrite(led[3], HIGH);
delay(1000);
Reset_AVR();
}
delay(250);
}
static void routine()
{
delay(100);
int i;
boolean controlloOn = false;
digitalWrite(led[1], LOW);
digitalWrite(rele[1], LOW);
digitalWrite(led[2], HIGH);
digitalWrite(rele[2], HIGH);
for(i = 1; i <= 12 && !controlloOn; i++)
{
digitalWrite(led[1], LOW);
digitalWrite(rele[0], HIGH);
digitalWrite(led[0], HIGH);
timer = millis();
while(!(millis()-timer >= 165000UL)) //durata
{
delay(50);
if(controllo())
{
controlloOn = true;
break;
}
}
if(!controlloOn){
digitalWrite(led[0], LOW);
digitalWrite(rele[0], LOW);
digitalWrite(rele[1], HIGH);
digitalWrite(led[1], HIGH);
timer = millis();
while(!(millis()-timer >= 165000UL)) //durata
{
delay(50);
if(controllo())
{
controlloOn = true;
break;
}
}
digitalWrite(rele[1], LOW);
digitalWrite(led[1], LOW);
}
}
delay(100);
END: for(int k = 0; k < 3; k++)
{
digitalWrite(led[k], LOW);
digitalWrite(rele[k], LOW);
}
delay(1000);
if(!controlloOn)
{
digitalWrite(led[2], HIGH);
delay(500);
digitalWrite(led[2], LOW);
delay(500);
digitalWrite(led[2], HIGH);
delay(500);
digitalWrite(led[2], LOW);
digitalWrite(led[3], HIGH);
}
delay(100);
Reset_AVR();}
static boolean controllo()
{
if (premuto(3))
{
delay(100);
for(int i = 0; i < 4; i++)
{
digitalWrite(led[i], LOW);
digitalWrite(rele[i], LOW);
}
acceso = false;
isOn1 = false;
isOn2 = false;
return true;
}
acceso = true;
return false;
}
void loop() {
controllo();
if (acceso)
{
if (premuto(0))
rem1();
else
if (premuto(1))
rem2();
else
if (premuto(2))
routine();
else
/*if (premuto(4))
{
accendiPiscina = !accendiPiscina;
if(accendiPiscina)
digitalWrite(led[3], HIGH);
else
digitalWrite(led[3], LOW);
}*/
if (RTC.read(tm))
{
if ((tm.Hour == 21) and (tm.Day%2 != 0) and (digitalRead(igrometro) == HIGH)) routine(); //durata totale routin 66min
if(accendiPiscina) if((tm.Minute == 0) and (tm.Second == 0)) piscina(); // se la routine e' in corso non va
}
}
}
static void piscina()
{
if(!isOn3)
{
digitalWrite(rele[3], HIGH);
digitalWrite(led[0], HIGH);
digitalWrite(led[1], HIGH);
isOn3 = true;
}
else
{
digitalWrite(rele[3], LOW);
digitalWrite(led[0], LOW);
digitalWrite(led[1], LOW);
isOn3 = false;
}
}
static boolean premuto(int num)
{
for (int i = 0; i < 10; i++)
{
if (digitalRead(remoto[num]) == LOW)
return false;
delay(150);
}
delay(1000);
return true;
}
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
Giardinaggio_postato_su_forum.ino (4.78 KB)