Illuminazione a LED

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.

Perché funzioni il Transistore che pilota la striscia di LEd devi collegare la massa dell'alimentazione LEd con la massa Arduino.
Ciao Uwe