Ciao a tutti… sto facendo un progetto per creare una specie di domotica…cioè attraverso una stazione di controllo dotata di display e pulsanti automatizzo una tapparella e le luci…ha tre modalità MANUALE da TELECOMANDO e AUTOMATICO… la programmazione per le prime due funziona bene( la discesa e salita della tapparella è regolata tramite la funzione millis che permette di far trascorrere il tempo necessario per arrivare al fine corsa della tapparella senza bloccare il programma)
nella modalità AUTOMATICO tramite un interruttore crepuscolare viene stabilito giorno e notte e di conseguenza la salita e la discesa della tapparella e l’accensione delle luci…
il problema è che nell’automatico la funzione millis non funziona…se qualcuno è disposto a darmi una mano gliene sono infinitamente grato .allego lo sketch,
#include <Wire.h> //librerie LCD
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
#define ACCESO 1 //definisco le variabili ACCESO e SPENTO che sostituiscono HIGH e LOW per semplificare
#define SPENTO 0
int stato_rele_salita = 0; // conserva lo stato rele salita tapparella
int stato_rele_discesa = 0; // conserva lo stato rele discesa tapparella
int val_fotoresistenza=0;
const byte RELE1 = 2; //rele' illuminazione esterna
const byte RELE3 = 5; //rele' salita tapparella
const byte RELE4 = 6; //rele' discesa tapparella
const byte SENSORE_CREPUSCOLARE = A0; //interrutore crepuscolare per tapparella
boolean stato_notte = false; //varibile booleana stato notte
boolean stato_giorno = false; //variabile booleana stato giorno
unsigned long lastmillis = millis(); //variabile tempo relè tapparella SALITA
unsigned long lastmillis1 = millis(); //variabile tempo relè tapparella DISCESA
unsigned long attesa = 10000; //tempo azionamento relè tapparella SALITA
unsigned long attesa1 = 10000; //tempo azionamento relè tapparella DISCESA
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void setup()
{
delay(1000);
pinMode(SENSORE_CREPUSCOLARE, INPUT);
pinMode(RELE1, OUTPUT);
pinMode(RELE3, OUTPUT);
pinMode(RELE4, OUTPUT);
digitalWrite(RELE1, SPENTO);
digitalWrite(RELE2, SPENTO);
digitalWrite(RELE3, SPENTO);
digitalWrite(RELE4, SPENTO);
digitalWrite(RELE5, SPENTO);
digitalWrite(RELE6, SPENTO);
Serial.begin(9600); //inizializzo la porta seriale
irrecv.enableIRIn(); // avvio la ricezione IR
lcd.begin(20,4);
lcd.backlight();
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void loop()
///////////////////////////////////AUTOMATICO//////////////////////////////////////////////////////////////
{
lcd.setCursor(0, 0); //First column, first row
lcd.print("MODALITA'AUTOMATICO ");
val_fotoresistenza = analogRead(SENSORE_CREPUSCOLARE); //salva il valore della fotoresistenza nella varibile
val_temperatura = analogRead(SENSORE_TEMPERATURA);
if(stato_notte == true && val_fotoresistenza<500)//NOTTE MA STATO GIA' VERIFICATO
{
digitalWrite(RELE3,SPENTO); //salita spenta
digitalWrite(RELE4,SPENTO); //discesa spenta
digitalWrite(RELE1,ACCESO); //illuminazione accesa
lcd.setCursor(0,1);
lcd.print("MODALITA' SERA ");
}
if(stato_giorno == true && val_fotoresistenza>500)//GIORNO MA STATO GIA' VERIFICATO
{
digitalWrite(RELE3,SPENTO); //salita spenta
digitalWrite(RELE4,SPENTO); //discesa spenta
digitalWrite(RELE1,SPENTO); //illuminazione spenta
lcd.setCursor(0,1);
lcd.print("MODALITA' GIORNO ");
}
if(val_fotoresistenza<500 && stato_notte == false ) //NOTTE
{
stato_rele_discesa = ACCESO;
stato_rele_salita = SPENTO;
digitalWrite(RELE4, stato_rele_discesa);
digitalWrite(RELE3, stato_rele_salita);
digitalWrite(RELE1,ACCESO);
lcd.setCursor(0,1);
lcd.print("MODALITA' SERA ");
lcd.setCursor (0,2); //imposta la seconda riga
lcd.print("DISCESA TAPPARELLA ");
lastmillis1 = millis();
stato_notte = true;
stato_giorno = false;
}
if(val_fotoresistenza>501 && stato_giorno == false) //GIORNO
{
stato_rele_salita = ACCESO;
stato_rele_discesa = SPENTO;
digitalWrite(RELE3, stato_rele_salita); // accende il rele' di salita
digitalWrite(RELE4, stato_rele_discesa); //mi assicuro che sia spento il rele' di abbassamento
digitalWrite(RELE1,SPENTO);
lcd.setCursor(0,1);
lcd.print("MODALITA' GIORNO ");
lcd.setCursor (0,2); //imposta la seconda riga
lcd.print("SALITA TAPPARELLA ");
lastmillis = millis();
stato_giorno = true;
stato_notte = false;
}
if ((millis() - lastmillis) >= attesa) {
lastmillis = millis();
if (stato_rele_salita == ACCESO) {
stato_rele_salita = SPENTO;
digitalWrite(RELE3, stato_rele_salita);
lcd.setCursor (0,1); //imposta la seconda riga
lcd.print(" ");
lcd.setCursor (0,2); //imposta la seconda riga
lcd.print(" ");
}
}
if ((millis() - lastmillis1) >= attesa1) {
lastmillis1 = millis();
if (stato_rele_discesa == ACCESO) {
stato_rele_discesa = SPENTO;
digitalWrite(RELE4, stato_rele_discesa);
lcd.setCursor (0,1); //imposta la seconda riga
lcd.print(" ");
lcd.setCursor (0,2); //imposta la seconda riga
lcd.print(" ");
}
}
}