Salve,
Vi presento il mio piccolo progettino che da qualche mese impegna il mio tempo libero e no XD.
Praticamente a me serve per fare accendere e spegnere la striscia LED con fade per la simulazione dell’alba e del tramonto, con orari differenti in funzione del periodo dell’anno, a monitorare la temperatura e l’umidità e prossimamente integrare l’intensità di luce in caso di scarsa luce ambientale.
A esempio io devo anticipare l’ora di alba di x minuti al giorno per n giorni e ritardare l’ora del tramonto di x minuti al giorno per n giorni fino ad avere circa 14 ore di luce già a febbraio.
Di seguito lo sketch:
#include "Wire.h"
#include <Math.h>
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);
int inPin = 3; // Pin di lettura della temperatura
int ledPin = 4; // Dichiara il PIN di arduino incaricato di gestire il fading
int temp = 0; // variabile temperatura
int fotoresistenzaPin = 0; // Pin di collegamento della Fotoresistenza
int fotoresistenzaValue; // Variavile che memorizzerà la lettura
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
int Acceso = 0;
String stato;
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
return ( (val/16*10) + (val%16) );
}
void setDateDs1307(){
second = 00;
minute = 47;
hour = 10;
dayOfWeek = 7;
dayOfMonth = 27;
month = 11;
year = 11;
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(byte(0x00));
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void getDateDs1307(){
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(byte(0x00));
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
second = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read() & 0x3f);
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
}
void setup(){
lcd.init();
lcd.backlight();
Serial.begin(9600);
Wire.begin();
stato = "S";
analogWrite(ledPin, 0);
//setDateDs1307();
}
void loop(){
getDateDs1307();
int mdg, spegni, accendi;
int sdg, tempo, giorni;
mdg = (hour*60)+minute;
sdg=mdg*60;
PrintToDisplay();
if(month==10 || month==11){
if(mdg == 450){
FadeAccensione();
}
if(mdg == 480){
FadeSpegnimento();
}
if(mdg == 720){
FadeAccensione();
}
if(mdg == 750){
FadeSpegnimento();
}
if(mdg == 960){
FadeAccensione();
}
if(mdg == 990){
FadeSpegnimento();
}
}
if(year == 13 || month == 12){
if(stato == "S"){
Sunrise(month, dayOfMonth, hour, minute);
}
if (stato == "A" && mdg == 480){
analogWrite(ledPin, 0);
stato == "S";
}
if (stato == "S" && mdg == 990){
analogWrite(ledPin, 255);
stato == "A";
}
if (stato == "A"){
Sunset(month, dayOfMonth, hour, minute);
}
}
delay(1000);
}
void Sunrise(int mese, int giorno, int ora, int minuto){
int mdg, mpacc, msacc, mtacc;
mdg = (ora*60)+minuto; //minuto del giorno
if(mese==12){
mpacc = 450 - giorno; //prima accensione
msacc = 660 - (giorno*2); //seconda accensione
mtacc = 900 - (giorno*2); //terza accensione
if(mdg==mpacc){FadeAccensione();}
if(mdg==msacc){FadeAccensione();}
if(mdg==mtacc){FadeAccensione();}
}
if(mese == 1){
msacc = 420 - (giorno*2);
if(mdg==msacc){FadeAccensione();}
}
if(mese == 2){
msacc = 422 - (giorno*2);
if(mdg==msacc){FadeAccensione();}
}
}
void Sunset(int mese, int giorno, int ora, int minuto){
int mdg, mpspe, msspe, mtspe;
mdg = (ora*60)+minuto; //minuto del giorno
if(mese==12){
mpspe = 515 + giorno;
msspe = 690 + (giorno*2);
mtspe = 930 + (giorno*2);
if(mtspe>=1012){mtspe=1012;}
if(mdg==mpspe){FadeSpegnimento();}
if(mdg==msspe){FadeSpegnimento();}
if(mdg==mtspe){FadeSpegnimento();}
}
if(mese == 1){
msspe = 1020 + (giorno*2);
if(mdg==msspe){FadeSpegnimento();}
}
if(mese == 2){
msspe = 1080 + (giorno*2);
if(mdg==msspe){FadeSpegnimento();}
}
}
void FadeAccensione(){
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
// Invia il valore al mosfet (0-255):
analogWrite(ledPin, fadeValue);
// Attende 4 secondi prima in modo da poter visualizzare l'effetto alba
delay(4000);
stato="A";
}
PrintToDisplay();
}
void FadeSpegnimento(){
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
// Invia il valore al mosfet (0-255):
analogWrite(ledPin, fadeValue);
// Attende 4 secondi prima in modo da poter visualizzare l'effetto di tramonto
delay(4000);
stato="S";
}
PrintToDisplay();
}
String BTC(byte tempo){
String tempotext;
switch (tempo){
case 0:
tempotext = "00";
break;
case 1:
tempotext = "01";
break;
case 2:
tempotext = "02";
break;
case 3:
tempotext = "03";
break;
case 4:
tempotext = "04";
break;
case 5:
tempotext = "05";
break;
case 6:
tempotext = "06";
break;
case 7:
tempotext = "07";
break;
case 8:
tempotext = "08";
break;
case 9:
tempotext = "09";
break;
case 10:
tempotext = "10";
break;
default:
tempotext = String(tempo, DEC);
break;
}
return tempotext;
}
void PrintToDisplay(){
String sDay, sMonth, sYear, sOggi, sSecond, sMinute, sHour, sTemp, sDataAlba;
int mdg;
temp = ( 5.0 * analogRead(inPin) * 100.0) / 1024.0;
fotoresistenzaValue = analogRead(fotoresistenzaPin);
getDateDs1307();
lcd.setCursor(0,0);
sDay = BTC(dayOfMonth);
sMonth = BTC(month);
sYear = BTC(year);
sHour = BTC(hour);
sMinute = BTC(minute);
sTemp = BTC(temp);
lcd.print(sDay);
lcd.print("/");
lcd.print(sMonth);
lcd.print("/");
lcd.print(sYear);
lcd.print(" ");
lcd.print(sHour);
lcd.print(":");
lcd.print(sMinute);
lcd.setCursor(0, 1);
mdg = (hour*60)+minute;
lcd.print(mdg);
lcd.print(" ");
lcd.print(fotoresistenzaValue);
lcd.print(" ");
lcd.print(stato);
lcd.print(" ");
lcd.print(temp);
lcd.print("C ");
}
Scusate la scarsa leggibilità del codice.
Al momento sembra funzionare il tutto, è già da un mese che è attivo e non ho avuto ancora problemi, ma solo il tempo mi dirà se ho fatto tutto bene.
Quello che vorrei integrare adesso è un’interfaccia di input con un menù per poter regolare gli “x minuti” eventualmente accendere il led bypassando il tutto e spegnerli rimettendo tutto in funzione, ecc…
Per input vorrei utilizzare il sensore IR e un telecomando con questa libreria A Multi-Protocol Infrared Remote Library for the Arduino o, secondo voi è più semplice il pad 4x4.
Per il menù sto utilizzando questa guida Tutorial: come gestire menu e display LCD con Arduino – Coagula – Giuseppe Di Cillo
Naturalmente vi chiedo un consiglio per migliorare il tutto, sia l’hw sia il sw, perché come ben si vede sono alle prime armi.