Visualizza la versione completa : codice display e alba/tramonto arduino. eccolo!
superpozzy
11-11-2011, 21:18
visto che qualcuno me lo chiede in mp e se ne parla giusto qua in giro adesso, vi posto il codice alba/tramonto e display.
chiaramente:
1) dovete adattare i collegamenti al VOSTRO display, perchè non tutti funzionano allo stesso modo. questo è per schermi hitachi HD44780 e compatibili... il mio è 20x4
ho lasciato tutta la parte decrittiva per mia comodità. voi potete anche cancellarvela... ;-);
2) dovete avere un RTC;
3) è fatta per mia esigenza, quindi ha tre stringhe per le mie 3 tipologie di led: "progfreddo" sono i 20.000°K, "progcaldo" i 10.000°K e "progblu" i royal blu.
4) la stringa alba/tramonto ha segnato sopra l'orario che va da 00 (mezzanotte) a 23 (secondo voi?) e sotto le 3 stringhe con la PERCENTUALE di luminosità di quei led che varia in 60 minuti.
perciò se dalle 9 alle 10 la stringa dei led varia da 50 a 100, significa che in un'ora raggiunge il 100%.
se volete farlo in più tempo basta che allungate i tempi (es. ore 9 50%, ore 10 75%, ore 11 100%).
tutto quello che so l'ho scritto.
ora arrangiatevi! -28
ps: chiaramente lo sketch non visualizza HELLO WORLD come scritto.... ;-)
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
const int Button1 = 0;
const int Button2 = 1;
const int LedFreddo = 9, LedCaldo = 10, LedBlu = 11;
int posx=0,posy=1;
LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
String MenuArray[5][5]={{"Titolo 1" ,"Titolo 2" ,"Titolo 3" ,"Titolo 4" ,"Titolo 5"},
{"Submenu 1 1","Submenu 2 1","Submenu 3 1","Submenu 4 1","Submenu 5 1"},
{"Submenu 1 2","Submenu 2 2","Submenu 3 2","Submenu 4 2","Submenu 5 2"},
{"Submenu 1 3","Submenu 2 3","Submenu 3 3","Submenu 4 3","Submenu 5 3"},
{"Submenu 1 4","Submenu 2 4","Submenu 3 4","Submenu 4 4","Submenu 5 4"} } ;
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
const int ProgFreddo[24]={ 0, 0, 0, 0, 0, 1, 5, 30, 70,100,100,100,100,100,100,100,100,100, 40, 20, 10, 0, 0, 0};
const int ProgCaldo[24]= { 0, 0, 0, 0, 0, 0, 0, 3, 30, 70,100,100,100,100,100, 70,100,100,100, 70, 0, 0, 0, 0};
const int ProgBlu[24]= { 4, 4, 4, 4, 4, 6, 15, 30, 50, 70,100,100, 80, 50, 50,100,100,100,100,100,100, 50, 4, 4};
int OutFreddo, OutCaldo, OutBlu;
void setup() {
Serial.begin(9600);
pinMode(Button1, INPUT);
pinMode(Button2, INPUT);
pinMode(LedFreddo, OUTPUT);
pinMode(LedCaldo, OUTPUT);
pinMode(LedBlu, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(20, 4);
// Print a message to the LCD.
setSyncProvider(RTC.get); // the function to get the time from the RTC
}
void loop() {
int i;
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
CalcolaLed();
VisualizzaOra();
delay(1000);
// print the number of seconds since reset:
lcd.clear();
}
void DisplayMenu() {
if (!digitalRead(Button1)==HIGH) {
posx++;
if (posx>4) posx=0;
}
if (!digitalRead(Button2)==HIGH) {
posy++;
if (posy>4) posy=1;
}
lcd.setCursor(4,2) ;
lcd.print(MenuArray[0][posx]);
lcd.setCursor(4,3) ;
lcd.print(MenuArray[posy][posx]);
}
void VisualizzaOra(){
lcd.setCursor(12,0);
if (hour()<10) lcd.print("0");
lcd.print(hour());
lcd.print(":");
if (minute()<10) lcd.print("0");
lcd.print(minute());
lcd.print(":");
if (second()<10) lcd.print("0");
lcd.print(second());
}
void CalcolaLed() {
int OraAttuale, OraFutura, Minuto, Differenza;
float Incremento, Attuale, T1;
OraAttuale= hour()%24;
OraFutura = (OraAttuale+1)%24;
Minuto=minute();
//---------------------------------------------------------------------------
Differenza=ProgFreddo[OraFutura]-ProgFreddo[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgFreddo[OraAttuale];
OutFreddo= Attuale * 255 / 100 ;
lcd.setCursor(0,0);
lcd.print("F:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
Differenza=ProgCaldo[OraFutura]-ProgCaldo[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgCaldo[OraAttuale];
OutCaldo= Attuale * 255 / 100 ;
lcd.setCursor(0,1);
lcd.print("C:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
Differenza=ProgBlu[OraFutura]-ProgBlu[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgBlu[OraAttuale];
OutBlu= Attuale * 255 / 100 ;
lcd.setCursor(0,2);
lcd.print("B:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
analogWrite(LedFreddo, OutFreddo);
analogWrite(LedCaldo, OutCaldo);
analogWrite(LedBlu, OutBlu);
T1=analogRead(A0)*0.49;
lcd.setCursor(0,3);
lcd.print("T:");
lcd.print((int)T1);
}
pps: io ho usato mosfet per il pwm.
ppps: qua non me lo incolonna giusto, penso che nel programma di arduino lo faccia...
pppps: prima di dire che non funziona, controllate BENE i vostri collegamenti... -28
Ciccio66
11-11-2011, 21:32
GrandeSimone...ma non ci capisco una mazza.....
Ovvio non ho l'arduino...ma ho Gino il facchino....
zebrasoma78
11-11-2011, 21:33
Bravo simo!!!#70
Deduco che a te funzioni....
chiedo troppo per un video??? ( ovviamente dovresti stringere di molto i tempi...) ma era per capite se fa gli scatti tra un valore e l'altro....
ciauz!
superpozzy
11-11-2011, 21:40
è questo.
è un po' vecchio e con i collegamenti ancora provvisori, ma si capisce...
sembra che sia montato e ci siano dei cambi frame, ma è il flash dei led che sballa il sensore della camera...
http://www.youtube.com/watch?v=X5dUxTea6Xs
billykid591
12-11-2011, 10:18
visto che qualcuno me lo chiede in mp e se ne parla giusto qua in giro adesso, vi posto il codice alba/tramonto e display.
chiaramente:
1) dovete adattare i collegamenti al VOSTRO display, perchè non tutti funzionano allo stesso modo. questo è per schermi hitachi HD44780 e compatibili... il mio è 20x4
ho lasciato tutta la parte decrittiva per mia comodità. voi potete anche cancellarvela... ;-);
2) dovete avere un RTC;
3) è fatta per mia esigenza, quindi ha tre stringhe per le mie 3 tipologie di led: "progfreddo" sono i 20.000°K, "progcaldo" i 10.000°K e "progblu" i royal blu.
4) la stringa alba/tramonto ha segnato sopra l'orario che va da 00 (mezzanotte) a 23 (secondo voi?) e sotto le 3 stringhe con la PERCENTUALE di luminosità di quei led che varia in 60 minuti.
perciò se dalle 9 alle 10 la stringa dei led varia da 50 a 100, significa che in un'ora raggiunge il 100%.
se volete farlo in più tempo basta che allungate i tempi (es. ore 9 50%, ore 10 75%, ore 11 100%).
tutto quello che so l'ho scritto.
ora arrangiatevi! -28
ps: chiaramente lo sketch non visualizza HELLO WORLD come scritto.... ;-)
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
const int Button1 = 0;
const int Button2 = 1;
const int LedFreddo = 9, LedCaldo = 10, LedBlu = 11;
int posx=0,posy=1;
LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
String MenuArray[5][5]={{"Titolo 1" ,"Titolo 2" ,"Titolo 3" ,"Titolo 4" ,"Titolo 5"},
{"Submenu 1 1","Submenu 2 1","Submenu 3 1","Submenu 4 1","Submenu 5 1"},
{"Submenu 1 2","Submenu 2 2","Submenu 3 2","Submenu 4 2","Submenu 5 2"},
{"Submenu 1 3","Submenu 2 3","Submenu 3 3","Submenu 4 3","Submenu 5 3"},
{"Submenu 1 4","Submenu 2 4","Submenu 3 4","Submenu 4 4","Submenu 5 4"} } ;
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
const int ProgFreddo[24]={ 0, 0, 0, 0, 0, 1, 5, 30, 70,100,100,100,100,100,100,100,100,100, 40, 20, 10, 0, 0, 0};
const int ProgCaldo[24]= { 0, 0, 0, 0, 0, 0, 0, 3, 30, 70,100,100,100,100,100, 70,100,100,100, 70, 0, 0, 0, 0};
const int ProgBlu[24]= { 4, 4, 4, 4, 4, 6, 15, 30, 50, 70,100,100, 80, 50, 50,100,100,100,100,100,100, 50, 4, 4};
int OutFreddo, OutCaldo, OutBlu;
void setup() {
Serial.begin(9600);
pinMode(Button1, INPUT);
pinMode(Button2, INPUT);
pinMode(LedFreddo, OUTPUT);
pinMode(LedCaldo, OUTPUT);
pinMode(LedBlu, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(20, 4);
// Print a message to the LCD.
setSyncProvider(RTC.get); // the function to get the time from the RTC
}
void loop() {
int i;
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
CalcolaLed();
VisualizzaOra();
delay(1000);
// print the number of seconds since reset:
lcd.clear();
}
void DisplayMenu() {
if (!digitalRead(Button1)==HIGH) {
posx++;
if (posx>4) posx=0;
}
if (!digitalRead(Button2)==HIGH) {
posy++;
if (posy>4) posy=1;
}
lcd.setCursor(4,2) ;
lcd.print(MenuArray[0][posx]);
lcd.setCursor(4,3) ;
lcd.print(MenuArray[posy][posx]);
}
void VisualizzaOra(){
lcd.setCursor(12,0);
if (hour()<10) lcd.print("0");
lcd.print(hour());
lcd.print(":");
if (minute()<10) lcd.print("0");
lcd.print(minute());
lcd.print(":");
if (second()<10) lcd.print("0");
lcd.print(second());
}
void CalcolaLed() {
int OraAttuale, OraFutura, Minuto, Differenza;
float Incremento, Attuale, T1;
OraAttuale= hour()%24;
OraFutura = (OraAttuale+1)%24;
Minuto=minute();
//---------------------------------------------------------------------------
Differenza=ProgFreddo[OraFutura]-ProgFreddo[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgFreddo[OraAttuale];
OutFreddo= Attuale * 255 / 100 ;
lcd.setCursor(0,0);
lcd.print("F:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
Differenza=ProgCaldo[OraFutura]-ProgCaldo[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgCaldo[OraAttuale];
OutCaldo= Attuale * 255 / 100 ;
lcd.setCursor(0,1);
lcd.print("C:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
Differenza=ProgBlu[OraFutura]-ProgBlu[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgBlu[OraAttuale];
OutBlu= Attuale * 255 / 100 ;
lcd.setCursor(0,2);
lcd.print("B:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
analogWrite(LedFreddo, OutFreddo);
analogWrite(LedCaldo, OutCaldo);
analogWrite(LedBlu, OutBlu);
T1=analogRead(A0)*0.49;
lcd.setCursor(0,3);
lcd.print("T:");
lcd.print((int)T1);
}
pps: io ho usato mosfet per il pwm.
ppps: qua non me lo incolonna giusto, penso che nel programma di arduino lo faccia...
pppps: prima di dire che non funziona, controllate BENE i vostri collegamenti... -28
Un lavoro interessante e codice snello però ho due critiche (senza offesa si intende) da farti la prima riguarda l'uso del delay (di 1 secondo) nel Loop...così facendo blocchi il programma e l'uso dei tasti menu viene ritardato.......secondo non mi piace l'uso degli array predefiniti per l'alba tramonto..non puoi da menu scegliere i tempi di accensione spegnimento e..con passi predefiniti ho l'impressione che la dimmerazione venga scattosa....potevi sfruttare di più l'RTC........appena posso posterò il codice che sto usando io per la prossima plafo che sto relaizzando (anche se è per il dolce).....è preso in parte da altre realizzazioni (vedi typhoon)...e modificato....di contro rispetto al tuo è decisamente molto più lungo anche se più completo.
superpozzy
12-11-2011, 11:24
si, infatti io ho fatto il più semplice possibile. era, diciamo, più che altro un programmino provvisorio per vedere su funzionava il tutto...
e poi non ho avuto più voglia di modificarlo... :-))
comunque posso dirti che perlomeno non è scattoso...
ps: non l'ho fatto io, eh! ma mio cugino ing. io non c'ho capito un caxxo! :-D
il mio problema più grosso è non far sciogliere il mosfet, a causa dei 4/5A che ci passano dentro....
allora aspetto il tuo per provarlo! -28
billykid591
12-11-2011, 15:10
si, infatti io ho fatto il più semplice possibile. era, diciamo, più che altro un programmino provvisorio per vedere su funzionava il tutto...
e poi non ho avuto più voglia di modificarlo... :-))
comunque posso dirti che perlomeno non è scattoso...
ps: non l'ho fatto io, eh! ma mio cugino ing. io non c'ho capito un caxxo! :-D
il mio problema più grosso è non far sciogliere il mosfet, a causa dei 4/5A che ci passano dentro....
allora aspetto il tuo per provarlo! -28
Il mio è fatto per pilotare dei driver appositi con ingresso dimmerabile PWM...ciò non toglie che può essere collegato a dei mosfet
superpozzy
12-11-2011, 15:35
mi fai vedere i driver?
billykid591
12-11-2011, 18:27
mi fai vedere i driver?
sono dei semplici driver comprati su ebay da un venditore Cinese (un classico)..sono da 350 ma e 700 ma (ma ci sono anche altri tipi)..puoi comandare fino a 6 7 led (da 1 o 3 w) per ognuno.....dipende dall'alimentazione (io li alimento a 24 volt)
superpozzy
12-11-2011, 18:39
eh, io li ho da 10w i led...
va beh, dai, aspetto il tuo codice!
Carletto73
12-11-2011, 21:17
Sperando che sia leggibile posto un mio programmino che gestisce 9 pwm per le luci (blu dx e sx, 10000K dx e sx, 20000K dx e sx e rgb).
io uso l'arduino mega per via dei display. come interfaccia utente ha solo il web per ora.
possiede un log per salvare sulla memory i dati della vasca secondo per secondo
// Include delle librerie usate
#include "EtherShield.h" // EtherShield_1.6.zip
#include <SD.h> // Inclusa
#include "Wire.h" // Inclusa
#include <EEPROM.h> // Inclusa
// Definizione pin utilizzati
#define SD_INT 2
#define PWM_BLU_SX 3
#define SD_CS 4
#define PWM_BLU_DX 5
#define PWM_10K_SX 6
#define PWM_10K_DX 7
#define PWM_20K_SX 8
#define PWM_20K_DX 9
#define PWM_RGB_RED 10
#define PWM_RGB_GREEN 11
#define PWM_RGB_BLUE 12
#define LED_ONBOARD 13
#define I2C_SDA 20
#define I2C_SCL 21
#define SPI_MISO 50
#define SPI_MOSI 51
#define SPI_SCK 52
#define ENC28J60_CONTROL_CS 53
// please modify the following two lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x25};
static uint8_t myip[4] = {192,168,1,25};
static uint8_t buf[BUFFER_SIZE + 1];
static char strbuf[STR_BUFFER_SIZE];
static long msLogger;
static long msResetWeb;
static unsigned long msCurrent;
static long msLastUpdateBluDx;
static long msLastUpdateBluSx;
static long msLastUpdate10kDx;
static long msLastUpdate10kSx;
static long msLastUpdate20kDx;
static long msLastUpdate20kSx;
static long msLastUpdateRRGB;
static long msLastUpdateGRGB;
static long msLastUpdateBRGB;
static long msLastUpdateRTC;
static int sdError;
static int sdLogInCorso;
static File sdDataFile;
static String sdDataString;
static int rtcSecond;
static int rtcMinute;
static int rtcHour;
static int rtcWeekDay;
static int rtcMonthDay;
static int rtcMonth;
static int rtcYear;
static int luciOraAccensione;
static int luciMinutoAccensione;
static int luciMinutiDurataAlba;
static int luciOreAccensioneCompleta;
static int luciMinutiAccensioneCompleta;
static int luciMinutiDurataTramonto;
static int luciTargetBluSx;
static int luciTargetBluDx;
static int luciTarget10kSx;
static int luciTarget10kDx;
static int luciTarget20kSx;
static int luciTarget20kDx;
static int luciTargetRRGB;
static int luciTargetGRGB;
static int luciTargetBRGB;
static int luciTipoAlbaTramonto; // bit 0 (prima blu poi bianchi), bit 1 (effetto est/ovest)
static int luciTargetRRGBLunare;
static int luciTargetGRGBLunare;
static int luciTargetBRGBLunare;
static int luciCurrentBluDx;
static int luciCurrentBluSx;
static int luciCurrent10kDx;
static int luciCurrent10kSx;
static int luciCurrent20kDx;
static int luciCurrent20kSx;
static int luciCurrentRRGB;
static int luciCurrentGRGB;
static int luciCurrentBRGB;
//static int secondoCorrente;
//static int secondoAccensioneBluDx;
//static int secondoAccensioneBluSx;
//static int secondoAccensioneBiancoDx;
//static int secondoAccensioneBiancoSx;
//static int secondoSpegnimentoBluDx;
//static int secondoSpegnimentoBluSx;
//static int secondoSpegnimentoBiancoDx;
//static int secondoSpegnimentoBiancoSx;
//static int decimiSecondoIncrementoBluDx;
//static int decimiSecondoIncrementoBluSx;
//static int decimiSecondoIncremento10kDx;
//static int decimiSecondoIncremento10kSx;
//static int decimiSecondoIncremento20kDx;
//static int decimiSecondoIncremento20kSx;
//static int decimiSecondoIncrementoRRGB;
//static int decimiSecondoIncrementoGRGB;
//static int decimiSecondoIncrementoBRGB;
//static int decimiSecondoDecrementoBluDx;
//static int decimiSecondoDecrementoBluSx;
//static int decimiSecondoDecremento10kDx;
//static int decimiSecondoDecremento10kSx;
//static int decimiSecondoDecremento20kDx;
//static int decimiSecondoDecremento20kSx;
//static int decimiSecondoDecrementoRRGB;
//static int decimiSecondoDecrementoGRGB;
//static int decimiSecondoDecrementoBRGB;
//static int luceBluDxAccesa;
//static int luceBluSxAccesa;
//static int luceBiancaDxAccesa;
//static int luceBiancaSxAccesa;
//static int luceRGBDiurnaAccesa;
// Include dei files del programma
#include "luci.h"
#include "web.h"
#include "sd.h"
#include "rtc.h"
void setup()
{
msCurrent = 0;
// Serial.begin(9600);
// Serial.println("inizio");
inizializza_enc28j60();
inizializza_sd();
inizializza_rtc();
inizializza_luci();
}
void loop()
{
msCurrent = millis();
rtc_getDateTime();
gestione_luci();
logger_sd();
webserver();
// Serial.println("inizio ----------------------------");
// Serial.print("secondoCorrente: ");
// Serial.println(secondoCorrente);
// Serial.print("luceBluDxAccesa: ");
// Serial.println(luceBluDxAccesa);
// Serial.print("luceBluSxAccesa: ");
// Serial.println(luceBluSxAccesa);
// Serial.print("luceBiancaDxAccesa: ");
// Serial.println(luceBiancaDxAccesa);
// Serial.print("luceBiancaSxAccesa: ");
// Serial.println(luceBiancaSxAccesa);
// Serial.print("luceRGBDiurnaAccesa: ");
// Serial.println(luceRGBDiurnaAccesa);
//
// Serial.print("luciCurrentBluDx: ");
// Serial.println(luciCurrentBluDx);
// Serial.print("luciCurrentBluSx: ");
// Serial.println(luciCurrentBluSx);
// Serial.print("luciCurrent10kDx: ");
// Serial.println(luciCurrent10kDx);
// Serial.print("luciCurrent10kSx: ");
// Serial.println(luciCurrent10kSx);
// Serial.print("luciCurrent20kDx: ");
// Serial.println(luciCurrent20kDx);
// Serial.print("luciCurrent20kSx: ");
// Serial.println(luciCurrent20kSx);
// Serial.print("luciCurrentRRGB: ");
// Serial.println(luciCurrentRRGB);
// Serial.print("luciCurrentGRGB: ");
// Serial.println(luciCurrentGRGB);
// Serial.print("luciCurrentBRGB: ");
// Serial.println(luciCurrentBRGB);
}
luci.h
#define INDIRIZZOLUCIORAACCENSIONE 0
#define INDIRIZZOLUCIMINUTOACCENSIONE 1
#define INDIRIZZOLUCIMINUTIDURATAALBA 2
#define INDIRIZZOLUCIOREACCENSIONECOMPLETA 3
#define INDIRIZZOLUCIMINUTIACCENSIONECOMPLETA 4
#define INDIRIZZOLUCIMINUTIDURATATRAMANTO 5
#define INDIRIZZOLUCITARGETBLUSX 6
#define INDIRIZZOLUCITARGETBLUDX 7
#define INDIRIZZOLUCITARGET10KSX 8
#define INDIRIZZOLUCITARGET10KDX 9
#define INDIRIZZOLUCITARGET20KSX 10
#define INDIRIZZOLUCITARGET20KDX 11
#define INDIRIZZOLUCITARGETRRGB 12
#define INDIRIZZOLUCITARGETGRGB 13
#define INDIRIZZOLUCITARGETBRGB 14
#define INDIRIZZOLUCITIPOALBATRAMONTO 15
#define INDIRIZZOLUCITARGETRRGBLUNARE 16
#define INDIRIZZOLUCITARGETGRGBLUNARE 17
#define INDIRIZZOLUCITARGETBRGBLUNARE 18
void inizializza_luci()
{
luciOraAccensione = EEPROM.read(INDIRIZZOLUCIORAACCENSIONE);
luciMinutoAccensione = EEPROM.read(INDIRIZZOLUCIMINUTOACCENSIONE);
luciMinutiDurataAlba = EEPROM.read(INDIRIZZOLUCIMINUTIDURATAALBA);
luciOreAccensioneCompleta = EEPROM.read(INDIRIZZOLUCIOREACCENSIONECOMPLETA);
luciMinutiAccensioneCompleta = EEPROM.read(INDIRIZZOLUCIMINUTIACCENSIONECOMPLETA) ;
luciMinutiDurataTramonto = EEPROM.read(INDIRIZZOLUCIMINUTIDURATATRAMANTO);
luciTargetBluSx = EEPROM.read(INDIRIZZOLUCITARGETBLUSX);
luciTargetBluDx = EEPROM.read(INDIRIZZOLUCITARGETBLUDX);
luciTarget10kSx = EEPROM.read(INDIRIZZOLUCITARGET10KSX);
luciTarget10kDx = EEPROM.read(INDIRIZZOLUCITARGET10KDX);
luciTarget20kSx = EEPROM.read(INDIRIZZOLUCITARGET20KSX);
luciTarget20kDx = EEPROM.read(INDIRIZZOLUCITARGET20KDX);
luciTargetRRGB = EEPROM.read(INDIRIZZOLUCITARGETRRGB);
luciTargetGRGB = EEPROM.read(INDIRIZZOLUCITARGETGRGB);
luciTargetBRGB = EEPROM.read(INDIRIZZOLUCITARGETBRGB);
luciTipoAlbaTramonto = EEPROM.read(INDIRIZZOLUCITIPOALBATRAMONTO);
luciTargetRRGBLunare = EEPROM.read(INDIRIZZOLUCITARGETRRGBLUNARE);
luciTargetGRGBLunare = EEPROM.read(INDIRIZZOLUCITARGETGRGBLUNARE);
luciTargetBRGBLunare = EEPROM.read(INDIRIZZOLUCITARGETBRGBLUNARE);
luciCurrentBluDx = 0;
luciCurrentBluSx = 0;
luciCurrent10kDx = 0;
luciCurrent10kSx = 0;
luciCurrent20kDx = 0;
luciCurrent20kSx = 0;
luciCurrentRRGB = 0;
luciCurrentGRGB = 0;
luciCurrentBRGB = 0;
}
void gestione_luci()
{
int secondoCorrente;
int secondoAccensioneBluDx;
int secondoAccensioneBluSx;
int secondoAccensioneBiancoDx;
int secondoAccensioneBiancoSx;
int secondoSpegnimentoBluDx;
int secondoSpegnimentoBluSx;
int secondoSpegnimentoBiancoDx;
int secondoSpegnimentoBiancoSx;
int decimiSecondoIncrementoBluDx;
int decimiSecondoIncrementoBluSx;
int decimiSecondoIncremento10kDx;
int decimiSecondoIncremento10kSx;
int decimiSecondoIncremento20kDx;
int decimiSecondoIncremento20kSx;
int decimiSecondoIncrementoRRGB;
int decimiSecondoIncrementoGRGB;
int decimiSecondoIncrementoBRGB;
int decimiSecondoDecrementoBluDx;
int decimiSecondoDecrementoBluSx;
int decimiSecondoDecremento10kDx;
int decimiSecondoDecremento10kSx;
int decimiSecondoDecremento20kDx;
int decimiSecondoDecremento20kSx;
int decimiSecondoDecrementoRRGB;
int decimiSecondoDecrementoGRGB;
int decimiSecondoDecrementoBRGB;
int luceBluDxAccesa;
int luceBluSxAccesa;
int luceBiancaDxAccesa;
int luceBiancaSxAccesa;
int luceRGBDiurnaAccesa;
int obiettivoBluDx;
int obiettivoBluSx;
int obiettivo10kDx;
int obiettivo10kSx;
int obiettivo20kDx;
int obiettivo20kSx;
int obiettivoRRGB;
int obiettivoGRGB;
int obiettivoBRGB;
secondoCorrente = (rtcHour * 360) + (rtcMinute * 6) + (rtcSecond / 10);
secondoAccensioneBluDx = (luciOraAccensione * 360) + (luciMinutoAccensione * 6);
secondoSpegnimentoBiancoDx = secondoAccensioneBluDx + (luciMinutiDurataAlba * 6) + (luciOreAccensioneCompleta * 360) + (luciMinutiAccensioneCompleta * 6);
if (luciTipoAlbaTramonto == 0)
{
secondoAccensioneBluSx = secondoAccensioneBluDx;
secondoAccensioneBiancoDx = secondoAccensioneBluDx;
secondoAccensioneBiancoSx = secondoAccensioneBluDx;
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx;
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx;
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx;
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 600) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 600) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 600) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 600) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 600) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 600) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 600) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 600) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 600) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 600) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 600) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 600) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
else if (luciTipoAlbaTramonto == 1)
{
secondoAccensioneBluSx = secondoAccensioneBluDx;
secondoAccensioneBiancoDx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoAccensioneBiancoSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx;
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
else if (luciTipoAlbaTramonto == 2)
{
secondoAccensioneBluSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoAccensioneBiancoDx = secondoAccensioneBluDx;
secondoAccensioneBiancoSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx;
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
else
{
secondoAccensioneBluSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 4);
secondoAccensioneBiancoDx = secondoAccensioneBluDx + (((luciMinutiDurataAlba * 6) / 4) * 2);
secondoAccensioneBiancoSx = secondoAccensioneBluDx + (((luciMinutiDurataAlba * 6) / 4) * 3);
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx + (((luciMinutiDurataTramonto * 6) / 4) * 2);
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx + (((luciMinutiDurataTramonto * 6) / 4) * 3);
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 4);
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 150) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 150) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 150) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 150) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 150) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 150) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 150) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 150) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 150) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 150) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 150) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 150) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
if (secondoAccensioneBluSx > 8639) {secondoAccensioneBluSx = secondoAccensioneBluSx - 8640;}
if (secondoAccensioneBiancoDx > 8639) {secondoAccensioneBiancoDx = secondoAccensioneBiancoDx - 8640;}
if (secondoAccensioneBiancoSx > 8639) {secondoAccensioneBiancoSx = secondoAccensioneBiancoSx - 8640;}
if (secondoSpegnimentoBluDx > 8639) {secondoSpegnimentoBluDx = secondoSpegnimentoBluDx - 8640;}
if (secondoSpegnimentoBluSx > 8639) {secondoSpegnimentoBluSx = secondoSpegnimentoBluSx - 8640;}
if (secondoSpegnimentoBiancoDx > 8639) {secondoSpegnimentoBiancoDx = secondoSpegnimentoBiancoDx - 8640;}
if (secondoSpegnimentoBiancoSx > 8639) {secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoSx - 8640;}
luceBluDxAccesa = 0;
luceBluSxAccesa = 0;
luceBiancaDxAccesa = 0;
luceBiancaSxAccesa = 0;
luceRGBDiurnaAccesa = 0;
if (secondoAccensioneBluDx < secondoSpegnimentoBluDx) {if ((secondoCorrente >= secondoAccensioneBluDx) && (secondoCorrente < secondoSpegnimentoBluDx)) {luceBluDxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBluDx) || (secondoCorrente < secondoSpegnimentoBluDx)) {luceBluDxAccesa = 1;}}
if (secondoAccensioneBluSx < secondoSpegnimentoBluSx) {if ((secondoCorrente >= secondoAccensioneBluSx) && (secondoCorrente < secondoSpegnimentoBluSx)) {luceBluSxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBluSx) || (secondoCorrente < secondoSpegnimentoBluSx)) {luceBluSxAccesa = 1;}}
if (secondoAccensioneBiancoDx < secondoSpegnimentoBiancoDx) {if ((secondoCorrente >= secondoAccensioneBiancoDx) && (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceBiancaDxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBiancoDx) || (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceBiancaDxAccesa = 1;}}
if (secondoAccensioneBiancoSx < secondoSpegnimentoBiancoSx) {if ((secondoCorrente >= secondoAccensioneBiancoSx) && (secondoCorrente < secondoSpegnimentoBiancoSx)) {luceBiancaSxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBiancoSx) || (secondoCorrente < secondoSpegnimentoBiancoSx)) {luceBiancaSxAccesa = 1;}}
if (secondoAccensioneBluDx < secondoSpegnimentoBiancoDx) {if ((secondoCorrente >= secondoAccensioneBluDx) && (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceRGBDiurnaAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBluDx) || (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceRGBDiurnaAccesa = 1;}}
if (luceBluDxAccesa) {obiettivoBluDx = luciTargetBluDx;}
else {obiettivoBluDx = 0;}
if (luceBluSxAccesa) {obiettivoBluSx = luciTargetBluSx;}
else {obiettivoBluSx = 0;}
if (luceBiancaDxAccesa) {obiettivo10kDx = luciTarget10kDx;}
else {obiettivo10kDx = 0;}
if (luceBiancaSxAccesa) {obiettivo10kSx = luciTarget10kSx;}
else {obiettivo10kSx = 0;}
if (luceBiancaDxAccesa) {obiettivo20kDx = luciTarget20kDx;}
else {obiettivo20kDx = 0;}
if (luceBiancaSxAccesa) {obiettivo20kSx = luciTarget20kSx;}
else {obiettivo20kSx = 0;}
if (luceRGBDiurnaAccesa) {obiettivoRRGB = luciTargetRRGB;}
else {obiettivoRRGB = luciTargetRRGBLunare;}
if (luceRGBDiurnaAccesa) {obiettivoGRGB = luciTargetGRGB;}
else {obiettivoGRGB = luciTargetGRGBLunare;}
if (luceRGBDiurnaAccesa) {obiettivoBRGB = luciTargetBRGB;}
else {obiettivoBRGB = luciTargetBRGBLunare;}
if (luciCurrentBluDx < obiettivoBluDx)
{
if ((msCurrent - msLastUpdateBluDx) > (decimiSecondoIncrementoBluDx * 100))
{
msLastUpdateBluDx = msCurrent;
luciCurrentBluDx++;
analogWrite(PWM_BLU_DX, luciCurrentBluDx);
return;
}
}
else if (luciCurrentBluDx > obiettivoBluDx)
{
if ((msCurrent - msLastUpdateBluDx) > (decimiSecondoDecrementoBluDx * 100))
{
msLastUpdateBluDx = msCurrent;
luciCurrentBluDx--;
analogWrite(PWM_BLU_DX, luciCurrentBluDx);
return;
}
}
if (luciCurrentBluSx < obiettivoBluSx)
{
if ((msCurrent - msLastUpdateBluSx) > (decimiSecondoIncrementoBluSx * 100))
{
msLastUpdateBluSx = msCurrent;
luciCurrentBluSx++;
analogWrite(PWM_BLU_SX, luciCurrentBluSx);
return;
}
}
else if (luciCurrentBluSx > obiettivoBluSx)
{
if ((msCurrent - msLastUpdateBluSx) > (decimiSecondoDecrementoBluSx * 100))
{
msLastUpdateBluSx = msCurrent;
luciCurrentBluSx--;
analogWrite(PWM_BLU_SX, luciCurrentBluSx);
return;
}
}
if (luciCurrent10kDx < obiettivo10kDx)
{
if ((msCurrent - msLastUpdate10kDx) > (decimiSecondoIncremento10kDx * 100))
{
msLastUpdate10kDx = msCurrent;
luciCurrent10kDx++;
analogWrite(PWM_10K_DX, luciCurrent10kDx);
return;
}
}
else if (luciCurrent10kDx > obiettivo10kDx)
{
if ((msCurrent - msLastUpdate10kDx) > (decimiSecondoDecremento10kDx * 100))
{
msLastUpdate10kDx = msCurrent;
luciCurrent10kDx--;
analogWrite(PWM_10K_DX, luciCurrent10kDx);
return;
}
}
if (luciCurrent10kSx < obiettivo10kSx)
{
if ((msCurrent - msLastUpdate10kSx) > (decimiSecondoIncremento10kSx * 100))
{
msLastUpdate10kSx = msCurrent;
luciCurrent10kSx++;
analogWrite(PWM_10K_SX, luciCurrent10kSx);
return;
}
}
else if (luciCurrent10kSx > obiettivo10kSx)
{
if ((msCurrent - msLastUpdate10kSx) > (decimiSecondoDecremento10kSx * 100))
{
msLastUpdate10kSx = msCurrent;
luciCurrent10kSx--;
analogWrite(PWM_10K_SX, luciCurrent10kSx);
return;
}
}
if (luciCurrent20kDx < obiettivo20kDx)
{
if ((msCurrent - msLastUpdate20kDx) > (decimiSecondoIncremento20kDx * 100))
{
msLastUpdate20kDx = msCurrent;
luciCurrent20kDx++;
analogWrite(PWM_20K_DX, luciCurrent20kDx);
return;
}
}
else if (luciCurrent20kDx > obiettivo20kDx)
{
if ((msCurrent - msLastUpdate20kDx) > (decimiSecondoDecremento20kDx * 100))
{
msLastUpdate20kDx = msCurrent;
luciCurrent20kDx--;
analogWrite(PWM_20K_DX, luciCurrent20kDx);
return;
}
}
if (luciCurrent20kSx < obiettivo20kSx)
{
if ((msCurrent - msLastUpdate20kSx) > (decimiSecondoIncremento20kSx * 100))
{
msLastUpdate20kSx = msCurrent;
luciCurrent20kSx++;
analogWrite(PWM_20K_SX, luciCurrent20kSx);
return;
}
}
else if (luciCurrent20kSx > obiettivo20kSx)
{
if ((msCurrent - msLastUpdate20kSx) > (decimiSecondoDecremento20kSx * 100))
{
msLastUpdate20kSx = msCurrent;
luciCurrent20kSx--;
analogWrite(PWM_20K_SX, luciCurrent20kSx);
return;
}
}
if (luciCurrentRRGB < obiettivoRRGB)
{
if ((msCurrent - msLastUpdateRRGB) > (decimiSecondoIncrementoRRGB * 100))
{
msLastUpdateRRGB = msCurrent;
luciCurrentRRGB++;
analogWrite(PWM_RGB_RED, luciCurrentRRGB);
return;
}
}
else if (luciCurrentRRGB > obiettivoRRGB)
{
if ((msCurrent - msLastUpdateRRGB) > (decimiSecondoDecrementoRRGB * 100))
{
msLastUpdateRRGB = msCurrent;
luciCurrentRRGB--;
analogWrite(PWM_RGB_RED, luciCurrentRRGB);
return;
}
}
if (luciCurrentGRGB < obiettivoGRGB)
{
if ((msCurrent - msLastUpdateGRGB) > (decimiSecondoIncrementoGRGB * 100))
{
msLastUpdateGRGB = msCurrent;
luciCurrentGRGB++;
analogWrite(PWM_RGB_GREEN, luciCurrentGRGB);
return;
}
}
else if (luciCurrentGRGB > obiettivoGRGB)
{
if ((msCurrent - msLastUpdateGRGB) > (decimiSecondoDecrementoGRGB * 100))
{
msLastUpdateGRGB = msCurrent;
luciCurrentGRGB--;
analogWrite(PWM_RGB_GREEN, luciCurrentGRGB);
return;
}
}
if (luciCurrentBRGB < obiettivoBRGB)
{
if ((msCurrent - msLastUpdateBRGB) > (decimiSecondoIncrementoBRGB * 100))
{
msLastUpdateBRGB = msCurrent;
luciCurrentBRGB++;
analogWrite(PWM_RGB_BLUE, luciCurrentBRGB);
return;
}
}
else if (luciCurrentBRGB > obiettivoBRGB)
{
if ((msCurrent - msLastUpdateBRGB) > (decimiSecondoDecrementoBRGB * 100))
{
msLastUpdateBRGB = msCurrent;
luciCurrentBRGB--;
analogWrite(PWM_RGB_BLUE, luciCurrentBRGB);
return;
}
}
}
segue ....
Carletto73
12-11-2011, 21:17
..... continua
pagine.h
uint16_t http200ok(void) {return(es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n")));}
// prepare the webpage by writing the data to the tcp send buffer
uint16_t homepage(uint8_t *buf)
{
uint16_t plen;
plen = http200ok();
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><body>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<b>ACQUARIO</b><hr>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<a href=\"../?sez=4\">ILLUMINAZIONE<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<a href=\"../?sez=8\">SETUP OROLOGIO<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<a href=\"../?sez=9\">SD/LOGGER<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr>by Carlo COLOMBARI</body></html>"));
return(plen);
}
uint16_t page_logger(uint8_t *buf)
{
uint16_t plen;
plen = http200ok();
if (sdLogInCorso == 0) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><body>"));}
else {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><meta http-equiv=\"refresh\" content=\"3\"><body>"));}
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<b>SD/LOGGER</b><hr>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Stato SD card: "));
if (sdError == 0) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Ok</br>"));}
if (sdError == 1) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Non presente (trovato all'accensione)</br>"));}
if (sdError == 2) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("File logger.txt corrotto (trovato all'accensione)</br>"));}
if (sdError == 3) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("File logger.txt vuoto (trovato all'accensione)</br>"));}
if (sdError == 4) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("File logger.txt non esistente (trovato all'accensione)</br>"));}
if (sdError == 5) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("File logger.txt corrotto (trovato durante un log)</br>"));}
if (sdError == 6) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("File logger.txt vuoto (trovato durante un log)</br>"));}
if (sdError == 7) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("File logger.txt non esistente (trovato durante un log)</br>"));}
if (sdLogInCorso == 0)
{
if (sdError)
{
if ((sdError != 1) && (sdError != 2) && (sdError != 3) && (sdError != 6)) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Log: Fermo <a href=\"../?sez=9&act=3\">(TENTATIVO DI RIPRISTINO)<a></br>"));}
if ((sdError == 2) || (sdError == 3) || (sdError == 6)) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Formattazione SD <a href=\"../?sez=9&act=4\">(FORMATTA)<a></br>"));}
}
else
{
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Log: Fermo <a href=\"../?sez=9&act=1\">(ATTIVA)<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Formattazione SD <a href=\"../?sez=9&act=4\">(FORMATTA)<a></br>"));
}
}
else {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Log: In corso <a href=\"../?sez=9&act=2\">(DISATTIVA)<a></br>"));}
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><a href=\"..\"><<< INDIETRO<a></body></html>"));
return(plen);
}
uint16_t page_orologio(uint8_t *buf)
{
char* stringa = "";
uint16_t plen;
plen = http200ok();
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><body>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<b>SETUP OROLOGIO</b><hr>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Ora: <a href=\"../?sez=8&act=1\">(+)<a> <a href=\"../?sez=8&act=2\">(-)<a> "));
if (rtcHour < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",rtcHour);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(":"));
if (rtcMinute < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",rtcMinute);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=8&act=3\">(+)<a> <a href=\"../?sez=8&act=4\">(-)<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Giorno: "));
if (rtcMonthDay < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",rtcMonthDay);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
sprintf(stringa,"%d",rtcMonthDay);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=8&act=5\">(+)<a> <a href=\"../?sez=8&act=6\">(-)<a> "));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Mese: "));
if (rtcMonth == 1) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Gennaio"));}
if (rtcMonth == 2) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Febbraio"));}
if (rtcMonth == 3) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Marzo"));}
if (rtcMonth == 4) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Aprile"));}
if (rtcMonth == 5) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Maggio"));}
if (rtcMonth == 6) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Giugno"));}
if (rtcMonth == 7) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Luglio"));}
if (rtcMonth == 8) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Agosto"));}
if (rtcMonth == 9) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Settembre"));}
if (rtcMonth == 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Ottobre"));}
if (rtcMonth == 11) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Novembre"));}
if (rtcMonth == 12) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Dicembre"));}
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=8&act=7\">(Cambia)<a> "));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Anno: 20"));
sprintf(stringa,"%d",rtcYear);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=8&act=8\">(+)<a> <a href=\"../?sez=8&act=9\">(-)<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Giorno della settimana: "));
if (rtcWeekDay == 1) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Domenica"));}
if (rtcWeekDay == 2) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Lunedì"));}
if (rtcWeekDay == 3) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Martedì"));}
if (rtcWeekDay == 4) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Mercoledì"));}
if (rtcWeekDay == 5) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Giovedì"));}
if (rtcWeekDay == 6) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Venerdì"));}
if (rtcWeekDay == 7) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Sabato"));}
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=8&act=0\">(Cambia)<a>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><a href=\"..\"><<< INDIETRO<a></body></html>"));
return(plen);
}
uint16_t page_illuminazione(uint8_t *buf)
{
uint16_t plen;
plen = http200ok();
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><body>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<b>ILLUMINAZIONE</b><hr>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<a href=\"../?sez=4&cmd=1\">SETUP FOTOPERIODO<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<a href=\"../?sez=4&cmd=3\">SETUP POTENZA/TEMPERATURA<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<a href=\"../?sez=4&cmd=5\">SETUP EFFETTI LUCE<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><a href=\"..\"><<< INDIETRO<a></body></html>"));
return(plen);
}
uint16_t page_fotoperiodo(uint8_t *buf)
{
char* stringa = "";
uint16_t plen;
plen = http200ok();
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><body>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<b>SETUP FOTOPERIODO</b><hr>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Ora accensione: <a href=\"../?sez=4&cmd=1&act=1\">(+)<a> <a href=\"../?sez=4&cmd=1&act=2\">(-)<a> "));
if (luciOraAccensione < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciOraAccensione);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(":"));
if (luciMinutoAccensione < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciMinutoAccensione);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=1&act=3\">(+)<a> <a href=\"../?sez=4&cmd=1&act=4\">(-)<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Durata alba: "));
if (luciMinutiDurataAlba < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciMinutiDurataAlba);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" minuti <a href=\"../?sez=4&cmd=1&act=5\">(+)<a> <a href=\"../?sez=4&cmd=1&act=6\">(-)<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Durata accensione completa: <a href=\"../?sez=4&cmd=2&act=1\">(+)<a> <a href=\"../?sez=4&cmd=2&act=2\">(-)<a> "));
if (luciOreAccensioneCompleta < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciOreAccensioneCompleta);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(":"));
if (luciMinutiAccensioneCompleta < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciMinutiAccensioneCompleta);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=2&act=3\">(+)<a> <a href=\"../?sez=4&cmd=2&act=4\">(-)<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Durata tramonto: "));
if (luciMinutiDurataTramonto < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciMinutiDurataTramonto);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" minuti <a href=\"../?sez=4&cmd=2&act=5\">(+)<a> <a href=\"../?sez=4&cmd=2&act=6\">(-)<a></br>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><a href=\"../?sez=4\"><<< INDIETRO<a></body></html>"));
return(plen);
}
uint16_t page_illuminazione_potenza(uint8_t *buf)
{
char* stringa = "";
uint16_t plen;
plen = http200ok();
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><body>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<b>SETUP POTENZA/TEMPERATURA</b><hr>"));
// plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<TABLE BORDER=1 CELLPADDING=0 CELLSPACING=0><TR><TD WIDTH=120 ALIGN=CENTER>SX</TD><TD WIDTH=120 ALIGN=CENTER>RGB</TD><TD WIDTH=120 ALIGN=CENTER>DX</TD></TR><TR><TD>BLU: "));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<TABLE><TR><TD>SX</TD><TD>RGB</TD><TD>DX</TD></TR><TR><TD>BLU: "));
if (luciTargetBluSx < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetBluSx < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetBluSx);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=3&act=1\">(+)<a> <a href=\"../?sez=4&cmd=3&act=2\">(-)<a></TD><TD>R: "));
if (luciTargetRRGB < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetRRGB < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetRRGB);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=3&act=3\">(+)<a> <a href=\"../?sez=4&cmd=3&act=4\">(-)<a></TD><TD>BLU: "));
if (luciTargetBluDx < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetBluDx < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetBluDx);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=3&act=5\">(+)<a> <a href=\"../?sez=4&cmd=3&act=6\">(-)<a></TD></TR><TR><TD>10K: "));
if (luciTarget10kSx < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTarget10kSx < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTarget10kSx);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=3&act=7\">(+)<a> <a href=\"../?sez=4&cmd=3&act=8\">(-)<a></TD><TD>G: "));
if (luciTargetGRGB < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetGRGB < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetGRGB);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=3&act=9\">(+)<a> <a href=\"../?sez=4&cmd=4&act=1\">(-)<a></TD><TD>10K: "));
if (luciTarget10kDx < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTarget10kDx < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTarget10kDx);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=4&act=2\">(+)<a> <a href=\"../?sez=4&cmd=4&act=3\">(-)<a></TD></TR><TR><TD>20K: "));
if (luciTarget20kSx < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTarget20kSx < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTarget20kSx);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=4&act=4\">(+)<a> <a href=\"../?sez=4&cmd=4&act=5\">(-)<a></TD><TD>B: "));
if (luciTargetBRGB < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetBRGB < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetBRGB);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=4&act=6\">(+)<a> <a href=\"../?sez=4&cmd=4&act=7\">(-)<a></TD><TD>20K: "));
if (luciTarget20kDx < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTarget20kDx < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTarget20kDx);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=4&act=8\">(+)<a> <a href=\"../?sez=4&cmd=4&act=9\">(-)<a></TD></TR></TABLE>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><a href=\"../?sez=4\"><<< INDIETRO<a></body></html>"));
return(plen);
}
uint16_t page_illuminazione_effetti(uint8_t *buf)
{
char* stringa = "";
uint16_t plen;
plen = http200ok();
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>AquaControl</title></head><body>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<b>SETUP EFFETTI LUCE</b><hr>"));
if ((luciTipoAlbaTramonto == 1) || (luciTipoAlbaTramonto == 3)) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Effetto alba/tramonto: Prima blu e poi bianchi <a href=\"../?sez=4&cmd=5&act=1\">(Blu e bianchi assieme)</BR><a>"));}
else {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Effetto alba/tramonto: Blu e bianchi assieme <a href=\"../?sez=4&cmd=5&act=1\">(Prima blu e poi bianchi)</BR><a>"));}
if ((luciTipoAlbaTramonto == 2) || (luciTipoAlbaTramonto == 3)) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Effetto est/ovest: Sole sorge a est e tramonta a ovest <a href=\"../?sez=4&cmd=5&act=2\">(Sinistra e destra assieme)<a>"));}
else {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("Effetto est/ovest: Sinistra e destra assieme <a href=\"../?sez=4&cmd=5&act=2\">(Sole sorge a est e tramonta a ovest)<a>"));}
sprintf(stringa,"%d",luciTipoAlbaTramonto);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<TABLE BORDER=1 CELLPADDING=0 CELLSPACING=0><TR><TD WIDTH=160 ALIGN=CENTER>LUCE LUNARE</TD></TR><TR><TD>RED: "));
if (luciTargetRRGBLunare < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetRRGBLunare < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetRRGBLunare);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=5&act=3\">(+)<a> <a href=\"../?sez=4&cmd=5&act=4\">(-)<a></TD></TR><TR><TD>GREEN: "));
if (luciTargetGRGBLunare < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetGRGBLunare < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetGRGBLunare);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=5&act=5\">(+)<a> <a href=\"../?sez=4&cmd=5&act=6\">(-)<a></TD</TR><TR><TD>BLUE: "));
if (luciTargetBRGBLunare < 100) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
if (luciTargetBRGBLunare < 10) {plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("0"));}
sprintf(stringa,"%d",luciTargetBRGBLunare);
plen = es.ES_fill_tcp_data(buf,plen,stringa);
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR(" <a href=\"../?sez=4&cmd=5&act=7\">(+)<a> <a href=\"../?sez=4&cmd=5&act=8\">(-)<a></TD</TR></TABLE>"));
plen = es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><a href=\"../?sez=4\"><<< INDIETRO<a></body></html>"));
return(plen);
}
rtc.h
#define DS1307_ADDRESS 0x68
void inizializza_rtc()
{
Wire.begin();
msLastUpdateRTC = 0;
}
byte decToBcd(byte val) {return ((val/10*16) + (val%10));}
byte bcdToDec(byte val) {return ((val/16*10) + (val%16));}
void rtc_getDateTime()
{
if ((msCurrent - msLastUpdateRTC) > 500)
{
msLastUpdateRTC = msCurrent;
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
rtcSecond = bcdToDec(Wire.receive());
rtcMinute = bcdToDec(Wire.receive());
rtcHour = bcdToDec(Wire.receive() & 0b111111); //24 hour time
rtcWeekDay = bcdToDec(Wire.receive()); //0-6 -> sunday - Saturday
rtcMonthDay = bcdToDec(Wire.receive());
rtcMonth = bcdToDec(Wire.receive());
rtcYear = bcdToDec(Wire.receive());
}
}
void rtc_setDateTime()
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0); //stop Oscillator
Wire.send(decToBcd(rtcSecond));
Wire.send(decToBcd(rtcMinute));
Wire.send(decToBcd(rtcHour));
Wire.send(decToBcd(rtcWeekDay));
Wire.send(decToBcd(rtcMonthDay));
Wire.send(decToBcd(rtcMonth));
Wire.send(decToBcd(rtcYear));
Wire.send(0); //start
Wire.endTransmission();
}
sd.h
void inizializza_sd()
{
sdError = 0;
msLogger = 0;
sdLogInCorso = 0;
if (!SD.begin(SD_CS)) {sdError = 1;} // memory non inerita all'accensione
else
{
sdDataFile = SD.open("logger.txt", FILE_READ);
if (sdDataFile)
{
if (sdDataFile.available())
{
if (sdDataFile.read() == 70) {sdError = 0;} // Ok il file deve iniziare con una "F"
else {sdError = 2;} // file corrotto (non inizia con la lettera giusta all'accensione
}
else {sdError = 3;} // file vuoto all'accensione
}
else {sdError = 4;} // file non esistente all'accensione
sdDataFile.close();
}
}
void logger_sd()
{
// String sdDataString = "";
if (sdLogInCorso)
{
if((msCurrent - msLogger) > 5000) // LIMITE tenere se possibile 5 secondi con 1 alle volte si una un crash
{
msLogger = msCurrent;
if (sdError) {return;}
// test se la memory funziona o se è stata rimossa durante il log
sdDataFile = SD.open("logger.txt", FILE_READ);
if (sdDataFile)
{
if (sdDataFile.available())
{
if (sdDataFile.read() == 70) {sdError = 0;} // Ok il file deve iniziare con una "F"
else {sdError = 5;} // file corrotto (non inizia con la lettera giusta) durante la scrittura
}
else {sdError = 6;} // file vuoto durante la scrittura
}
else {sdError = 7;} // file non esistente durante la scrittura
sdDataFile.close();
if (sdError != 0)
{
sdLogInCorso = 0;
return;
}
// scrittura dei file di log
// sdDataString = String(millis());
sdDataString = "";
sdDataString += "4"; // LIMITE alle volte nel log al posto della prima colonna 4 mette 111. Non si capisce cosa è 111
sdDataString += ",";
// if (rtcMonth < 10) {sdDataString += "0";}
// sdDataString += String(rtcMonth);
// if (rtcMonthDay < 10) {sdDataString += "0";}
// sdDataString += String(rtcMonthDay);
// if (rtcHour < 10) {sdDataString += "0";}
// sdDataString += String(rtcHour);
// if (rtcMinute < 10) {sdDataString += "0";}
// sdDataString += String(rtcMinute);
// if (rtcSecond < 10) {sdDataString += "0";}
// sdDataString += String(rtcSecond);
// sdDataString += " 1234567890 1234567890 1234567890"; // LIMITE tenere massimo 40 caratteri per scrittura. con più caratteri alle volte si una un crash
// sdDataString += ","; // LIMITE tenere massimo 40 caratteri per scrittura. con più caratteri alle volte si una un crash
sdDataString += String(luciCurrentBluDx);
sdDataString += ",";
sdDataString += String(luciCurrentBluSx);
sdDataString += ",";
sdDataString += String(luciCurrent10kDx);
sdDataString += ",";
sdDataString += String(luciCurrent10kSx);
sdDataString += ",";
sdDataString += String(luciCurrent20kDx);
sdDataString += ",";
sdDataString += String(luciCurrent20kSx);
// sdDataString += ",";
// sdDataString += String(luciCurrentRRGB);
// sdDataString += ",";
// sdDataString += String(luciCurrentGRGB);
// sdDataString += ",";
// sdDataString += String(luciCurrentBRGB);
sdDataFile = SD.open("logger.txt", FILE_WRITE);
sdDataFile.println(sdDataString);
sdDataFile.close();
}
}
}
void formattazione_sd()
{
sdError = 0;
SD.remove("logger.txt");
sdDataFile = SD.open("logger.txt", FILE_WRITE);
sdDataFile.println("File di LOG del controller per acquari AquaControl");
sdDataFile.close();
}
web.h
// The ethernet shield
EtherShield es = EtherShield();
#include "pagine.h"
void inizializza_sd();
void formattazione_sd();
void rtc_setDateTime();
// The returned value is stored in the global var strbuf
uint8_t find_key_val(char *str,char *key)
{
uint8_t found = 0;
uint8_t i = 0;
char *kp;
kp = key;
while(*str && *str!=' ' && found == 0)
{
if (*str == *kp)
{
kp++;
if (*kp == '\0')
{
str++;
kp = key;
if (*str == '=') {found = 1;}
}
}
else {kp = key;}
str++;
}
if (found == 1)
{
// while(*str && *str != ' ' && *str != '&' && i < STR_BUFFER_SIZE)
while(*str && *str != ' ' && *str != '&' && i < STR_BUFFER_SIZE)
{
strbuf[i] = *str;
i++;
str++;
}
strbuf[i] = '\0'
}
return(found);
}
int8_t analyse_sez(char *str)
{
int8_t r = -1;
if (find_key_val(str,"sez")) {if (*strbuf < 0x3a && *strbuf > 0x2f) {r = (*strbuf - 0x30);}}
return r;
}
int8_t analyse_cmd(char *str)
{
int8_t r = -1;
if (find_key_val(str,"cmd")) {if (*strbuf < 0x3a && *strbuf > 0x2f) {r = (*strbuf - 0x30);}}
return r;
}
int8_t analyse_act(char *str)
{
int8_t r = -1;
if (find_key_val(str,"act")) {if (*strbuf < 0x3a && *strbuf > 0x2f) {r = (*strbuf - 0x30);}}
return r;
}
void webserver()
{
uint16_t plen, dat_p;
int8_t sez;
int8_t cmd;
int8_t act;
// LIMITE ogni 30 secondi è bene resettare il webserver che impiegherà 2 secondi a ripartire (serve in caso di crash)
if((msCurrent - msResetWeb) > 30000)
{
msResetWeb = msCurrent;
es.ES_enc28j60Init(mymac);
es.ES_init_ip_arp_udp_tcp(mymac,myip, MYWWWPORT);
}
while(1) {
// read packet, handle ping and wait for a tcp packet:
dat_p = es.ES_packetloop_icmp_tcp(buf,es.ES_enc28j60Packet Receive(BUFFER_SIZE, buf));
/* dat_p will be unequal to zero if there is a valid
* http get */
if (dat_p == 0)
{
return;
}
// tcp port 80 begin
if (strncmp("GET ",(char *)&(buf[dat_p]),4) != 0)
{
// head, post and other methods:
dat_p = http200ok();
dat_p = es.ES_fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>"));
goto SENDTCP;
}
// just one web page in the "root directory" of the web server
if (strncmp("/ ",(char *) & (buf[dat_p + 4]),2) == 0)
{
dat_p = homepage(buf);
goto SENDTCP;
}
sez = analyse_sez((char *) & (buf[dat_p+5]));
cmd = analyse_cmd((char *) & (buf[dat_p+5]));
act = analyse_act((char *) & (buf[dat_p+5]));
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
if (sez == 4)
{
if ((cmd == 1) || (cmd == 2))
{
if (cmd == 1)
{
if (act == 1)
{
if (luciOraAccensione >= 23) {luciOraAccensione = 0u;}
else {luciOraAccensione++;}
EEPROM.write(INDIRIZZOLUCIORAACCENSIONE, luciOraAccensione);
}
else if (act == 2)
{
if (luciOraAccensione == 0) {luciOraAccensione = 23u;}
else {luciOraAccensione--;}
EEPROM.write(INDIRIZZOLUCIORAACCENSIONE, luciOraAccensione);
}
else if (act == 3)
{
if (luciMinutoAccensione >= 59) {luciMinutoAccensione = 0u;}
else {luciMinutoAccensione++;}
EEPROM.write(INDIRIZZOLUCIMINUTOACCENSIONE, luciMinutoAccensione);
}
else if (act == 4)
{
if (luciMinutoAccensione == 0) {luciMinutoAccensione = 59u;}
else {luciMinutoAccensione--;}
EEPROM.write(INDIRIZZOLUCIMINUTOACCENSIONE, luciMinutoAccensione);
}
else if (act == 5)
{
if (luciMinutiDurataAlba >= 54) {luciMinutiDurataAlba = 5u;}
else {luciMinutiDurataAlba++;}
EEPROM.write(INDIRIZZOLUCIMINUTIDURATAALBA, luciMinutiDurataAlba);
}
else if (act == 6)
{
if (luciMinutiDurataAlba <= 5) {luciMinutiDurataAlba = 54u;}
else {luciMinutiDurataAlba--;}
EEPROM.write(INDIRIZZOLUCIMINUTIDURATAALBA, luciMinutiDurataAlba);
}
}
else
{
if (act == 1)
{
if (luciOreAccensioneCompleta >= 16) {luciOreAccensioneCompleta = 0u;}
else {luciOreAccensioneCompleta++;}
EEPROM.write(INDIRIZZOLUCIOREACCENSIONECOMPLETA, luciOreAccensioneCompleta);
}
else if (act == 2)
{
if (luciOreAccensioneCompleta == 0) {luciOreAccensioneCompleta = 16u;}
else {luciOreAccensioneCompleta--;}
EEPROM.write(INDIRIZZOLUCIOREACCENSIONECOMPLETA, luciOreAccensioneCompleta);
}
else if (act == 3)
{
if (luciMinutiAccensioneCompleta >= 59) {luciMinutiAccensioneCompleta = 0u;}
else {luciMinutiAccensioneCompleta++;}
EEPROM.write(INDIRIZZOLUCIMINUTIACCENSIONECOMPLETA , luciMinutiAccensioneCompleta);
}
else if (act == 4)
{
if (luciMinutiAccensioneCompleta == 0) {luciMinutiAccensioneCompleta = 59u;}
else {luciMinutiAccensioneCompleta--;}
EEPROM.write(INDIRIZZOLUCIMINUTIACCENSIONECOMPLETA , luciMinutiAccensioneCompleta);
}
else if (act == 5)
{
if (luciMinutiDurataTramonto >= 54) {luciMinutiDurataTramonto = 5u;}
else {luciMinutiDurataTramonto++;}
EEPROM.write(INDIRIZZOLUCIMINUTIDURATATRAMANTO, luciMinutiDurataTramonto);
}
else if (act == 6)
{
if (luciMinutiDurataTramonto <= 5) {luciMinutiDurataTramonto = 54u;}
else {luciMinutiDurataTramonto--;}
EEPROM.write(INDIRIZZOLUCIMINUTIDURATATRAMANTO, luciMinutiDurataTramonto);
}
}
dat_p = page_fotoperiodo(buf);
}
else if ((cmd == 3) || (cmd == 4))
{
if (cmd == 3)
{
if (act == 1)
{
if (luciTargetBluSx >= 255) {luciTargetBluSx = 0u;}
else {luciTargetBluSx++;}
EEPROM.write(INDIRIZZOLUCITARGETBLUSX, luciTargetBluSx);
}
else if (act == 2)
{
if (luciTargetBluSx == 0) {luciTargetBluSx = 255u;}
else {luciTargetBluSx--;}
EEPROM.write(INDIRIZZOLUCITARGETBLUSX, luciTargetBluSx);
}
else if (act == 3)
{
if (luciTargetRRGB >= 255) {luciTargetRRGB = 0u;}
else {luciTargetRRGB++;}
EEPROM.write(INDIRIZZOLUCITARGETRRGB, luciTargetRRGB);
}
else if (act == 4)
{
if (luciTargetRRGB == 0) {luciTargetRRGB = 255u;}
else {luciTargetRRGB--;}
EEPROM.write(INDIRIZZOLUCITARGETRRGB, luciTargetRRGB);
}
else if (act == 5)
{
if (luciTargetBluDx >= 255) {luciTargetBluDx = 0u;}
else {luciTargetBluDx++;}
EEPROM.write(INDIRIZZOLUCITARGETBLUDX, luciTargetBluDx);
}
else if (act == 6)
{
if (luciTargetBluDx == 0) {luciTargetBluDx = 255u;}
else {luciTargetBluDx--;}
EEPROM.write(INDIRIZZOLUCITARGETBLUDX, luciTargetBluDx);
}
else if (act == 7)
{
if (luciTarget10kSx >= 255) {luciTarget10kSx = 0u;}
else {luciTarget10kSx++;}
EEPROM.write(INDIRIZZOLUCITARGET10KSX, luciTarget10kSx);
}
else if (act == 8)
{
if (luciTarget10kSx == 0) {luciTarget10kSx = 255u;}
else {luciTarget10kSx--;}
EEPROM.write(INDIRIZZOLUCITARGET10KSX, luciTarget10kSx);
}
else if (act == 9)
{
if (luciTargetGRGB >= 255) {luciTargetGRGB = 0u;}
else {luciTargetGRGB++;}
EEPROM.write(INDIRIZZOLUCITARGETGRGB, luciTargetGRGB);
}
}
else if (cmd == 4)
{
if (act == 1)
{
if (luciTargetGRGB == 0) {luciTargetGRGB = 255u;}
else {luciTargetGRGB--;}
EEPROM.write(INDIRIZZOLUCITARGETGRGB, luciTargetGRGB);
}
else if (act == 2)
{
if (luciTarget10kDx >= 255) {luciTarget10kDx = 0u;}
else {luciTarget10kDx++;}
EEPROM.write(INDIRIZZOLUCITARGET10KDX, luciTarget10kDx);
}
else if (act == 3)
{
if (luciTarget10kDx == 0) {luciTarget10kDx = 255u;}
else {luciTarget10kDx--;}
EEPROM.write(INDIRIZZOLUCITARGET10KDX, luciTarget10kDx);
}
else if (act == 4)
{
if (luciTarget20kSx >= 255) {luciTarget20kSx = 0u;}
else {luciTarget20kSx++;}
EEPROM.write(INDIRIZZOLUCITARGET20KSX, luciTarget20kSx);
}
else if (act == 5)
{
if (luciTarget20kSx == 0) {luciTarget20kSx = 255u;}
else {luciTarget20kSx--;}
EEPROM.write(INDIRIZZOLUCITARGET20KSX, luciTarget20kSx);
}
else if (act == 6)
{
if (luciTargetBRGB >= 255) {luciTargetBRGB = 0u;}
else {luciTargetBRGB++;}
EEPROM.write(INDIRIZZOLUCITARGETBRGB, luciTargetBRGB);
}
else if (act == 7)
{
if (luciTargetBRGB == 0) {luciTargetBRGB = 255u;}
else {luciTargetBRGB--;}
EEPROM.write(INDIRIZZOLUCITARGETBRGB, luciTargetBRGB);
}
else if (act == 8)
{
if (luciTarget20kDx >= 255) {luciTarget20kDx = 0u;}
else {luciTarget20kDx++;}
EEPROM.write(INDIRIZZOLUCITARGET20KDX, luciTarget20kDx);
}
else if (act == 9)
{
if (luciTarget20kDx == 0) {luciTarget20kDx = 255u;}
else {luciTarget20kDx--;}
EEPROM.write(INDIRIZZOLUCITARGET20KDX, luciTarget20kDx);
}
}
dat_p = page_illuminazione_potenza(buf);
}
else if (cmd == 5)
{
if (luciTipoAlbaTramonto >= 4u) {luciTipoAlbaTramonto = 0u;}
if (act == 1)
{
if (luciTipoAlbaTramonto == 0u) {luciTipoAlbaTramonto = 1u;}
else if (luciTipoAlbaTramonto == 1u) {luciTipoAlbaTramonto = 0u;}
else if (luciTipoAlbaTramonto == 2u) {luciTipoAlbaTramonto = 3u;}
else if (luciTipoAlbaTramonto == 3u) {luciTipoAlbaTramonto = 2u;}
EEPROM.write(INDIRIZZOLUCITIPOALBATRAMONTO, luciTipoAlbaTramonto);
}
else if (act == 2)
{
if (luciTipoAlbaTramonto == 0u) {luciTipoAlbaTramonto = 2u;}
else if (luciTipoAlbaTramonto == 1u) {luciTipoAlbaTramonto = 3u;}
else if (luciTipoAlbaTramonto == 2u) {luciTipoAlbaTramonto = 0u;}
else if (luciTipoAlbaTramonto == 3u) {luciTipoAlbaTramonto = 1u;}
EEPROM.write(INDIRIZZOLUCITIPOALBATRAMONTO, luciTipoAlbaTramonto);
}
else if (act == 3)
{
if (luciTargetRRGBLunare >= 255) {luciTargetRRGBLunare = 0u;}
else {luciTargetRRGBLunare++;}
EEPROM.write(INDIRIZZOLUCITARGETRRGBLUNARE, luciTargetRRGBLunare);
}
else if (act == 4)
{
if (luciTargetRRGBLunare == 0) {luciTargetRRGBLunare = 255u;}
else {luciTargetRRGBLunare--;}
EEPROM.write(INDIRIZZOLUCITARGETRRGBLUNARE, luciTargetRRGBLunare);
}
else if (act == 5)
{
if (luciTargetGRGBLunare >= 255) {luciTargetGRGBLunare = 0u;}
else {luciTargetGRGBLunare++;}
EEPROM.write(INDIRIZZOLUCITARGETGRGBLUNARE, luciTargetGRGBLunare);
}
else if (act == 6)
{
if (luciTargetGRGBLunare == 0) {luciTargetGRGBLunare = 255u;}
else {luciTargetGRGBLunare--;}
EEPROM.write(INDIRIZZOLUCITARGETGRGBLUNARE, luciTargetGRGBLunare);
}
else if (act == 7)
{
if (luciTargetBRGBLunare >= 255) {luciTargetBRGBLunare = 0u;}
else {luciTargetBRGBLunare++;}
EEPROM.write(INDIRIZZOLUCITARGETBRGBLUNARE, luciTargetBRGBLunare);
}
else if (act == 8)
{
if (luciTargetBRGBLunare == 0) {luciTargetBRGBLunare = 255u;}
else {luciTargetBRGBLunare--;}
EEPROM.write(INDIRIZZOLUCITARGETBRGBLUNARE, luciTargetBRGBLunare);
}
dat_p = page_illuminazione_effetti(buf);
}
else
{
dat_p = page_illuminazione(buf);
}
goto SENDTCP;
}
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
if (sez == 8)
{
if (act == 1) {rtcHour++;}
if (rtcHour >= 24) {rtcHour = 0u;}
if (act == 2)
{
if (rtcHour == 0) {rtcHour = 23u;}
else {rtcHour--;}
}
if (act == 3) {rtcMinute++;}
if (rtcMinute >= 60) {rtcMinute = 0u;}
if (act == 4)
{
if (rtcMinute == 0) {rtcMinute = 59u;}
else {rtcMinute--;}
}
if (act == 5) {rtcMonthDay++;}
if (rtcMonthDay >= 32) {rtcMonthDay = 1u;}
if (act == 6)
{
if (rtcMonthDay <= 1) {rtcMonthDay = 31u;}
else {rtcMonthDay--;}
}
if (act == 7) {rtcMonth++;}
if (rtcMonth >= 13) {rtcMonth = 1u;}
if (act == 8) {rtcYear++;}
if (rtcYear >= 100) {rtcYear = 11u;}
if (act == 9) {rtcYear--;}
if (rtcYear <= 10) {rtcYear = 99u;}
if (act == 0) {rtcWeekDay++;}
if (rtcWeekDay >= 8) {rtcWeekDay = 1u;}
rtc_setDateTime();
dat_p = page_orologio(buf);
goto SENDTCP;
}
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
if (sez == 9)
{
if ((act == 1) && (sdError == 0)) {sdLogInCorso = 1;}
if (act == 2) {sdLogInCorso = 0;}
if (act == 3)
{
inizializza_sd();
sdError = 0;
}
if (act == 4) {formattazione_sd();}
dat_p = page_logger(buf);
goto SENDTCP;
}
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
//************************************************** ************************************************** *******************
SENDTCP:
es.ES_www_server_reply(buf,dat_p); // send web page data
// tcp port 80 end
}
}
void inizializza_enc28j60()
{
// Configuro l'uscita per il CS del chip
pinMode(ENC28J60_CONTROL_CS, OUTPUT);
// initialize enc28j60
es.ES_enc28j60Init(mymac);
// init the ethernet/ip layer:
es.ES_init_ip_arp_udp_tcp(mymac,myip, MYWWWPORT);
msResetWeb = 0;
}
Tramite internet si regola l'orologio, l'ora di accensione della lampada, la durata dell'alba, la durata del tramonto, il tipo di dimmerazione (blu e bianchi assieme oppure prima blu poi bianchi e sinistra e destra assieme o prima sinistra poi destra), la potenza massima di ogni uscita, il colore del led rgb di notte o di giorno ed altro.
valex_1974
12-11-2011, 22:22
Complimenti!! spero di capirci qualcosa anche io!! :-)):-))
Grazie
billykid591
12-11-2011, 22:58
Sperando che sia leggibile posto un mio programmino che gestisce 9 pwm per le luci (blu dx e sx, 10000K dx e sx, 20000K dx e sx e rgb).
io uso l'arduino mega per via dei display. come interfaccia utente ha solo il web per ora.
possiede un log per salvare sulla memory i dati della vasca secondo per secondo
// Include delle librerie usate
#include "EtherShield.h" // EtherShield_1.6.zip
#include <SD.h> // Inclusa
#include "Wire.h" // Inclusa
#include <EEPROM.h> // Inclusa
// Definizione pin utilizzati
#define SD_INT 2
#define PWM_BLU_SX 3
#define SD_CS 4
#define PWM_BLU_DX 5
#define PWM_10K_SX 6
#define PWM_10K_DX 7
#define PWM_20K_SX 8
#define PWM_20K_DX 9
#define PWM_RGB_RED 10
#define PWM_RGB_GREEN 11
#define PWM_RGB_BLUE 12
#define LED_ONBOARD 13
#define I2C_SDA 20
#define I2C_SCL 21
#define SPI_MISO 50
#define SPI_MOSI 51
#define SPI_SCK 52
#define ENC28J60_CONTROL_CS 53
// please modify the following two lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x25};
static uint8_t myip[4] = {192,168,1,25};
static uint8_t buf[BUFFER_SIZE + 1];
static char strbuf[STR_BUFFER_SIZE];
static long msLogger;
static long msResetWeb;
static unsigned long msCurrent;
static long msLastUpdateBluDx;
static long msLastUpdateBluSx;
static long msLastUpdate10kDx;
static long msLastUpdate10kSx;
static long msLastUpdate20kDx;
static long msLastUpdate20kSx;
static long msLastUpdateRRGB;
static long msLastUpdateGRGB;
static long msLastUpdateBRGB;
static long msLastUpdateRTC;
static int sdError;
static int sdLogInCorso;
static File sdDataFile;
static String sdDataString;
static int rtcSecond;
static int rtcMinute;
static int rtcHour;
static int rtcWeekDay;
static int rtcMonthDay;
static int rtcMonth;
static int rtcYear;
static int luciOraAccensione;
static int luciMinutoAccensione;
static int luciMinutiDurataAlba;
static int luciOreAccensioneCompleta;
static int luciMinutiAccensioneCompleta;
static int luciMinutiDurataTramonto;
static int luciTargetBluSx;
static int luciTargetBluDx;
static int luciTarget10kSx;
static int luciTarget10kDx;
static int luciTarget20kSx;
static int luciTarget20kDx;
static int luciTargetRRGB;
static int luciTargetGRGB;
static int luciTargetBRGB;
static int luciTipoAlbaTramonto; // bit 0 (prima blu poi bianchi), bit 1 (effetto est/ovest)
static int luciTargetRRGBLunare;
static int luciTargetGRGBLunare;
static int luciTargetBRGBLunare;
static int luciCurrentBluDx;
static int luciCurrentBluSx;
static int luciCurrent10kDx;
static int luciCurrent10kSx;
static int luciCurrent20kDx;
static int luciCurrent20kSx;
static int luciCurrentRRGB;
static int luciCurrentGRGB;
static int luciCurrentBRGB;
//static int secondoCorrente;
//static int secondoAccensioneBluDx;
//static int secondoAccensioneBluSx;
//static int secondoAccensioneBiancoDx;
//static int secondoAccensioneBiancoSx;
//static int secondoSpegnimentoBluDx;
//static int secondoSpegnimentoBluSx;
//static int secondoSpegnimentoBiancoDx;
//static int secondoSpegnimentoBiancoSx;
//static int decimiSecondoIncrementoBluDx;
//static int decimiSecondoIncrementoBluSx;
//static int decimiSecondoIncremento10kDx;
//static int decimiSecondoIncremento10kSx;
//static int decimiSecondoIncremento20kDx;
//static int decimiSecondoIncremento20kSx;
//static int decimiSecondoIncrementoRRGB;
//static int decimiSecondoIncrementoGRGB;
//static int decimiSecondoIncrementoBRGB;
//static int decimiSecondoDecrementoBluDx;
//static int decimiSecondoDecrementoBluSx;
//static int decimiSecondoDecremento10kDx;
//static int decimiSecondoDecremento10kSx;
//static int decimiSecondoDecremento20kDx;
//static int decimiSecondoDecremento20kSx;
//static int decimiSecondoDecrementoRRGB;
//static int decimiSecondoDecrementoGRGB;
//static int decimiSecondoDecrementoBRGB;
//static int luceBluDxAccesa;
//static int luceBluSxAccesa;
//static int luceBiancaDxAccesa;
//static int luceBiancaSxAccesa;
//static int luceRGBDiurnaAccesa;
// Include dei files del programma
#include "luci.h"
#include "web.h"
#include "sd.h"
#include "rtc.h"
void setup()
{
msCurrent = 0;
// Serial.begin(9600);
// Serial.println("inizio");
inizializza_enc28j60();
inizializza_sd();
inizializza_rtc();
inizializza_luci();
}
void loop()
{
msCurrent = millis();
rtc_getDateTime();
gestione_luci();
logger_sd();
webserver();
// Serial.println("inizio ----------------------------");
// Serial.print("secondoCorrente: ");
// Serial.println(secondoCorrente);
// Serial.print("luceBluDxAccesa: ");
// Serial.println(luceBluDxAccesa);
// Serial.print("luceBluSxAccesa: ");
// Serial.println(luceBluSxAccesa);
// Serial.print("luceBiancaDxAccesa: ");
// Serial.println(luceBiancaDxAccesa);
// Serial.print("luceBiancaSxAccesa: ");
// Serial.println(luceBiancaSxAccesa);
// Serial.print("luceRGBDiurnaAccesa: ");
// Serial.println(luceRGBDiurnaAccesa);
//
// Serial.print("luciCurrentBluDx: ");
// Serial.println(luciCurrentBluDx);
// Serial.print("luciCurrentBluSx: ");
// Serial.println(luciCurrentBluSx);
// Serial.print("luciCurrent10kDx: ");
// Serial.println(luciCurrent10kDx);
// Serial.print("luciCurrent10kSx: ");
// Serial.println(luciCurrent10kSx);
// Serial.print("luciCurrent20kDx: ");
// Serial.println(luciCurrent20kDx);
// Serial.print("luciCurrent20kSx: ");
// Serial.println(luciCurrent20kSx);
// Serial.print("luciCurrentRRGB: ");
// Serial.println(luciCurrentRRGB);
// Serial.print("luciCurrentGRGB: ");
// Serial.println(luciCurrentGRGB);
// Serial.print("luciCurrentBRGB: ");
// Serial.println(luciCurrentBRGB);
}
luci.h
#define INDIRIZZOLUCIORAACCENSIONE 0
#define INDIRIZZOLUCIMINUTOACCENSIONE 1
#define INDIRIZZOLUCIMINUTIDURATAALBA 2
#define INDIRIZZOLUCIOREACCENSIONECOMPLETA 3
#define INDIRIZZOLUCIMINUTIACCENSIONECOMPLETA 4
#define INDIRIZZOLUCIMINUTIDURATATRAMANTO 5
#define INDIRIZZOLUCITARGETBLUSX 6
#define INDIRIZZOLUCITARGETBLUDX 7
#define INDIRIZZOLUCITARGET10KSX 8
#define INDIRIZZOLUCITARGET10KDX 9
#define INDIRIZZOLUCITARGET20KSX 10
#define INDIRIZZOLUCITARGET20KDX 11
#define INDIRIZZOLUCITARGETRRGB 12
#define INDIRIZZOLUCITARGETGRGB 13
#define INDIRIZZOLUCITARGETBRGB 14
#define INDIRIZZOLUCITIPOALBATRAMONTO 15
#define INDIRIZZOLUCITARGETRRGBLUNARE 16
#define INDIRIZZOLUCITARGETGRGBLUNARE 17
#define INDIRIZZOLUCITARGETBRGBLUNARE 18
void inizializza_luci()
{
luciOraAccensione = EEPROM.read(INDIRIZZOLUCIORAACCENSIONE);
luciMinutoAccensione = EEPROM.read(INDIRIZZOLUCIMINUTOACCENSIONE);
luciMinutiDurataAlba = EEPROM.read(INDIRIZZOLUCIMINUTIDURATAALBA);
luciOreAccensioneCompleta = EEPROM.read(INDIRIZZOLUCIOREACCENSIONECOMPLETA);
luciMinutiAccensioneCompleta = EEPROM.read(INDIRIZZOLUCIMINUTIACCENSIONECOMPLETA) ;
luciMinutiDurataTramonto = EEPROM.read(INDIRIZZOLUCIMINUTIDURATATRAMANTO);
luciTargetBluSx = EEPROM.read(INDIRIZZOLUCITARGETBLUSX);
luciTargetBluDx = EEPROM.read(INDIRIZZOLUCITARGETBLUDX);
luciTarget10kSx = EEPROM.read(INDIRIZZOLUCITARGET10KSX);
luciTarget10kDx = EEPROM.read(INDIRIZZOLUCITARGET10KDX);
luciTarget20kSx = EEPROM.read(INDIRIZZOLUCITARGET20KSX);
luciTarget20kDx = EEPROM.read(INDIRIZZOLUCITARGET20KDX);
luciTargetRRGB = EEPROM.read(INDIRIZZOLUCITARGETRRGB);
luciTargetGRGB = EEPROM.read(INDIRIZZOLUCITARGETGRGB);
luciTargetBRGB = EEPROM.read(INDIRIZZOLUCITARGETBRGB);
luciTipoAlbaTramonto = EEPROM.read(INDIRIZZOLUCITIPOALBATRAMONTO);
luciTargetRRGBLunare = EEPROM.read(INDIRIZZOLUCITARGETRRGBLUNARE);
luciTargetGRGBLunare = EEPROM.read(INDIRIZZOLUCITARGETGRGBLUNARE);
luciTargetBRGBLunare = EEPROM.read(INDIRIZZOLUCITARGETBRGBLUNARE);
luciCurrentBluDx = 0;
luciCurrentBluSx = 0;
luciCurrent10kDx = 0;
luciCurrent10kSx = 0;
luciCurrent20kDx = 0;
luciCurrent20kSx = 0;
luciCurrentRRGB = 0;
luciCurrentGRGB = 0;
luciCurrentBRGB = 0;
}
void gestione_luci()
{
int secondoCorrente;
int secondoAccensioneBluDx;
int secondoAccensioneBluSx;
int secondoAccensioneBiancoDx;
int secondoAccensioneBiancoSx;
int secondoSpegnimentoBluDx;
int secondoSpegnimentoBluSx;
int secondoSpegnimentoBiancoDx;
int secondoSpegnimentoBiancoSx;
int decimiSecondoIncrementoBluDx;
int decimiSecondoIncrementoBluSx;
int decimiSecondoIncremento10kDx;
int decimiSecondoIncremento10kSx;
int decimiSecondoIncremento20kDx;
int decimiSecondoIncremento20kSx;
int decimiSecondoIncrementoRRGB;
int decimiSecondoIncrementoGRGB;
int decimiSecondoIncrementoBRGB;
int decimiSecondoDecrementoBluDx;
int decimiSecondoDecrementoBluSx;
int decimiSecondoDecremento10kDx;
int decimiSecondoDecremento10kSx;
int decimiSecondoDecremento20kDx;
int decimiSecondoDecremento20kSx;
int decimiSecondoDecrementoRRGB;
int decimiSecondoDecrementoGRGB;
int decimiSecondoDecrementoBRGB;
int luceBluDxAccesa;
int luceBluSxAccesa;
int luceBiancaDxAccesa;
int luceBiancaSxAccesa;
int luceRGBDiurnaAccesa;
int obiettivoBluDx;
int obiettivoBluSx;
int obiettivo10kDx;
int obiettivo10kSx;
int obiettivo20kDx;
int obiettivo20kSx;
int obiettivoRRGB;
int obiettivoGRGB;
int obiettivoBRGB;
secondoCorrente = (rtcHour * 360) + (rtcMinute * 6) + (rtcSecond / 10);
secondoAccensioneBluDx = (luciOraAccensione * 360) + (luciMinutoAccensione * 6);
secondoSpegnimentoBiancoDx = secondoAccensioneBluDx + (luciMinutiDurataAlba * 6) + (luciOreAccensioneCompleta * 360) + (luciMinutiAccensioneCompleta * 6);
if (luciTipoAlbaTramonto == 0)
{
secondoAccensioneBluSx = secondoAccensioneBluDx;
secondoAccensioneBiancoDx = secondoAccensioneBluDx;
secondoAccensioneBiancoSx = secondoAccensioneBluDx;
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx;
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx;
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx;
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 600) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 600) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 600) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 600) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 600) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 600;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 600) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 600) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 600) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 600) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 600) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 600) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 600;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 600) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
else if (luciTipoAlbaTramonto == 1)
{
secondoAccensioneBluSx = secondoAccensioneBluDx;
secondoAccensioneBiancoDx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoAccensioneBiancoSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx;
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
else if (luciTipoAlbaTramonto == 2)
{
secondoAccensioneBluSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoAccensioneBiancoDx = secondoAccensioneBluDx;
secondoAccensioneBiancoSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 2);
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx;
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 2);
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 300;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 300) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 300) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 300) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 300) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 300) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 300;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 300) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
else
{
secondoAccensioneBluSx = secondoAccensioneBluDx + ((luciMinutiDurataAlba * 6) / 4);
secondoAccensioneBiancoDx = secondoAccensioneBluDx + (((luciMinutiDurataAlba * 6) / 4) * 2);
secondoAccensioneBiancoSx = secondoAccensioneBluDx + (((luciMinutiDurataAlba * 6) / 4) * 3);
secondoSpegnimentoBluDx = secondoSpegnimentoBiancoDx + (((luciMinutiDurataTramonto * 6) / 4) * 2);
secondoSpegnimentoBluSx = secondoSpegnimentoBiancoDx + (((luciMinutiDurataTramonto * 6) / 4) * 3);
secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoDx + ((luciMinutiDurataTramonto * 6) / 4);
if (luciTargetBluDx == 0) {decimiSecondoIncrementoBluDx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncrementoBluDx = (luciMinutiDurataAlba * 150) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoIncrementoBluSx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncrementoBluSx = (luciMinutiDurataAlba * 150) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoIncremento10kDx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento10kDx = (luciMinutiDurataAlba * 150) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoIncremento10kSx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento10kSx = (luciMinutiDurataAlba * 150) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoIncremento20kDx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento20kDx = (luciMinutiDurataAlba * 150) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoIncremento20kSx = luciMinutiDurataAlba * 150;}
else {decimiSecondoIncremento20kSx = (luciMinutiDurataAlba * 150) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoIncrementoRRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoIncrementoGRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoIncrementoBRGB = (luciMinutiDurataAlba * 600);}
if (luciTargetBluDx == 0) {decimiSecondoDecrementoBluDx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecrementoBluDx = (luciMinutiDurataTramonto * 150) / luciTargetBluDx;}
if (luciTargetBluSx == 0) {decimiSecondoDecrementoBluSx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecrementoBluSx = (luciMinutiDurataTramonto * 150) / luciTargetBluSx;}
if (luciTarget10kDx == 0) {decimiSecondoDecremento10kDx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento10kDx = (luciMinutiDurataTramonto * 150) / luciTarget10kDx;}
if (luciTarget10kSx == 0) {decimiSecondoDecremento10kSx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento10kSx = (luciMinutiDurataTramonto * 150) / luciTarget10kSx;}
if (luciTarget20kDx == 0) {decimiSecondoDecremento20kDx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento20kDx = (luciMinutiDurataTramonto * 150) / luciTarget20kDx;}
if (luciTarget20kSx == 0) {decimiSecondoDecremento20kSx = luciMinutiDurataTramonto * 150;}
else {decimiSecondoDecremento20kSx = (luciMinutiDurataTramonto * 150) / luciTarget20kSx;}
if (luciTargetRRGB > luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGB - luciTargetRRGBLunare);}
else if (luciTargetRRGB < luciTargetRRGBLunare) {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600) / (luciTargetRRGBLunare - luciTargetRRGB);}
else {decimiSecondoDecrementoRRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetGRGB > luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGB - luciTargetGRGBLunare);}
else if (luciTargetGRGB < luciTargetGRGBLunare) {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600) / (luciTargetGRGBLunare - luciTargetGRGB);}
else {decimiSecondoDecrementoGRGB = (luciMinutiDurataTramonto * 600);}
if (luciTargetBRGB > luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGB - luciTargetBRGBLunare);}
else if (luciTargetBRGB < luciTargetBRGBLunare) {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600) / (luciTargetBRGBLunare - luciTargetBRGB);}
else {decimiSecondoDecrementoBRGB = (luciMinutiDurataTramonto * 600);}
}
if (secondoAccensioneBluSx > 8639) {secondoAccensioneBluSx = secondoAccensioneBluSx - 8640;}
if (secondoAccensioneBiancoDx > 8639) {secondoAccensioneBiancoDx = secondoAccensioneBiancoDx - 8640;}
if (secondoAccensioneBiancoSx > 8639) {secondoAccensioneBiancoSx = secondoAccensioneBiancoSx - 8640;}
if (secondoSpegnimentoBluDx > 8639) {secondoSpegnimentoBluDx = secondoSpegnimentoBluDx - 8640;}
if (secondoSpegnimentoBluSx > 8639) {secondoSpegnimentoBluSx = secondoSpegnimentoBluSx - 8640;}
if (secondoSpegnimentoBiancoDx > 8639) {secondoSpegnimentoBiancoDx = secondoSpegnimentoBiancoDx - 8640;}
if (secondoSpegnimentoBiancoSx > 8639) {secondoSpegnimentoBiancoSx = secondoSpegnimentoBiancoSx - 8640;}
luceBluDxAccesa = 0;
luceBluSxAccesa = 0;
luceBiancaDxAccesa = 0;
luceBiancaSxAccesa = 0;
luceRGBDiurnaAccesa = 0;
if (secondoAccensioneBluDx < secondoSpegnimentoBluDx) {if ((secondoCorrente >= secondoAccensioneBluDx) && (secondoCorrente < secondoSpegnimentoBluDx)) {luceBluDxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBluDx) || (secondoCorrente < secondoSpegnimentoBluDx)) {luceBluDxAccesa = 1;}}
if (secondoAccensioneBluSx < secondoSpegnimentoBluSx) {if ((secondoCorrente >= secondoAccensioneBluSx) && (secondoCorrente < secondoSpegnimentoBluSx)) {luceBluSxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBluSx) || (secondoCorrente < secondoSpegnimentoBluSx)) {luceBluSxAccesa = 1;}}
if (secondoAccensioneBiancoDx < secondoSpegnimentoBiancoDx) {if ((secondoCorrente >= secondoAccensioneBiancoDx) && (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceBiancaDxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBiancoDx) || (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceBiancaDxAccesa = 1;}}
if (secondoAccensioneBiancoSx < secondoSpegnimentoBiancoSx) {if ((secondoCorrente >= secondoAccensioneBiancoSx) && (secondoCorrente < secondoSpegnimentoBiancoSx)) {luceBiancaSxAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBiancoSx) || (secondoCorrente < secondoSpegnimentoBiancoSx)) {luceBiancaSxAccesa = 1;}}
if (secondoAccensioneBluDx < secondoSpegnimentoBiancoDx) {if ((secondoCorrente >= secondoAccensioneBluDx) && (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceRGBDiurnaAccesa = 1;}}
else {if ((secondoCorrente >= secondoAccensioneBluDx) || (secondoCorrente < secondoSpegnimentoBiancoDx)) {luceRGBDiurnaAccesa = 1;}}
if (luceBluDxAccesa) {obiettivoBluDx = luciTargetBluDx;}
else {obiettivoBluDx = 0;}
if (luceBluSxAccesa) {obiettivoBluSx = luciTargetBluSx;}
else {obiettivoBluSx = 0;}
if (luceBiancaDxAccesa) {obiettivo10kDx = luciTarget10kDx;}
else {obiettivo10kDx = 0;}
if (luceBiancaSxAccesa) {obiettivo10kSx = luciTarget10kSx;}
else {obiettivo10kSx = 0;}
if (luceBiancaDxAccesa) {obiettivo20kDx = luciTarget20kDx;}
else {obiettivo20kDx = 0;}
if (luceBiancaSxAccesa) {obiettivo20kSx = luciTarget20kSx;}
else {obiettivo20kSx = 0;}
if (luceRGBDiurnaAccesa) {obiettivoRRGB = luciTargetRRGB;}
else {obiettivoRRGB = luciTargetRRGBLunare;}
if (luceRGBDiurnaAccesa) {obiettivoGRGB = luciTargetGRGB;}
else {obiettivoGRGB = luciTargetGRGBLunare;}
if (luceRGBDiurnaAccesa) {obiettivoBRGB = luciTargetBRGB;}
else {obiettivoBRGB = luciTargetBRGBLunare;}
if (luciCurrentBluDx < obiettivoBluDx)
{
if ((msCurrent - msLastUpdateBluDx) > (decimiSecondoIncrementoBluDx * 100))
{
msLastUpdateBluDx = msCurrent;
luciCurrentBluDx++;
analogWrite(PWM_BLU_DX, luciCurrentBluDx);
return;
}
}
else if (luciCurrentBluDx > obiettivoBluDx)
{
if ((msCurrent - msLastUpdateBluDx) > (decimiSecondoDecrementoBluDx * 100))
{
msLastUpdateBluDx = msCurrent;
luciCurrentBluDx--;
analogWrite(PWM_BLU_DX, luciCurrentBluDx);
return;
}
}
if (luciCurrentBluSx < obiettivoBluSx)
{
if ((msCurrent - msLastUpdateBluSx) > (decimiSecondoIncrementoBluSx * 100))
{
msLastUpdateBluSx = msCurrent;
luciCurrentBluSx++;
analogWrite(PWM_BLU_SX, luciCurrentBluSx);
return;
}
}
else if (luciCurrentBluSx > obiettivoBluSx)
{
if ((msCurrent - msLastUpdateBluSx) > (decimiSecondoDecrementoBluSx * 100))
{
msLastUpdateBluSx = msCurrent;
luciCurrentBluSx--;
analogWrite(PWM_BLU_SX, luciCurrentBluSx);
return;
}
}
if (luciCurrent10kDx < obiettivo10kDx)
{
if ((msCurrent - msLastUpdate10kDx) > (decimiSecondoIncremento10kDx * 100))
{
msLastUpdate10kDx = msCurrent;
luciCurrent10kDx++;
analogWrite(PWM_10K_DX, luciCurrent10kDx);
return;
}
}
else if (luciCurrent10kDx > obiettivo10kDx)
{
if ((msCurrent - msLastUpdate10kDx) > (decimiSecondoDecremento10kDx * 100))
{
msLastUpdate10kDx = msCurrent;
luciCurrent10kDx--;
analogWrite(PWM_10K_DX, luciCurrent10kDx);
return;
}
}
if (luciCurrent10kSx < obiettivo10kSx)
{
if ((msCurrent - msLastUpdate10kSx) > (decimiSecondoIncremento10kSx * 100))
{
msLastUpdate10kSx = msCurrent;
luciCurrent10kSx++;
analogWrite(PWM_10K_SX, luciCurrent10kSx);
return;
}
}
else if (luciCurrent10kSx > obiettivo10kSx)
{
if ((msCurrent - msLastUpdate10kSx) > (decimiSecondoDecremento10kSx * 100))
{
msLastUpdate10kSx = msCurrent;
luciCurrent10kSx--;
analogWrite(PWM_10K_SX, luciCurrent10kSx);
return;
}
}
if (luciCurrent20kDx < obiettivo20kDx)
{
if ((msCurrent - msLastUpdate20kDx) > (decimiSecondoIncremento20kDx * 100))
{
msLastUpdate20kDx = msCurrent;
luciCurrent20kDx++;
analogWrite(PWM_20K_DX, luciCurrent20kDx);
return;
}
}
else if (luciCurrent20kDx > obiettivo20kDx)
{
if ((msCurrent - msLastUpdate20kDx) > (decimiSecondoDecremento20kDx * 100))
{
msLastUpdate20kDx = msCurrent;
luciCurrent20kDx--;
analogWrite(PWM_20K_DX, luciCurrent20kDx);
return;
}
}
if (luciCurrent20kSx < obiettivo20kSx)
{
if ((msCurrent - msLastUpdate20kSx) > (decimiSecondoIncremento20kSx * 100))
{
msLastUpdate20kSx = msCurrent;
luciCurrent20kSx++;
analogWrite(PWM_20K_SX, luciCurrent20kSx);
return;
}
}
else if (luciCurrent20kSx > obiettivo20kSx)
{
if ((msCurrent - msLastUpdate20kSx) > (decimiSecondoDecremento20kSx * 100))
{
msLastUpdate20kSx = msCurrent;
luciCurrent20kSx--;
analogWrite(PWM_20K_SX, luciCurrent20kSx);
return;
}
}
if (luciCurrentRRGB < obiettivoRRGB)
{
if ((msCurrent - msLastUpdateRRGB) > (decimiSecondoIncrementoRRGB * 100))
{
msLastUpdateRRGB = msCurrent;
luciCurrentRRGB++;
analogWrite(PWM_RGB_RED, luciCurrentRRGB);
return;
}
}
else if (luciCurrentRRGB > obiettivoRRGB)
{
if ((msCurrent - msLastUpdateRRGB) > (decimiSecondoDecrementoRRGB * 100))
{
msLastUpdateRRGB = msCurrent;
luciCurrentRRGB--;
analogWrite(PWM_RGB_RED, luciCurrentRRGB);
return;
}
}
if (luciCurrentGRGB < obiettivoGRGB)
{
if ((msCurrent - msLastUpdateGRGB) > (decimiSecondoIncrementoGRGB * 100))
{
msLastUpdateGRGB = msCurrent;
luciCurrentGRGB++;
analogWrite(PWM_RGB_GREEN, luciCurrentGRGB);
return;
}
}
else if (luciCurrentGRGB > obiettivoGRGB)
{
if ((msCurrent - msLastUpdateGRGB) > (decimiSecondoDecrementoGRGB * 100))
{
msLastUpdateGRGB = msCurrent;
luciCurrentGRGB--;
analogWrite(PWM_RGB_GREEN, luciCurrentGRGB);
return;
}
}
if (luciCurrentBRGB < obiettivoBRGB)
{
if ((msCurrent - msLastUpdateBRGB) > (decimiSecondoIncrementoBRGB * 100))
{
msLastUpdateBRGB = msCurrent;
luciCurrentBRGB++;
analogWrite(PWM_RGB_BLUE, luciCurrentBRGB);
return;
}
}
else if (luciCurrentBRGB > obiettivoBRGB)
{
if ((msCurrent - msLastUpdateBRGB) > (decimiSecondoDecrementoBRGB * 100))
{
msLastUpdateBRGB = msCurrent;
luciCurrentBRGB--;
analogWrite(PWM_RGB_BLUE, luciCurrentBRGB);
return;
}
}
}
segue ....
Scusa una domanda....vorrei anche io postare il mio codice ma come hai fatto a postare il codice nei riquadri con la barra di scorrimento?
Carletto73
13-11-2011, 00:03
usi i tag CODE quelli che saltano fuori con il simbolo del cancelletto
superpozzy
13-11-2011, 00:06
Sperando che sia leggibile posto un mio programmino che gestisce 9 pwm per le luci (blu dx e sx, 10000K dx e sx, 20000K dx e sx e rgb).
sticazz'!! :#O
billykid591 nel riquadro delle risposte, sotto al sibolino di youtube, c'è il "cancelletto" per inserire i codici... ;-)
Carletto73
13-11-2011, 11:10
è leggermente complesso perchè tiene conto dei tempi di alba e tramonto che sono programmabili via web e se uno imposta 15 minuti per esempio, se scegli il programma sx e dx assieme e bianchi e blu assieme fa durare la rampa di accensione 15 minuti per tutti i canali tenendo conto di dover raggiungere il valore massimo impostato per ogni canale (quindi se il 10000K deve raggiungere solo il 50% ed il blu il 90% termineranno la rampa nello stesso secondo), se uno sceglie prima blu poi bianchi invece i blu ci accendono in 7,5 minuti e così i bianchi, se uno inoltre sceglie prima bianchi poi blu e l'effetto est/ovest i blu dx si accendono in 3 minuti e 45 e così gli altri canali
billykid591
13-11-2011, 17:31
Come avevo anticipato posto il codice del mio programma gestione Plafoniera a LED....è lungo e complesso....però al momento funziona bene. le librerie per la maggioranza le trovate sul sito ufficiale di Arduino alcune invece le ho modificate per adattarle al mio schema....comunque può servire per prendere spunto.
//Programma di controllo della scheda ARQUARIUM
//per la gestione di una plafoniera dimmerabile per
//effetto alba tramonto in pwm 0 - 5 volt
//canali disponibili 5
//# Include
//# ==================================
#include <LiquidCrystal_I2C.h>
#include <Menu.h>
#include <LCDMenu2_I2C.h>
#include <EEPROM.h>
#include <DS1307.h>
#include <Wire.h>
#include <WProgram.h>
#include <EEPROMVar.h>
//# Define
//# ==================================
#define _LCD_rows 4 // numero di righe del display alfanumerico
#define _LCD_cols 20 // numero di colonne del display
#define _BUTTON_up 2
#define _BUTTON_down 4
#define _BUTTON_enter 7
#define _BUTTON_left 14
#define _BUTTON_right 15
#define _BUTTON_prestat 0
#define _BUTTON_press_time 500 //250
#define OPEN_PLAFO 8 // ingresso dell'interruttore per spegnimento plafo quando sollevata
#define ONE_LED 9 // primo canale LED pwm warm nel dolce
#define TWO_LED 10 // secondo canale LED pwm cool nel dolce
#define THREE_LED 11 // terzo canale LED pwm red nel dolce
#define FOUR_LED 3 // quarto canale LED pwm
#define FIVE_LED 5 // quinto canale LED pwm
#define LCD_LIGHT 6 // uscita per backlight del display
#define TEMP_INPUT 16 // ingresso per sensore temperatura
//# Definizioni variabili EEPROM
EEPROMVar<int> EpromOneStartHour = 9; // ora accensione canale uno
EEPROMVar<int> EpromOneStartMinute = 5; // minuto accensione canale uno
EEPROMVar<int> EpromOneStopHour = 20; // ora spegnimento canale uno
EEPROMVar<int> EpromOneStopMinute = 55; // minuto spegnimento canale uno
EEPROMVar<int> EpromOneMax = 100; // massima luminosità canale uno
EEPROMVar<int> EpromOneFadeDuration = 60; // tempo in minuti alba tramonto canale uno
EEPROMVar<int> EpromTwoStartHour = 9;
EEPROMVar<int> EpromTwoStartMinute = 10;
EEPROMVar<int> EpromTwoStopHour = 21;
EEPROMVar<int> EpromTwoStopMinute = 50;
EEPROMVar<int> EpromTwoMax = 100;
EEPROMVar<int> EpromTwoFadeDuration = 60;
EEPROMVar<int> EpromThreeStartHour = 9;
EEPROMVar<int> EpromThreeStartMinute = 0;
EEPROMVar<int> EpromThreeStopHour = 21;
EEPROMVar<int> EpromThreeStopMinute = 0;
EEPROMVar<int> EpromThreeMax = 100;
EEPROMVar<int> EpromThreeFadeDuration = 60;
EEPROMVar<int> EpromTimeLcd= 100; // tempo massimo retroilluminazione LCD
EEPROMVar<int> EpromMaxOpenPlafo = 100; // luminosità massima con plafo aperta
// Le variabili sottoelencate possono essere usate se si ha bisogno di
// controllare più di tre canali
//EEPROMVar<int> EpromFourStartHour = 9;
//EEPROMVar<int> EpromFourStartMinute = 5;
//EEPROMVar<int> EpromFourStopHour = 20;
//EEPROMVar<int> EpromFourStopMinute = 55;
//EEPROMVar<int> EpromFourMax = 100;
//EEPROMVar<int> EpromFourFadeDuration = 60;
//EEPROMVar<int> EpromFiveStartHour = 9;
//EEPROMVar<int> EpromFiveStartMinute = 10;
//EEPROMVar<int> EpromFiveStopHour = 21;
//EEPROMVar<int> EpromFiveStopMinute = 50;
//EEPROMVar<int> EpromFiveMax = 100;
//EEPROMVar<int> EpromFiveFadeDuration = 60;
// variabili di tempo da collegare a quelle in memoria EEPROM
int oneStartHour;
int oneStopHour;
int oneStartMinute;
int oneStopMinute;
int twoStartHour;
int twoStopHour;
int twoStartMinute;
int twoStopMinute;
int threeStartHour;
int threeStopHour;
int threeStartMinute;
int threeStopMinute;
int oneMinFade;
int twoMinFade;
int threeMinFade;
//int fourStartHour;
//int fourStopHour;
//int fourStartMinute;
//int fourStopMinute;
//int fiveStartHour;
//int fiveStopHour;
//int fiveStartMinute;
//int fiveStopMinute;
//int sixStartHour;
//int sixStopHour;
//int sixStartMinute;
//int sixStopMinute;
//int fourMinFade;
//int fiveMinFade;
//int sixMinFade;
//# Variabili di tempo per gestione accensione spegnimento e fading
long oneStartSeconds; // Ora accensione canale uno in secondi
long onePhotoPeriod; // durata foto periodo canale uno
int oneMax; // luminosità massima canale uno
long oneFadeDuration; // durata alba tramonto canale uno
long twoStartSeconds; // Ora accensione canale due in secondi
long twoPhotoPeriod; // durata foto periodo canale due
int twoMax; // luminosità massima canale due
long twoFadeDuration; // durata alba tramonto canale due
long threeStartSeconds; // Ora accensione canale tre in minuti
long threePhotoPeriod; // durata foto periodo canale tre
int threeMax; // luminosità massima canale tre
long threeFadeDuration; // durata alba tramonto canale tre
//le variabili sottostanti possono essere usate se si ha
// bisogno di controllare più di tre canali
//long fourStartSeconds; // Ora accensione canale quattro
//long fourPhotoPeriod; // durata foto periodo canale quattro
//int fourMax; // luminosità massima canale quattro
//long fourFadeDuration; // durata alba tramonto canale quattro
//long fiveStartSeconds; // Ora accensione canale cinque
//long fivePhotoPeriod; // durata foto periodo canale cinque
//int fiveMax; // luminosità massima canale cinque
//long fiveFadeDuration; // durata alba tramonto canale cinque
//long sixStartSeconds; // Ora accensione canale sei
//long sixPhotoPeriod; // durata foto periodo canale sei
//int sixMax; // luminosità massima canale sei
//long sixFadeDuration; // durata alba tramonto canale sei
int max1; // variabile collegata a oneMax
int max2; // variabile collegata a twoMax
int max3; // variabile collegata a threeMax
int ora; // variabile ora corrente
int minuti; // variabile minuto corrente
int giorno; // variabile giorno corrente
int mese; // variabile mese corrente
int anno; // variabile anno corrente
// variabili controllo LED
long secondCounter = 0; // contatore che si resetta alla emzzanotte
long oldSecondCounter = 0; // contatore che si resetta alla mezzanotte
int oneVal; // valore corrente luminosità canale uno
int twoVal; // valore corrente luminosità canale due
int threeVal; // valore corrente luminosità canale tre
// variabili da usare se servono più di tre canali di controllo
//int fourVal; // valore corrente luminosità canale quattro
//int fiveVal; // valore corrente luminosità canale cinque
//int sixVal; // valore corrente luminosità canale sei
int setting = 0; // variabile di controllo modalità settaggi valori
long tempo_home = 0, back_home = 50000;
long tempo;
long tempo_barra;
int stepper_bar = 2;
int colonna = 0;
boolean on_off_light= false; // variabile di controllo stato accensione-spegnimento plafo
boolean LCD_time_on= true;
boolean blinker; // variabile booleana per settare o no il blink sull'LCD
long timeLcd; // tempo retroilluminazione LCD
int maxOpenPlafo; // luminosità residua palfoniera aperta
int control_light_stop = 0;
int cursorPosition = 0;
int buttonPress = 0;
float tempC;
int reading;
byte outValOne; // variabile controllo valore uscita in modalità accensione manuale
byte outValTwo;
byte outValThree;
const byte rowMessage = 2; // numero della riga del display dove appaiono i valori da modificare
byte firstStepTemp = 40; // max temperatura primo step abbassamento luminosità LED del 10%
byte secondStepTemp = 45; // max temperatura secondo step abbassamento luminosità LED del 40%
byte thirdStepTemp = 50; // max temperatura terzo step spegnimento LED
//# Creazione caratteri personali
//# ==================================
uint8_t arrow_up[8] = { // freccia su
0x4,0xE,0x15,0x4,0x4,0x4,0x0};
uint8_t arrow_down[8] = { // freccia giù
0x0,0x4,0x4,0x4,0x15,0xE,0x4};
//uint8_t light_on[8] = {
// 0x0,0x15,0xA,0x1F,0xA,0x15,0x0}; // plafo accesa
uint8_t punto[8] = {
0xC,0xC,0x0,0x0,0x0,0x0,0x0}; // punto gradi centigradi
uint8_t one_bar[8] = {
0x10,0x10,0x10,0x10,0x10,0x10,0x10}; // una barra verticale
uint8_t two_bar[8] = {
0x18,0x18,0x18,0x18,0x18,0x18,0x18}; // due barre verticali
uint8_t tree_bar[8] = {
0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}; // tre barre verticali
uint8_t four_bar[8] = {
0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E}; // quattro barre verticali
uint8_t five_bar[8] = {
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}; // cinque barre verticali
//# Classes
//# ==================================
LiquidCrystal_I2C lcd(0x20,_LCD_cols,_LCD_rows); // set the LCD address to 0x20 for a 16 chars and 2 line display
//LiquidCrystal lcd(2,3,4,5,6,7); // Neuste Version, RW wird nicht mehr gebraucht
Menu top("Root");
// menu, lcd, rows, cols, arrow_up_pos, arrow_down_pos
LCDMenu2 Root(top, lcd , _LCD_rows, _LCD_cols, 0, 1);
//# Buttons
//# ==================================
//UP,DOWN,ENTER,LEFT,RIGHT
int but[5]= {
_BUTTON_up,_BUTTON_down,_BUTTON_enter,_BUTTON_left ,_BUTTON_right};
//Previous States of buttons
boolean pbut[5]={
_BUTTON_prestat,_BUTTON_prestat,_BUTTON_prestat,_B UTTON_prestat,_BUTTON_prestat};
//# Button Enter
//# ==================================
int button_press_enter = 0;
unsigned long g_button_press_time = millis();
// creazione voci del menu e sottomenu..è possibile sostituirle cone voci proprie
// senza superare il numero massimo di colonne - 1 del dislplay LCD impiegato
char strMenuInit[] = "Menu";
char strMenuDate[] = "Imp. Data/Ora";
char strMenuTime[] = "Imp. Tempi on/off";
char strMenuFade[] = "Imp. Alba/Tramonto";
char strMenuLux[] = "Imp. Luminosita'";
char strMenuManualOn[] = "On/Off Manuale";
char strMenuLcdTime[] = "Imp. Tempo LCD";
char strMenuOpenPlafo[] = "Lum. Plafo aperta";
char strMenuTimeOne[] = "Imp. Tempo Warm";
char strMenuTimeTwo[] = "Imp. Tempo Cool";
char strMenuTimeThree[] = "Imp. Tempo Red";
//char strMenuFadeOne[] = "Imp. Fading Warm";
//char strMenuFadeTwo[] = "Imp. Fading Cool";
//char strMenuFadeThree[] = "Imp. Fading Red";
//char strMenuLuxOne[] = "Imp. Lum. Warm";
//char strMenuLuxTwo[] = "Imp. Lum. Cool";
//char strMenuLuxThree[] = "Imp. Lum. Red";
// voci del menu relative ai canali dal 3 al 6 da utilizzare se servono
//char strMenuTimeFour[] = "";
//char strMenuTimeFive[] = "";
//char strMenuTimeSix[] = "";
//char strMenuFadeFour[] = "";
//char strMenuFadeFive[] = "";
//char strMenuFadeSix[] = "";
//char strMenuLuxFour[] = "";
//char strMenuLuxFive[] = "";
//char strMenuLuxSix[] = "";
//# Menu
//# ==================================
Menu Item1(strMenuInit);
Menu Item12(strMenuDate);
Menu Item13(strMenuTime);
Menu Item14(strMenuFade);
Menu Item15(strMenuLux);
Menu Item16(strMenuManualOn);
Menu Item17(strMenuLcdTime);
Menu Item18(strMenuOpenPlafo);
Menu Item131(strMenuTimeOne);
Menu Item132(strMenuTimeTwo);
Menu Item133(strMenuTimeThree);
//Menu Item134(strMenuTimeFour);
//Menu Item135(strMenuTimeFive);
//Menu Item136(strMenuTimeSix);
//Menu Item141(strMenuFadeOne);
//Menu Item142(strMenuFadeTwo);
//Menu Item143(strMenuFadeThree);
//Menu Item144(strMenuFadeFour);
//Menu Item145(strMenuFadeFive);
//Menu Item146(strMenuFadeSix);
//Menu Item151(strMenuLuxOne);
//Menu Item152(strMenuLuxTwo);
//Menu Item153(strMenuLuxThree);
//Menu Item154(strMenuLuxFour);
//Menu Item155(strMenuLuxFive);
//Menu Item156(strMenuLuxSix);
//# ==================================
//## Menu Init
void menuinit()
{
top.addChild(Item1);
Item1.addChild(Item12);
Item1.addChild(Item13);
Item1.addChild(Item14);
Item1.addChild(Item15);
Item1.addChild(Item16);
Item1.addChild(Item17);
Item1.addChild(Item18);
Item13.addChild(Item131);
Item13.addChild(Item132);
Item13.addChild(Item133);
// Item13.addChild(Item134);
// Item13.addChild(Item135);
// Item13.addChild(Item136);
// Item14.addChild(Item141);
// Item14.addChild(Item142);
// Item14.addChild(Item143);
// Item14.addChild(Item144);
// Item14.addChild(Item145);
// Item14.addChild(Item146);
// Item15.addChild(Item151);
// Item15.addChild(Item152);
// Item15.addChild(Item153);
// Item15.addChild(Item154);
// Item15.addChild(Item155);
// Item15.addChild(Item156);
Root.display();
}
//## Button
void button(int which, char select='z')
{
if(which == _BUTTON_up || select == 'w') {
//UP
switch (setting) {
case 0:
Root.goUp();
//Serial.println("'up'");
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_down || select == 's') {
//DOWN
switch (setting) {
case 0:
Root.goDown();
//Serial.println("'down'");
break;
default:
selectSet(which);
}
}
else if(which == _BUTTON_left || select == 'l') {
//LEFT
if (cursorPosition >= 1) {
cursorPosition--;
}
switch (setting) {
case 0:
cursorPosition = 0;
goBack();
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_right || select == 'r') {
//RIGHT
if(cursorPosition < 5){
cursorPosition++;
}
switch (setting) {
case 0:
Root.goEnter();
button_press_enter = 1;
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_enter || select == 'e') {
//ENTER
if (setting != 0)
{
save_data();
blinker = false;
print_save_date();
Root.goEnter();
setting = 0;
control_light_stop = 0;
}
set_reset_value();
}
}
//## Button Check
void buttoncheck()
{
for (int i=0;i<=4;i++)
{
if (digitalRead(but[i])) {
if (pbut[i]==0 && (millis()-g_button_press_time) >= _BUTTON_press_time) {
button(but[i]);
buttonPress = but[i];
//pbut[i]=1;
g_button_press_time = millis();
if(timeLcd < 100){
analogWrite(LCD_LIGHT,255);
}
tempo_home = millis();
}
}
else {
pbut[i]=0;
//buttonPress=0;
if( millis() - tempo_home > back_home )
{
Root.goBack();
Root.goBack();
lcd.noBlink();
set_reset_value();
setting = 0;
cursorPosition = 0;
control_light_stop = 0;
LCD_time_on = true;
}
if(timeLcd < 100){
if( millis() - tempo_home > (timeLcd * 1000) )
{
analogWrite(LCD_LIGHT,20);
//tempo_home = millis();
}
}
}
}
//if(Serial.available()) {
// char c = Serial.read();
// button(-1,c);
//}
}
//## Function Check
void funccheck(int button)
{
int x;
if(button_press_enter == 1) {
button_press_enter = 0;
if(Root.curfuncname == strMenuInit) {
//Serial.println("Function: Controller LED");
setting = 0;
LCD_time_on = false;
}
else if(Root.curfuncname == strMenuDate) { // menu impostazione data e ora generale
setting = 1;
//Serial.println("Function: Imp. data ora");
ora = RTC.get(DS1307_HR, true);
minuti = RTC.get(DS1307_MIN, true);
giorno = RTC.get(DS1307_DATE, true);
mese = RTC.get(DS1307_MTH, true);
anno = RTC.get(DS1307_YR, true);
lcd.clear();
print_text(0,0, strMenuDate);
cursorPosition= 1;
print_time_date(2);
setDateHour(button);
// set_month(mese);
// set_year(anno);
// set_hour(ora);
// set_minute(minuti);
// set_day(0);
}
else if(Root.curfuncname == strMenuTimeOne) { // menu impostazione tempi accensione canale uno
Serial.println("Function: Imp. tempi canale uno");
setting = 2;
lcd.clear();
print_text(0,0, strMenuTimeOne);
printStartStopTime(oneStartHour, oneStartMinute, oneStopHour, oneStopMinute);
cursorPosition= 1;
setTimeOne(button);
// set_on_light_minute(led_on_minute);
// set_off_light_hour(led_off_hour);
// set_off_light_minute(led_off_minute);
// set_on_light_hour(led_on_hour);
}
else if(Root.curfuncname == strMenuTimeTwo) { // menu impostazione tempi accensione canale due
setting = 3;
lcd.clear();
print_text(0,0, strMenuTimeTwo);
printStartStopTime(twoStartHour, twoStartMinute, twoStopHour, twoStopMinute);
cursorPosition= 1;
setTimeTwo(button);
}
else if(Root.curfuncname == strMenuTimeThree) { // menu impostazione tempi accensione canale tre
setting = 4;
lcd.clear();
print_text(0,0, strMenuTimeThree);
printStartStopTime(threeStartHour, threeStartMinute, threeStopHour, threeStopMinute);
cursorPosition= 1;
setTimeThree(button);
}
else if(Root.curfuncname == strMenuFade) { // menu impostazione alba tramonto
setting = 5;
lcd.clear();
print_text(0,0, strMenuFade);
print_text(0,1,"Warm Cool Red");
print_text(0,rowMessage,"Min: Min: Min:");
setFadeTime(button, oneMinFade, 4);
setFadeTime(button, twoMinFade, 11);
setFadeTime(button, threeMinFade, 18);
//
// print_value(4,rowMessage, oneMinFade);
// print_value(11,rowMessage, twoMinFade);
// print_value(18,rowMessage, threeMinFade);
cursorPosition= 1;
setFade(button);
}
else if(Root.curfuncname == strMenuLux) { // menu impostazione luminosità LED singoli canali
setting = 6;
control_light_stop = 1;
lcd.clear();
print_text(0,0,strMenuLux);
print_text(1,1,"Warm Cool Red");
setMaxLux(button, oneMax, ONE_LED, 1); // SCRIVE I VALORI DEI CANALI
setMaxLux(button, twoMax, TWO_LED, 7);
setMaxLux(button, threeMax, THREE_LED, 14);
cursorPosition = 1;
setLux(button);
}
else if(Root.curfuncname == strMenuManualOn) { // menu accensione manuale singoli canali
setting = 7;
control_light_stop = 1;
lcd.clear();
print_text(0,0,strMenuManualOn);
print_text(1,1,"Warm Cool Red");
outValOne = 0;
outValTwo = 0;
outValThree = 0;
manualOn(button, outValOne, ONE_LED, 1);
manualOn(button, outValTwo, TWO_LED, 7);
manualOn(button, outValThree, THREE_LED, 14);
cursorPosition= 1;
setManualOn(button);
/* manual_on_off_cool(on_off_light);
manual_on_off_red(on_off_light);
manual_on_off_warm(on_off_light);*/
}
else if(Root.curfuncname == strMenuLcdTime) { // menu impostazione tempo accesnione backlight dell'LCD
setting = 8;
lcd.clear();
print_text(0,0,strMenuLcdTime);
print_text(0,rowMessage,"Secondi:");
setLcdTime(button);
}
else if(Root.curfuncname == strMenuOpenPlafo) { // menu impostazione luce residua LED a plafo aperta
setting = 9;
lcd.clear();
blinker = true;
print_text(0,0,strMenuOpenPlafo);
print_text(0,rowMessage,"Luminosita':");
setLuxOpenPlafo(button);
}
}
}
//# Setup
//# ==================================
void setup()
{
lcd.begin(_LCD_rows,_LCD_cols);
lcd.createChar(0, arrow_up);
lcd.createChar(1, arrow_down);
//lcd.createChar(2, light_on);
lcd.createChar(2, punto);
lcd.createChar(3, one_bar);
lcd.createChar(4, two_bar);
lcd.createChar(5, tree_bar);
lcd.createChar(6, four_bar);
lcd.createChar(7, five_bar);
lcd.init();
//lcd.home();
analogReference(INTERNAL);
pinMode(OPEN_PLAFO, INPUT);
pinMode(ONE_LED, OUTPUT);
pinMode(TWO_LED, OUTPUT);
pinMode(THREE_LED, OUTPUT);
pinMode(FOUR_LED, OUTPUT);
pinMode(FIVE_LED, OUTPUT);
pinMode(LCD_LIGHT, OUTPUT);
pinMode(TEMP_INPUT, INPUT);
analogWrite(LCD_LIGHT,20);
set_reset_value();
tempo = millis();
menuinit();
Serial.begin(9600);
}
//# LOOP
//# ==================================
void loop()
{
buttoncheck();
funccheck(buttonPress);
reading = analogRead(TEMP_INPUT);
tempC = reading / 9.31;
//tempC = (5.0 * reading * 100.0)/1024.0;
controlTempLed(byte(tempC));
Serial.println("Setting:");
Serial.println(setting);
Serial.println("Cursor position");
Serial.println(cursorPosition);
Serial.println("Button Press");
Serial.println(buttonPress);
Serial.println(Root.curfuncname);
Serial.println("Tempo LCD");
Serial.println(timeLcd);
Serial.println("Temperatura");
Serial.println(tempC);
//control_led_lights();
oldSecondCounter = secondCounter;
secondCounter = (long) RTC.get(DS1307_HR,true) * 3600 + (long) RTC.get(DS1307_MIN,false)* 60 + (long) RTC.get(DS1307_SEC,false);
// controlla e setta la durata del fading
if(oneFadeDuration > onePhotoPeriod/2 && onePhotoPeriod > 0) {
oneFadeDuration = onePhotoPeriod/2;
}
if(oneFadeDuration < 1){
oneFadeDuration = 1;
}
if(twoFadeDuration > twoPhotoPeriod/2 && twoPhotoPeriod > 0) {
twoFadeDuration = twoPhotoPeriod/2;
}
if(twoFadeDuration < 1){
twoFadeDuration = 1;
}
if(threeFadeDuration > threePhotoPeriod/2 && threePhotoPeriod > 0) {
threeFadeDuration = threePhotoPeriod/2;
}
if(threeFadeDuration < 1){
threeFadeDuration = 1;
}
//setta le uscite
oneVal = setLed(secondCounter, ONE_LED, oneStartSeconds, onePhotoPeriod, oneFadeDuration, oneMax);
twoVal = setLed(secondCounter, TWO_LED, twoStartSeconds, twoPhotoPeriod, twoFadeDuration, twoMax);
threeVal = setLed(secondCounter, THREE_LED, threeStartSeconds, threePhotoPeriod, threeFadeDuration, threeMax);
if(oneVal > 0 || twoVal > 0 || threeVal > 0)
{ on_off_light= true;}
else
{ on_off_light= false;}
Serial.println("Oneval");
Serial.println(oneVal);
Serial.println("twoval");
Serial.println(twoVal);
Serial.println("threeval");
Serial.println(threeVal);
Serial.println(secondCounter);
Serial.println(oneStartSeconds);
Serial.println(onePhotoPeriod);
Serial.println(oneFadeDuration);
Serial.println("Control light stop");
Serial.println(control_light_stop);
offPlafo();
if (timeLcd == 100){
analogWrite(LCD_LIGHT,255);
}
if (LCD_time_on == true)
{
printTemp(int(tempC));
print_time_date(3);
}
//delay(500);
}
//Funzione per settare accensione
//e spegnimento dei singoli canali LED
//con gestione effetto alba tramonto
int setLed(long Seconds, // tempo corrente in secondi
int ledPin, // numero di pin del canale LED
long start, // tempo di partenza accensione del canale LED
long period, // Periodo di accensione del canale LED
long fade, // durata alba tramonto canale LED
int ledMax // luminosità massima canale LED
)
{
// controlla che non si sia in modalità settaggio luminosità,
// on/off manuale o il coperchio alzato in quel caso esce dalla funzione
int val;
if (control_light_stop == 0){
// fade up...ossia gestione alba
if (Seconds > start || Seconds <= start + fade) {
val = map(Seconds - start, 0, fade, 0, ledMax * 2.55);
}
// fade down...gestione tramonto
if (Seconds > start + period && Seconds <= start + period + fade) {
val = map(Seconds - (start + period), 0, fade, ledMax * 2.55, 0);
}
// off or post-midnight run spegnimento o partenza dopo mezzanotte
if (Seconds <= start || Seconds > start + period + fade) {
if((start + period + fade)%86400 < start && (start + period + fade)%86400 > Seconds)
{
val = map((start + period + fade - Seconds)%86400,0,fade,0,ledMax * 2.55);
}
else {
val = 0;
}
}
if (val > ledMax * 2.55) {
val = ledMax * 2.55;
}
if (val < 0) {
val = 0;
}
analogWrite(ledPin, val); // map(val, 0, 100, 0, 255));
return val;
}
}
//* Funzione print time_date
//* mostra data e ora sul display
void print_time_date(byte row)
{
int ora;
int minuti;
int secondi;
int giorno;
int mese;
int anno;
ora = RTC.get(DS1307_HR, true);
minuti = RTC.get(DS1307_MIN, true);
secondi = RTC.get(DS1307_SEC, true);
giorno = RTC.get(DS1307_DATE, true);
mese = RTC.get(DS1307_MTH, true);
anno = RTC.get(DS1307_YR, true);
blinker = false;
if (giorno < 10 && giorno > 0) {
print_value(0,row,0);
print_value(1,row,giorno);
}
else {
print_value(0,row,giorno);
}
print_text(2,row,"-");
if (mese < 10 && mese > 0) {
print_value(3,row,0);
print_value(4,row,mese);
}
else {
print_value(3,row,mese);
}
print_text(5,row,"-");
print_value(6,row,anno);
if (ora < 10 && ora >= 0) {
print_text(11,row," ");
print_value(12,row,ora);
}
else {
print_value(11,row,ora);
}
print_text(13,row,":");
if (minuti < 10 && minuti >= 0) {
print_value(14,row,0);
print_value(15,row,minuti);
}
else {
print_value(14,row,minuti);
}
print_text(16,row,":");
if (secondi < 10 && secondi >= 0) {
print_value(17,row,0);
print_value(18,row,secondi);
}
else {
print_value(17,row,secondi);
}
}
// funzione di settaggio data e ora corrente
void setDateHour(int button)
{
print_text(16,rowMessage," "); // rende non visibili i secondi
switch (cursorPosition) {
case 0:
case 1:
set_day(button);
break;
case 2:
set_month(button);
break;
case 3:
set_year(button);
break;
case 4:
set_hour(button);
break;
case 5:
set_minute(button);
break;
default:
cursorPosition = 5;
break;
}
}
//* settaggio giorno
void set_day(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(giorno >= 1 && giorno < 32){
giorno++;
}
if(giorno == 32){
giorno = 1;
}
}
if (button == _BUTTON_down) {
if(giorno > 0 && giorno <= 31){
giorno--;
}
if(giorno == 0){
giorno = 31;
}
}
if (giorno < 10 && giorno > 0) {
print_value(0,rowMessage,0);
print_value(1,rowMessage,giorno);
}
else {
print_value(0,rowMessage,giorno);
}
print_text(2,rowMessage,"-");
lcd.setCursor(1,rowMessage);
}
//* settaggio mese
void set_month(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(mese >= 1 && mese < 13){
mese++;
}
if(mese == 13){
mese = 1;
}
}
if (button == _BUTTON_down) {
if(mese > 0 && mese <= 12){
mese--;
}
if(mese == 0){
mese = 12;
}
}
if (mese < 10 && mese > 0) {
print_value(3,rowMessage,0);
print_value(4,rowMessage,mese);
}
else {
print_value(3,rowMessage,mese);
}
print_text(5,rowMessage,"-");
lcd.setCursor(4,rowMessage);
}
//* settaggio anno
void set_year(int button)
{
blinker = true;
if (button == _BUTTON_up) {
anno++;
}
if (button == _BUTTON_down) {
anno--;
}
print_value(6,rowMessage,anno);
lcd.setCursor(9,rowMessage);
}
//* settaggio ora
void set_hour(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(ora >= 0 && ora < 24){
ora++;
}
if(ora == 24){
ora = 0;
}
}
if (button == _BUTTON_down) {
if(ora > -1 && ora <= 23){
ora--;
}
if(ora == -1){
ora = 23;
}
}
if (ora < 10 && ora >= 0) {
print_value(11,rowMessage,0);
print_value(12,rowMessage,ora);
}
else {
print_value(11,rowMessage,ora);
}
print_text(13,rowMessage,":");
lcd.setCursor(12,rowMessage);
}
//* settaggio minuti
void set_minute(int button)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(minuti >= 0 && minuti < 60){
minuti++;
}
if(minuti == 60){
minuti = 0;
}
}
if (button == _BUTTON_down) {
if(minuti > -1 && minuti <= 59){
minuti--;
}
if(minuti == -1){
minuti = 59;
}
}
if (minuti < 10 && minuti >= 0) {
print_value(14,rowMessage,0);
print_value(15,rowMessage,minuti);
}
else {
print_value(14,rowMessage,minuti);
}
lcd.setCursor(15,rowMessage);
}
// setta accensione e spegnimento canale uno
void setTimeOne(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, oneStartHour);
break;
case 2:
setStartMinute(button, oneStartMinute);
break;
case 3:
setStopHour(button, oneStopHour);
break;
case 4:
setStopMinute(button, oneStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
// setta accensione e spegnimento canale due
void setTimeTwo(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, twoStartHour);
break;
case 2:
setStartMinute(button, twoStartMinute);
break;
case 3:
setStopHour(button, twoStopHour);
break;
case 4:
setStopMinute(button, twoStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
// setta accensione e spegnimento canale tre
void setTimeThree(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, threeStartHour);
break;
case 2:
setStartMinute(button, threeStartMinute);
break;
case 3:
setStopHour(button, threeStopHour);
break;
case 4:
setStopMinute(button, threeStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
//* settaggio ora accensione LED
void setStartHour(int button, int &led_on_hour)
{
blinker = true;
if (button == _BUTTON_up) {
if(led_on_hour >= 0 && led_on_hour < 24){
led_on_hour++;
}
if(led_on_hour == 24){
led_on_hour = 0;
}
}
if (button == _BUTTON_down) {
if(led_on_hour > -1 && led_on_hour <= 23){
led_on_hour--;
}
if(led_on_hour == -1){
led_on_hour = 23;
}
}
if (led_on_hour < 10 && led_on_hour >= 0) {
print_value(4,rowMessage,0);
print_value(5,rowMessage,led_on_hour);
}
else {
print_value(4,rowMessage,led_on_hour);
}
print_text(6,rowMessage,":");
lcd.setCursor(5,rowMessage);
}
//* settaggio minuto accensione LED
void setStartMinute(int button, int &led_on_minute)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(led_on_minute >= 0 && led_on_minute < 60){
led_on_minute++;
}
if(led_on_minute == 60){
led_on_minute = 0;
}
}
if (button == _BUTTON_down) {
if(led_on_minute > -1 && led_on_minute <= 59){
led_on_minute--;
}
if(led_on_minute == -1){
led_on_minute = 59;
}
}
if (led_on_minute < 10 && led_on_minute >= 0) {
print_value(7,rowMessage,0);
print_value(8,rowMessage,led_on_minute);
}
else {
print_value(7,rowMessage,led_on_minute);
}
lcd.setCursor(8,rowMessage);
}
//* settaggio ora spegnimento LED
void setStopHour(int button, int &led_off_hour)
{
blinker = true;
if (button == _BUTTON_up) {
if(led_off_hour >= 0 && led_off_hour < 24){
led_off_hour++;
}
if(led_off_hour == 24){
led_off_hour = 0;
}
}
if (button == _BUTTON_down) {
if(led_off_hour > -1 && led_off_hour <= 23){
led_off_hour--;
}
if(led_off_hour == -1){
led_off_hour = 23;
}
}
if (led_off_hour < 10 && led_off_hour >= 0) {
print_value(14,rowMessage,0);
print_value(15,rowMessage,led_off_hour);
}
else {
print_value(14,rowMessage,led_off_hour);
}
print_text(16,rowMessage,":");
lcd.setCursor(15,rowMessage);
}
//* settaggio minuti spegnimento LED
void setStopMinute(int button, int &led_off_minute)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(led_off_minute >= 0 && led_off_minute < 60){
led_off_minute++;
}
if(led_off_minute == 60){
led_off_minute = 0;
}
}
if (button == _BUTTON_down) {
if(led_off_minute > -1 && led_off_minute <= 59){
led_off_minute--;
}
if(led_off_minute == -1){
led_off_minute = 59;
}
}
if (led_off_minute < 10 && led_off_minute >= 0) {
print_value(17,rowMessage,0);
print_value(18,rowMessage,led_off_minute);
}
else {
print_value(17,rowMessage,led_off_minute);
}
lcd.setCursor(18,rowMessage);
}
void setFade(int button){ // settaggio alba tramonto dei canali
switch (cursorPosition) {
case 0:
case 1:
setFadeTime(button, oneMinFade, 4);
break;
case 2:
setFadeTime(button, twoMinFade, 11);
break;
case 3:
setFadeTime(button, threeMinFade, 18);
break;
default:
cursorPosition = 3;
break;
}
}
//* settaggio tempo alba/tramonto
void setFadeTime(int button,int &varFade, byte chrPos)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(varFade >= 0 && varFade <= 60){
varFade++;
}
if(varFade == 61){
varFade = 0;
}
}
if (button == _BUTTON_down) {
if(varFade > -1 && varFade <= 60){
varFade--;
}
if(varFade == -1){
varFade = 60;
}
}
if (varFade < 10 && varFade >=0){
print_value(chrPos,rowMessage,0);
print_value(chrPos+1,rowMessage,varFade);
}
else {
print_value(chrPos,rowMessage,varFade);
}
lcd.setCursor(chrPos+1,rowMessage);
}
void setLux(int button){
switch (cursorPosition) {
case 0:
case 1:
setMaxLux(button, oneMax, ONE_LED, 1);
break;
case 2:
setMaxLux(button, twoMax, TWO_LED, 7);
break;
case 3:
setMaxLux(button, threeMax, THREE_LED, 14);
default:
cursorPosition = 3;
break;
}
}
//* settaggio luminosità massima dei vari canali
void setMaxLux(int button, int &varLux, byte PIN_LED, byte chrPos){
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(varLux >= 0 && varLux < 100){
varLux++;
}
}
if (button == _BUTTON_down) {
if(varLux > 0 && varLux <= 100){
varLux--;
}
}
int bright = (varLux * 2.55);
//Serial.println(lux);
analogWrite(PIN_LED, bright);
blinker = true;
if (varLux < 10) {
lcd.setCursor(chrPos,rowMessage);
lcd.print(' ');
lcd.setCursor(chrPos+1,rowMessage);
lcd.print(' ');
print_value(chrPos+2,rowMessage,varLux);
}
else if (varLux >= 10 && varLux <= 99){
lcd.setCursor(chrPos,rowMessage);
lcd.print(' ');
print_value(chrPos+1,rowMessage,varLux);
}
else {
print_value(chrPos,rowMessage,varLux);
}
lcd.print("%");
}
void setManualOn(int button){ //setta on off manualmente i singoli canali
switch (cursorPosition) {
case 0:
case 1:
manualOn(button, outValOne, ONE_LED, 1);
break;
case 2:
manualOn(button, outValTwo, TWO_LED, 7);
break;
case 3:
manualOn(button, outValThree, THREE_LED, 14);
default:
cursorPosition = 3;
break;
}
}
//* accensione manuale dei canali
void manualOn(int button, byte &Val, byte PIN_LED, byte chrPos)
{
blinker = true;
if (button == _BUTTON_up) {
Val = 255;
//analogWrite(PIN_LED, Val);
}
if (button == _BUTTON_down) {
Val = 0;
//analogWrite(PIN_LED, Val);
}
if(Val > 0)
{
print_text(chrPos + 1,rowMessage,"On ");
lcd.setCursor(chrPos,rowMessage);
}
else
{
print_text(chrPos + 1,rowMessage,"Off");
lcd.setCursor(chrPos,rowMessage);
}
analogWrite(PIN_LED, Val);
}
void setLcdTime(int button){ //settaggio del tempo di illuminazione dell'LCD
blinker = true;
if (button == _BUTTON_up) {
if(timeLcd >= 0 && timeLcd <= 90){
timeLcd = timeLcd + 10;
}
}
if (button == _BUTTON_down) {
if(timeLcd > 10 && timeLcd <= 100){
timeLcd = timeLcd -10;
}
}
if (timeLcd <= 90){
print_value(9,rowMessage,timeLcd);
}
else{
print_text(9,rowMessage,"On");
}
}
void setLuxOpenPlafo(int button){ // settaggio minima luminosità led a plafo aperta
blinker = true;
if (button == _BUTTON_up) {
if(maxOpenPlafo >= 0 && maxOpenPlafo <= 99){
maxOpenPlafo++;
}
}
if (button == _BUTTON_down) {
if(maxOpenPlafo > 1 && maxOpenPlafo <= 100){
maxOpenPlafo--;
}
}
if(maxOpenPlafo > 9 && maxOpenPlafo < 100){
print_text(12,rowMessage," ");
print_value(13,rowMessage,maxOpenPlafo);
}
if(maxOpenPlafo < 10){
print_text(12,rowMessage," ");
print_value(14,rowMessage,maxOpenPlafo);
}
}
//* Funzione per la stampa su LCD di valori numerici
void print_value(int col, int row, int value)
{
lcd.setCursor(col,row);
lcd.print(value);
if (blinker == true) {
lcd.blink();
}
else {
lcd.noBlink();
}
}
//* Funzione per la stampa su LCD di valori testo
void print_text(int col, int row, char* text)
{
lcd.setCursor(col,row);
lcd.print(text);
if (blinker == true) {
lcd.blink();
}
else {
lcd.noBlink();
}
}
//* Funzione di salvataggio dei dati nella eeprpom relativi a
// data corrente, ora corrente, orari di accensione e spegnimento
// della plafo, tempo di alba-tramonto, luminosità singoli canali
void save_data()
{
if (setting == 1)
{
RTC.stop();
RTC.set(DS1307_MIN,minuti); //setta i minuti
RTC.set(DS1307_HR,ora); //setta l'ora
RTC.set(DS1307_DATE,giorno); //setta la data
RTC.set(DS1307_MTH,mese); //setta il mese
RTC.set(DS1307_YR,(anno-2000)); //setta l'anno
RTC.start();
}
if (setting ==2 || setting == 3 || setting == 4)
{
EpromOneStartHour = oneStartHour;
EpromOneStartMinute = oneStartMinute;
EpromOneStopHour = oneStopHour;
EpromOneStopMinute = oneStopMinute;
EpromTwoStartHour = twoStartHour;
EpromTwoStartMinute = twoStartMinute;
EpromTwoStopHour = twoStopHour;
EpromTwoStopMinute = twoStopMinute;
EpromThreeStartHour = threeStartHour;
EpromThreeStartMinute = threeStartMinute;
EpromThreeStopHour = threeStopHour;
EpromThreeStopMinute = threeStopMinute;
}
if( setting == 5 )
{
EpromOneFadeDuration = oneMinFade;
EpromTwoFadeDuration = twoMinFade;
EpromThreeFadeDuration = threeMinFade;
}
if( setting == 6 )
{
EpromOneMax = oneMax;
EpromTwoMax = twoMax;
EpromThreeMax = threeMax;
}
if( setting == 8 )
{
EpromTimeLcd = timeLcd;
}
if( setting == 9 )
{
EpromMaxOpenPlafo = maxOpenPlafo;
}
}
//* mostra su LCD la scritta dati salvati lampeggiante
void print_save_date()
{
for (int i=0; i <= 3; i++){
print_text(0,3,"Dati salvati");
delay(500);
print_text(0,3," ");
delay(500);
}
}
// funzione di lettura delle memorie all'avvio del programma
// chiamata da setup e ad ogni salvataggio dei dati
// alla prima chiamata controlla se le memorie sono fuori range e
// corregge i dati
void set_reset_value()
{
oneMax = EpromOneMax;
twoMax = EpromTwoMax;
threeMax = EpromThreeMax;
max1 = oneMax;
max2 = twoMax;
max3 = threeMax;
oneStartHour = EpromOneStartHour;
oneStartMinute = EpromOneStartMinute;
oneStartSeconds = (long) oneStartHour * 3600 + (long) oneStartMinute* 60;
twoStartHour = EpromTwoStartHour;
twoStartMinute = EpromTwoStartMinute;
twoStartSeconds = (long) twoStartHour * 3600 + (long) twoStartMinute * 60;
threeStartHour = EpromThreeStartHour;
threeStartMinute = EpromThreeStartMinute;
threeStartSeconds = (long) threeStartHour * 3600 + (long) threeStartMinute * 60;
oneStopHour = EpromOneStopHour;
oneStopMinute = EpromOneStopMinute;
onePhotoPeriod = ((long) oneStopHour * 3600 + (long) oneStopMinute * 60) - oneStartSeconds;
twoStopHour = EpromTwoStopHour;
twoStopMinute = EpromTwoStopMinute;
twoPhotoPeriod = ((long)twoStopHour * 3600 + (long)twoStopMinute * 60) - twoStartSeconds;
threeStopHour = EpromThreeStopHour;
threeStopMinute = EpromThreeStopMinute;
threePhotoPeriod = ((long) threeStopHour * 3600 + (long) threeStopMinute * 60) - threeStartSeconds;
oneMinFade = EpromOneFadeDuration;
twoMinFade = EpromTwoFadeDuration;
threeMinFade = EpromThreeFadeDuration;
oneFadeDuration = (long) oneMinFade * 60;
twoFadeDuration = (long) twoMinFade * 60;
threeFadeDuration = (long) threeMinFade * 60;
timeLcd = EpromTimeLcd;
maxOpenPlafo = EpromMaxOpenPlafo;
// analogWrite(ONE_LED, 0);
// analogWrite(TWO_LED, 0);
// analogWrite(THREE_LED, 0);
}
void offPlafo()
{
if (setting != 7){
if(digitalRead(OPEN_PLAFO)== HIGH){
if(on_off_light == true) {
control_light_stop = 1;
analogWrite(ONE_LED, maxOpenPlafo);
analogWrite(TWO_LED, maxOpenPlafo);
analogWrite(THREE_LED, maxOpenPlafo);
}
}
if(digitalRead(OPEN_PLAFO)== LOW) {
control_light_stop = 0;
}
}
}
void goBack()
{
lcd.noBlink();
Root.goBack();
setting = 0;
if(Root.curfuncname == "Root"){
LCD_time_on = true;
}
}
void goEnter()
{
lcd.noBlink();
Root.goEnter();
setting = 0;
control_light_stop = 0;
}
void printStartStopTime(int startHour,
int startMinute,
int stopHour,
int stopMinute
)
{
print_text(0,rowMessage," On: Off:");
if (startHour < 10 && startHour >= 0) {
print_value(4,rowMessage,0);
print_value(5,rowMessage,startHour);
}
else {
print_value(4,rowMessage,startHour);
}
print_text(6,rowMessage,":");
if (startMinute < 10 && startMinute >= 0) {
print_value(7,rowMessage,0);
print_value(8,rowMessage,startMinute);
}
else {
print_value(7,rowMessage,startMinute);
}
if (stopHour < 10 && stopHour >= 0) {
print_text(14,rowMessage," ");
print_value(15,rowMessage,stopHour);
}
else {
print_value(14,rowMessage,stopHour);
}
print_text(16,rowMessage,":");
if (stopMinute < 10 && stopMinute >= 0) {
print_value(17,rowMessage,0);
print_value(18,rowMessage,stopMinute);
}
else {
print_value(17,rowMessage,stopMinute);
}
}
void selectSet(int which) //funzione di selezioni dei vari settaggi alla pressione dei tasti
{
switch (setting) {
case 1:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setDateHour(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setDateHour(which);
}
}
break;
case 2:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeOne(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeOne(which);
}
}
break;
case 3:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeTwo(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeTwo(which);
}
}
break;
case 4:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeThree(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeThree(which);
}
}
break;
case 5:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setFade(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setFade(which);
}
}
break;
case 6:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLux(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLux(which);
}
}
break;
case 7:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setManualOn(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setManualOn(which);
}
}
break;
case 8:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLcdTime(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLcdTime(which);
}
}
break;
case 9:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLuxOpenPlafo(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLuxOpenPlafo(which);
}
}
break;
}
}
void printTemp(int temp)
{
print_text(8,0,"Temp.");
print_value(14, 0, temp);
lcd.write(2);
print_text(17,0,"C");
}
void controlTempLed(byte tempC)
{
if(tempC < firstStepTemp)
{oneMax = max1;
twoMax = max2;
threeMax = max3;
}
else if(tempC >= firstStepTemp && tempC < secondStepTemp)
{oneMax = max1 - (max1/10);
twoMax = max2 - (max2/10);
threeMax = max3 - (max3/10);
}
else if(tempC >= secondStepTemp && tempC < thirdStepTemp)
{oneMax = max1 - (max1/3);
twoMax = max2 - (max2/3);
threeMax = max3 - (max3/3);
}
else if(tempC >= thirdStepTemp)
{oneMax = 0;
twoMax = 0;
threeMax = 0;
}
}
//void barra_up()
//{
// if (millis() - tempo_barra >= quoziente_barra)
// {
// if (stepper_bar == 7)
// {
// ++colonna;
// stepper_bar = 2;
// }
// if (colonna < 20)
// {
// lcd.setCursor(colonna,2);
// ++stepper_bar;
// lcd.write(stepper_bar);
// }
// tempo_barra = millis();
// }
//}
meno male che non ho preso arduino............sti cazz.....quanto mi sento "superato"
seguo, nel caso ci fossero aggiornamenti...
boia, abbandono il progetto per un paio mesi dell'alba tramonto e ne escono fuori come le lumache quando metti le piante nuove!
appena ritrovo i miei codici se volete ve li posto!
ho ordinato un nuovo rtc per colpa vostraXD
Come base di partenza si potrebbe utilizzare lo sketch precaricato del Typhon LED.
Il codice è semplice e ben commentato:
http://www.boostled.com/pages/typhon-pre-programmed-sketch
http://cdn.shopify.com/s/files/1/0055/9572/files/ExtraLibraries.zip?100199
Sullo sketch vengono gestite 4 porte PWM.
a.milazzo
21-02-2012, 11:18
Come avevo anticipato posto il codice del mio programma gestione Plafoniera a LED....è lungo e complesso....però al momento funziona bene. le librerie per la maggioranza le trovate sul sito ufficiale di Arduino alcune invece le ho modificate per adattarle al mio schema....comunque può servire per prendere spunto.
//Programma di controllo della scheda ARQUARIUM
//per la gestione di una plafoniera dimmerabile per
//effetto alba tramonto in pwm 0 - 5 volt
//canali disponibili 5
//# Include
//# ==================================
#include <LiquidCrystal_I2C.h>
#include <Menu.h>
#include <LCDMenu2_I2C.h>
#include <EEPROM.h>
#include <DS1307.h>
#include <Wire.h>
#include <WProgram.h>
#include <EEPROMVar.h>
//# Define
//# ==================================
#define _LCD_rows 4 // numero di righe del display alfanumerico
#define _LCD_cols 20 // numero di colonne del display
#define _BUTTON_up 2
#define _BUTTON_down 4
#define _BUTTON_enter 7
#define _BUTTON_left 14
#define _BUTTON_right 15
#define _BUTTON_prestat 0
#define _BUTTON_press_time 500 //250
#define OPEN_PLAFO 8 // ingresso dell'interruttore per spegnimento plafo quando sollevata
#define ONE_LED 9 // primo canale LED pwm warm nel dolce
#define TWO_LED 10 // secondo canale LED pwm cool nel dolce
#define THREE_LED 11 // terzo canale LED pwm red nel dolce
#define FOUR_LED 3 // quarto canale LED pwm
#define FIVE_LED 5 // quinto canale LED pwm
#define LCD_LIGHT 6 // uscita per backlight del display
#define TEMP_INPUT 16 // ingresso per sensore temperatura
//# Definizioni variabili EEPROM
EEPROMVar<int> EpromOneStartHour = 9; // ora accensione canale uno
EEPROMVar<int> EpromOneStartMinute = 5; // minuto accensione canale uno
EEPROMVar<int> EpromOneStopHour = 20; // ora spegnimento canale uno
EEPROMVar<int> EpromOneStopMinute = 55; // minuto spegnimento canale uno
EEPROMVar<int> EpromOneMax = 100; // massima luminosità canale uno
EEPROMVar<int> EpromOneFadeDuration = 60; // tempo in minuti alba tramonto canale uno
EEPROMVar<int> EpromTwoStartHour = 9;
EEPROMVar<int> EpromTwoStartMinute = 10;
EEPROMVar<int> EpromTwoStopHour = 21;
EEPROMVar<int> EpromTwoStopMinute = 50;
EEPROMVar<int> EpromTwoMax = 100;
EEPROMVar<int> EpromTwoFadeDuration = 60;
EEPROMVar<int> EpromThreeStartHour = 9;
EEPROMVar<int> EpromThreeStartMinute = 0;
EEPROMVar<int> EpromThreeStopHour = 21;
EEPROMVar<int> EpromThreeStopMinute = 0;
EEPROMVar<int> EpromThreeMax = 100;
EEPROMVar<int> EpromThreeFadeDuration = 60;
EEPROMVar<int> EpromTimeLcd= 100; // tempo massimo retroilluminazione LCD
EEPROMVar<int> EpromMaxOpenPlafo = 100; // luminosità massima con plafo aperta
// Le variabili sottoelencate possono essere usate se si ha bisogno di
// controllare più di tre canali
//EEPROMVar<int> EpromFourStartHour = 9;
//EEPROMVar<int> EpromFourStartMinute = 5;
//EEPROMVar<int> EpromFourStopHour = 20;
//EEPROMVar<int> EpromFourStopMinute = 55;
//EEPROMVar<int> EpromFourMax = 100;
//EEPROMVar<int> EpromFourFadeDuration = 60;
//EEPROMVar<int> EpromFiveStartHour = 9;
//EEPROMVar<int> EpromFiveStartMinute = 10;
//EEPROMVar<int> EpromFiveStopHour = 21;
//EEPROMVar<int> EpromFiveStopMinute = 50;
//EEPROMVar<int> EpromFiveMax = 100;
//EEPROMVar<int> EpromFiveFadeDuration = 60;
// variabili di tempo da collegare a quelle in memoria EEPROM
int oneStartHour;
int oneStopHour;
int oneStartMinute;
int oneStopMinute;
int twoStartHour;
int twoStopHour;
int twoStartMinute;
int twoStopMinute;
int threeStartHour;
int threeStopHour;
int threeStartMinute;
int threeStopMinute;
int oneMinFade;
int twoMinFade;
int threeMinFade;
//int fourStartHour;
//int fourStopHour;
//int fourStartMinute;
//int fourStopMinute;
//int fiveStartHour;
//int fiveStopHour;
//int fiveStartMinute;
//int fiveStopMinute;
//int sixStartHour;
//int sixStopHour;
//int sixStartMinute;
//int sixStopMinute;
//int fourMinFade;
//int fiveMinFade;
//int sixMinFade;
//# Variabili di tempo per gestione accensione spegnimento e fading
long oneStartSeconds; // Ora accensione canale uno in secondi
long onePhotoPeriod; // durata foto periodo canale uno
int oneMax; // luminosità massima canale uno
long oneFadeDuration; // durata alba tramonto canale uno
long twoStartSeconds; // Ora accensione canale due in secondi
long twoPhotoPeriod; // durata foto periodo canale due
int twoMax; // luminosità massima canale due
long twoFadeDuration; // durata alba tramonto canale due
long threeStartSeconds; // Ora accensione canale tre in minuti
long threePhotoPeriod; // durata foto periodo canale tre
int threeMax; // luminosità massima canale tre
long threeFadeDuration; // durata alba tramonto canale tre
//le variabili sottostanti possono essere usate se si ha
// bisogno di controllare più di tre canali
//long fourStartSeconds; // Ora accensione canale quattro
//long fourPhotoPeriod; // durata foto periodo canale quattro
//int fourMax; // luminosità massima canale quattro
//long fourFadeDuration; // durata alba tramonto canale quattro
//long fiveStartSeconds; // Ora accensione canale cinque
//long fivePhotoPeriod; // durata foto periodo canale cinque
//int fiveMax; // luminosità massima canale cinque
//long fiveFadeDuration; // durata alba tramonto canale cinque
//long sixStartSeconds; // Ora accensione canale sei
//long sixPhotoPeriod; // durata foto periodo canale sei
//int sixMax; // luminosità massima canale sei
//long sixFadeDuration; // durata alba tramonto canale sei
int max1; // variabile collegata a oneMax
int max2; // variabile collegata a twoMax
int max3; // variabile collegata a threeMax
int ora; // variabile ora corrente
int minuti; // variabile minuto corrente
int giorno; // variabile giorno corrente
int mese; // variabile mese corrente
int anno; // variabile anno corrente
// variabili controllo LED
long secondCounter = 0; // contatore che si resetta alla emzzanotte
long oldSecondCounter = 0; // contatore che si resetta alla mezzanotte
int oneVal; // valore corrente luminosità canale uno
int twoVal; // valore corrente luminosità canale due
int threeVal; // valore corrente luminosità canale tre
// variabili da usare se servono più di tre canali di controllo
//int fourVal; // valore corrente luminosità canale quattro
//int fiveVal; // valore corrente luminosità canale cinque
//int sixVal; // valore corrente luminosità canale sei
int setting = 0; // variabile di controllo modalità settaggi valori
long tempo_home = 0, back_home = 50000;
long tempo;
long tempo_barra;
int stepper_bar = 2;
int colonna = 0;
boolean on_off_light= false; // variabile di controllo stato accensione-spegnimento plafo
boolean LCD_time_on= true;
boolean blinker; // variabile booleana per settare o no il blink sull'LCD
long timeLcd; // tempo retroilluminazione LCD
int maxOpenPlafo; // luminosità residua palfoniera aperta
int control_light_stop = 0;
int cursorPosition = 0;
int buttonPress = 0;
float tempC;
int reading;
byte outValOne; // variabile controllo valore uscita in modalità accensione manuale
byte outValTwo;
byte outValThree;
const byte rowMessage = 2; // numero della riga del display dove appaiono i valori da modificare
byte firstStepTemp = 40; // max temperatura primo step abbassamento luminosità LED del 10%
byte secondStepTemp = 45; // max temperatura secondo step abbassamento luminosità LED del 40%
byte thirdStepTemp = 50; // max temperatura terzo step spegnimento LED
//# Creazione caratteri personali
//# ==================================
uint8_t arrow_up[8] = { // freccia su
0x4,0xE,0x15,0x4,0x4,0x4,0x0};
uint8_t arrow_down[8] = { // freccia giù
0x0,0x4,0x4,0x4,0x15,0xE,0x4};
//uint8_t light_on[8] = {
// 0x0,0x15,0xA,0x1F,0xA,0x15,0x0}; // plafo accesa
uint8_t punto[8] = {
0xC,0xC,0x0,0x0,0x0,0x0,0x0}; // punto gradi centigradi
uint8_t one_bar[8] = {
0x10,0x10,0x10,0x10,0x10,0x10,0x10}; // una barra verticale
uint8_t two_bar[8] = {
0x18,0x18,0x18,0x18,0x18,0x18,0x18}; // due barre verticali
uint8_t tree_bar[8] = {
0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}; // tre barre verticali
uint8_t four_bar[8] = {
0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E}; // quattro barre verticali
uint8_t five_bar[8] = {
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}; // cinque barre verticali
//# Classes
//# ==================================
LiquidCrystal_I2C lcd(0x20,_LCD_cols,_LCD_rows); // set the LCD address to 0x20 for a 16 chars and 2 line display
//LiquidCrystal lcd(2,3,4,5,6,7); // Neuste Version, RW wird nicht mehr gebraucht
Menu top("Root");
// menu, lcd, rows, cols, arrow_up_pos, arrow_down_pos
LCDMenu2 Root(top, lcd , _LCD_rows, _LCD_cols, 0, 1);
//# Buttons
//# ==================================
//UP,DOWN,ENTER,LEFT,RIGHT
int but[5]= {
_BUTTON_up,_BUTTON_down,_BUTTON_enter,_BUTTON_left ,_BUTTON_right};
//Previous States of buttons
boolean pbut[5]={
_BUTTON_prestat,_BUTTON_prestat,_BUTTON_prestat,_B UTTON_prestat,_BUTTON_prestat};
//# Button Enter
//# ==================================
int button_press_enter = 0;
unsigned long g_button_press_time = millis();
// creazione voci del menu e sottomenu..è possibile sostituirle cone voci proprie
// senza superare il numero massimo di colonne - 1 del dislplay LCD impiegato
char strMenuInit[] = "Menu";
char strMenuDate[] = "Imp. Data/Ora";
char strMenuTime[] = "Imp. Tempi on/off";
char strMenuFade[] = "Imp. Alba/Tramonto";
char strMenuLux[] = "Imp. Luminosita'";
char strMenuManualOn[] = "On/Off Manuale";
char strMenuLcdTime[] = "Imp. Tempo LCD";
char strMenuOpenPlafo[] = "Lum. Plafo aperta";
char strMenuTimeOne[] = "Imp. Tempo Warm";
char strMenuTimeTwo[] = "Imp. Tempo Cool";
char strMenuTimeThree[] = "Imp. Tempo Red";
//char strMenuFadeOne[] = "Imp. Fading Warm";
//char strMenuFadeTwo[] = "Imp. Fading Cool";
//char strMenuFadeThree[] = "Imp. Fading Red";
//char strMenuLuxOne[] = "Imp. Lum. Warm";
//char strMenuLuxTwo[] = "Imp. Lum. Cool";
//char strMenuLuxThree[] = "Imp. Lum. Red";
// voci del menu relative ai canali dal 3 al 6 da utilizzare se servono
//char strMenuTimeFour[] = "";
//char strMenuTimeFive[] = "";
//char strMenuTimeSix[] = "";
//char strMenuFadeFour[] = "";
//char strMenuFadeFive[] = "";
//char strMenuFadeSix[] = "";
//char strMenuLuxFour[] = "";
//char strMenuLuxFive[] = "";
//char strMenuLuxSix[] = "";
//# Menu
//# ==================================
Menu Item1(strMenuInit);
Menu Item12(strMenuDate);
Menu Item13(strMenuTime);
Menu Item14(strMenuFade);
Menu Item15(strMenuLux);
Menu Item16(strMenuManualOn);
Menu Item17(strMenuLcdTime);
Menu Item18(strMenuOpenPlafo);
Menu Item131(strMenuTimeOne);
Menu Item132(strMenuTimeTwo);
Menu Item133(strMenuTimeThree);
//Menu Item134(strMenuTimeFour);
//Menu Item135(strMenuTimeFive);
//Menu Item136(strMenuTimeSix);
//Menu Item141(strMenuFadeOne);
//Menu Item142(strMenuFadeTwo);
//Menu Item143(strMenuFadeThree);
//Menu Item144(strMenuFadeFour);
//Menu Item145(strMenuFadeFive);
//Menu Item146(strMenuFadeSix);
//Menu Item151(strMenuLuxOne);
//Menu Item152(strMenuLuxTwo);
//Menu Item153(strMenuLuxThree);
//Menu Item154(strMenuLuxFour);
//Menu Item155(strMenuLuxFive);
//Menu Item156(strMenuLuxSix);
//# ==================================
//## Menu Init
void menuinit()
{
top.addChild(Item1);
Item1.addChild(Item12);
Item1.addChild(Item13);
Item1.addChild(Item14);
Item1.addChild(Item15);
Item1.addChild(Item16);
Item1.addChild(Item17);
Item1.addChild(Item18);
Item13.addChild(Item131);
Item13.addChild(Item132);
Item13.addChild(Item133);
// Item13.addChild(Item134);
// Item13.addChild(Item135);
// Item13.addChild(Item136);
// Item14.addChild(Item141);
// Item14.addChild(Item142);
// Item14.addChild(Item143);
// Item14.addChild(Item144);
// Item14.addChild(Item145);
// Item14.addChild(Item146);
// Item15.addChild(Item151);
// Item15.addChild(Item152);
// Item15.addChild(Item153);
// Item15.addChild(Item154);
// Item15.addChild(Item155);
// Item15.addChild(Item156);
Root.display();
}
//## Button
void button(int which, char select='z')
{
if(which == _BUTTON_up || select == 'w') {
//UP
switch (setting) {
case 0:
Root.goUp();
//Serial.println("'up'");
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_down || select == 's') {
//DOWN
switch (setting) {
case 0:
Root.goDown();
//Serial.println("'down'");
break;
default:
selectSet(which);
}
}
else if(which == _BUTTON_left || select == 'l') {
//LEFT
if (cursorPosition >= 1) {
cursorPosition--;
}
switch (setting) {
case 0:
cursorPosition = 0;
goBack();
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_right || select == 'r') {
//RIGHT
if(cursorPosition < 5){
cursorPosition++;
}
switch (setting) {
case 0:
Root.goEnter();
button_press_enter = 1;
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_enter || select == 'e') {
//ENTER
if (setting != 0)
{
save_data();
blinker = false;
print_save_date();
Root.goEnter();
setting = 0;
control_light_stop = 0;
}
set_reset_value();
}
}
//## Button Check
void buttoncheck()
{
for (int i=0;i<=4;i++)
{
if (digitalRead(but[i])) {
if (pbut[i]==0 && (millis()-g_button_press_time) >= _BUTTON_press_time) {
button(but[i]);
buttonPress = but[i];
//pbut[i]=1;
g_button_press_time = millis();
if(timeLcd < 100){
analogWrite(LCD_LIGHT,255);
}
tempo_home = millis();
}
}
else {
pbut[i]=0;
//buttonPress=0;
if( millis() - tempo_home > back_home )
{
Root.goBack();
Root.goBack();
lcd.noBlink();
set_reset_value();
setting = 0;
cursorPosition = 0;
control_light_stop = 0;
LCD_time_on = true;
}
if(timeLcd < 100){
if( millis() - tempo_home > (timeLcd * 1000) )
{
analogWrite(LCD_LIGHT,20);
//tempo_home = millis();
}
}
}
}
//if(Serial.available()) {
// char c = Serial.read();
// button(-1,c);
//}
}
//## Function Check
void funccheck(int button)
{
int x;
if(button_press_enter == 1) {
button_press_enter = 0;
if(Root.curfuncname == strMenuInit) {
//Serial.println("Function: Controller LED");
setting = 0;
LCD_time_on = false;
}
else if(Root.curfuncname == strMenuDate) { // menu impostazione data e ora generale
setting = 1;
//Serial.println("Function: Imp. data ora");
ora = RTC.get(DS1307_HR, true);
minuti = RTC.get(DS1307_MIN, true);
giorno = RTC.get(DS1307_DATE, true);
mese = RTC.get(DS1307_MTH, true);
anno = RTC.get(DS1307_YR, true);
lcd.clear();
print_text(0,0, strMenuDate);
cursorPosition= 1;
print_time_date(2);
setDateHour(button);
// set_month(mese);
// set_year(anno);
// set_hour(ora);
// set_minute(minuti);
// set_day(0);
}
else if(Root.curfuncname == strMenuTimeOne) { // menu impostazione tempi accensione canale uno
Serial.println("Function: Imp. tempi canale uno");
setting = 2;
lcd.clear();
print_text(0,0, strMenuTimeOne);
printStartStopTime(oneStartHour, oneStartMinute, oneStopHour, oneStopMinute);
cursorPosition= 1;
setTimeOne(button);
// set_on_light_minute(led_on_minute);
// set_off_light_hour(led_off_hour);
// set_off_light_minute(led_off_minute);
// set_on_light_hour(led_on_hour);
}
else if(Root.curfuncname == strMenuTimeTwo) { // menu impostazione tempi accensione canale due
setting = 3;
lcd.clear();
print_text(0,0, strMenuTimeTwo);
printStartStopTime(twoStartHour, twoStartMinute, twoStopHour, twoStopMinute);
cursorPosition= 1;
setTimeTwo(button);
}
else if(Root.curfuncname == strMenuTimeThree) { // menu impostazione tempi accensione canale tre
setting = 4;
lcd.clear();
print_text(0,0, strMenuTimeThree);
printStartStopTime(threeStartHour, threeStartMinute, threeStopHour, threeStopMinute);
cursorPosition= 1;
setTimeThree(button);
}
else if(Root.curfuncname == strMenuFade) { // menu impostazione alba tramonto
setting = 5;
lcd.clear();
print_text(0,0, strMenuFade);
print_text(0,1,"Warm Cool Red");
print_text(0,rowMessage,"Min: Min: Min:");
setFadeTime(button, oneMinFade, 4);
setFadeTime(button, twoMinFade, 11);
setFadeTime(button, threeMinFade, 18);
//
// print_value(4,rowMessage, oneMinFade);
// print_value(11,rowMessage, twoMinFade);
// print_value(18,rowMessage, threeMinFade);
cursorPosition= 1;
setFade(button);
}
else if(Root.curfuncname == strMenuLux) { // menu impostazione luminosità LED singoli canali
setting = 6;
control_light_stop = 1;
lcd.clear();
print_text(0,0,strMenuLux);
print_text(1,1,"Warm Cool Red");
setMaxLux(button, oneMax, ONE_LED, 1); // SCRIVE I VALORI DEI CANALI
setMaxLux(button, twoMax, TWO_LED, 7);
setMaxLux(button, threeMax, THREE_LED, 14);
cursorPosition = 1;
setLux(button);
}
else if(Root.curfuncname == strMenuManualOn) { // menu accensione manuale singoli canali
setting = 7;
control_light_stop = 1;
lcd.clear();
print_text(0,0,strMenuManualOn);
print_text(1,1,"Warm Cool Red");
outValOne = 0;
outValTwo = 0;
outValThree = 0;
manualOn(button, outValOne, ONE_LED, 1);
manualOn(button, outValTwo, TWO_LED, 7);
manualOn(button, outValThree, THREE_LED, 14);
cursorPosition= 1;
setManualOn(button);
/* manual_on_off_cool(on_off_light);
manual_on_off_red(on_off_light);
manual_on_off_warm(on_off_light);*/
}
else if(Root.curfuncname == strMenuLcdTime) { // menu impostazione tempo accesnione backlight dell'LCD
setting = 8;
lcd.clear();
print_text(0,0,strMenuLcdTime);
print_text(0,rowMessage,"Secondi:");
setLcdTime(button);
}
else if(Root.curfuncname == strMenuOpenPlafo) { // menu impostazione luce residua LED a plafo aperta
setting = 9;
lcd.clear();
blinker = true;
print_text(0,0,strMenuOpenPlafo);
print_text(0,rowMessage,"Luminosita':");
setLuxOpenPlafo(button);
}
}
}
//# Setup
//# ==================================
void setup()
{
lcd.begin(_LCD_rows,_LCD_cols);
lcd.createChar(0, arrow_up);
lcd.createChar(1, arrow_down);
//lcd.createChar(2, light_on);
lcd.createChar(2, punto);
lcd.createChar(3, one_bar);
lcd.createChar(4, two_bar);
lcd.createChar(5, tree_bar);
lcd.createChar(6, four_bar);
lcd.createChar(7, five_bar);
lcd.init();
//lcd.home();
analogReference(INTERNAL);
pinMode(OPEN_PLAFO, INPUT);
pinMode(ONE_LED, OUTPUT);
pinMode(TWO_LED, OUTPUT);
pinMode(THREE_LED, OUTPUT);
pinMode(FOUR_LED, OUTPUT);
pinMode(FIVE_LED, OUTPUT);
pinMode(LCD_LIGHT, OUTPUT);
pinMode(TEMP_INPUT, INPUT);
analogWrite(LCD_LIGHT,20);
set_reset_value();
tempo = millis();
menuinit();
Serial.begin(9600);
}
//# LOOP
//# ==================================
void loop()
{
buttoncheck();
funccheck(buttonPress);
reading = analogRead(TEMP_INPUT);
tempC = reading / 9.31;
//tempC = (5.0 * reading * 100.0)/1024.0;
controlTempLed(byte(tempC));
Serial.println("Setting:");
Serial.println(setting);
Serial.println("Cursor position");
Serial.println(cursorPosition);
Serial.println("Button Press");
Serial.println(buttonPress);
Serial.println(Root.curfuncname);
Serial.println("Tempo LCD");
Serial.println(timeLcd);
Serial.println("Temperatura");
Serial.println(tempC);
//control_led_lights();
oldSecondCounter = secondCounter;
secondCounter = (long) RTC.get(DS1307_HR,true) * 3600 + (long) RTC.get(DS1307_MIN,false)* 60 + (long) RTC.get(DS1307_SEC,false);
// controlla e setta la durata del fading
if(oneFadeDuration > onePhotoPeriod/2 && onePhotoPeriod > 0) {
oneFadeDuration = onePhotoPeriod/2;
}
if(oneFadeDuration < 1){
oneFadeDuration = 1;
}
if(twoFadeDuration > twoPhotoPeriod/2 && twoPhotoPeriod > 0) {
twoFadeDuration = twoPhotoPeriod/2;
}
if(twoFadeDuration < 1){
twoFadeDuration = 1;
}
if(threeFadeDuration > threePhotoPeriod/2 && threePhotoPeriod > 0) {
threeFadeDuration = threePhotoPeriod/2;
}
if(threeFadeDuration < 1){
threeFadeDuration = 1;
}
//setta le uscite
oneVal = setLed(secondCounter, ONE_LED, oneStartSeconds, onePhotoPeriod, oneFadeDuration, oneMax);
twoVal = setLed(secondCounter, TWO_LED, twoStartSeconds, twoPhotoPeriod, twoFadeDuration, twoMax);
threeVal = setLed(secondCounter, THREE_LED, threeStartSeconds, threePhotoPeriod, threeFadeDuration, threeMax);
if(oneVal > 0 || twoVal > 0 || threeVal > 0)
{ on_off_light= true;}
else
{ on_off_light= false;}
Serial.println("Oneval");
Serial.println(oneVal);
Serial.println("twoval");
Serial.println(twoVal);
Serial.println("threeval");
Serial.println(threeVal);
Serial.println(secondCounter);
Serial.println(oneStartSeconds);
Serial.println(onePhotoPeriod);
Serial.println(oneFadeDuration);
Serial.println("Control light stop");
Serial.println(control_light_stop);
offPlafo();
if (timeLcd == 100){
analogWrite(LCD_LIGHT,255);
}
if (LCD_time_on == true)
{
printTemp(int(tempC));
print_time_date(3);
}
//delay(500);
}
//Funzione per settare accensione
//e spegnimento dei singoli canali LED
//con gestione effetto alba tramonto
int setLed(long Seconds, // tempo corrente in secondi
int ledPin, // numero di pin del canale LED
long start, // tempo di partenza accensione del canale LED
long period, // Periodo di accensione del canale LED
long fade, // durata alba tramonto canale LED
int ledMax // luminosità massima canale LED
)
{
// controlla che non si sia in modalità settaggio luminosità,
// on/off manuale o il coperchio alzato in quel caso esce dalla funzione
int val;
if (control_light_stop == 0){
// fade up...ossia gestione alba
if (Seconds > start || Seconds <= start + fade) {
val = map(Seconds - start, 0, fade, 0, ledMax * 2.55);
}
// fade down...gestione tramonto
if (Seconds > start + period && Seconds <= start + period + fade) {
val = map(Seconds - (start + period), 0, fade, ledMax * 2.55, 0);
}
// off or post-midnight run spegnimento o partenza dopo mezzanotte
if (Seconds <= start || Seconds > start + period + fade) {
if((start + period + fade)%86400 < start && (start + period + fade)%86400 > Seconds)
{
val = map((start + period + fade - Seconds)%86400,0,fade,0,ledMax * 2.55);
}
else {
val = 0;
}
}
if (val > ledMax * 2.55) {
val = ledMax * 2.55;
}
if (val < 0) {
val = 0;
}
analogWrite(ledPin, val); // map(val, 0, 100, 0, 255));
return val;
}
}
//* Funzione print time_date
//* mostra data e ora sul display
void print_time_date(byte row)
{
int ora;
int minuti;
int secondi;
int giorno;
int mese;
int anno;
ora = RTC.get(DS1307_HR, true);
minuti = RTC.get(DS1307_MIN, true);
secondi = RTC.get(DS1307_SEC, true);
giorno = RTC.get(DS1307_DATE, true);
mese = RTC.get(DS1307_MTH, true);
anno = RTC.get(DS1307_YR, true);
blinker = false;
if (giorno < 10 && giorno > 0) {
print_value(0,row,0);
print_value(1,row,giorno);
}
else {
print_value(0,row,giorno);
}
print_text(2,row,"-");
if (mese < 10 && mese > 0) {
print_value(3,row,0);
print_value(4,row,mese);
}
else {
print_value(3,row,mese);
}
print_text(5,row,"-");
print_value(6,row,anno);
if (ora < 10 && ora >= 0) {
print_text(11,row," ");
print_value(12,row,ora);
}
else {
print_value(11,row,ora);
}
print_text(13,row,":");
if (minuti < 10 && minuti >= 0) {
print_value(14,row,0);
print_value(15,row,minuti);
}
else {
print_value(14,row,minuti);
}
print_text(16,row,":");
if (secondi < 10 && secondi >= 0) {
print_value(17,row,0);
print_value(18,row,secondi);
}
else {
print_value(17,row,secondi);
}
}
// funzione di settaggio data e ora corrente
void setDateHour(int button)
{
print_text(16,rowMessage," "); // rende non visibili i secondi
switch (cursorPosition) {
case 0:
case 1:
set_day(button);
break;
case 2:
set_month(button);
break;
case 3:
set_year(button);
break;
case 4:
set_hour(button);
break;
case 5:
set_minute(button);
break;
default:
cursorPosition = 5;
break;
}
}
//* settaggio giorno
void set_day(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(giorno >= 1 && giorno < 32){
giorno++;
}
if(giorno == 32){
giorno = 1;
}
}
if (button == _BUTTON_down) {
if(giorno > 0 && giorno <= 31){
giorno--;
}
if(giorno == 0){
giorno = 31;
}
}
if (giorno < 10 && giorno > 0) {
print_value(0,rowMessage,0);
print_value(1,rowMessage,giorno);
}
else {
print_value(0,rowMessage,giorno);
}
print_text(2,rowMessage,"-");
lcd.setCursor(1,rowMessage);
}
//* settaggio mese
void set_month(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(mese >= 1 && mese < 13){
mese++;
}
if(mese == 13){
mese = 1;
}
}
if (button == _BUTTON_down) {
if(mese > 0 && mese <= 12){
mese--;
}
if(mese == 0){
mese = 12;
}
}
if (mese < 10 && mese > 0) {
print_value(3,rowMessage,0);
print_value(4,rowMessage,mese);
}
else {
print_value(3,rowMessage,mese);
}
print_text(5,rowMessage,"-");
lcd.setCursor(4,rowMessage);
}
//* settaggio anno
void set_year(int button)
{
blinker = true;
if (button == _BUTTON_up) {
anno++;
}
if (button == _BUTTON_down) {
anno--;
}
print_value(6,rowMessage,anno);
lcd.setCursor(9,rowMessage);
}
//* settaggio ora
void set_hour(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(ora >= 0 && ora < 24){
ora++;
}
if(ora == 24){
ora = 0;
}
}
if (button == _BUTTON_down) {
if(ora > -1 && ora <= 23){
ora--;
}
if(ora == -1){
ora = 23;
}
}
if (ora < 10 && ora >= 0) {
print_value(11,rowMessage,0);
print_value(12,rowMessage,ora);
}
else {
print_value(11,rowMessage,ora);
}
print_text(13,rowMessage,":");
lcd.setCursor(12,rowMessage);
}
//* settaggio minuti
void set_minute(int button)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(minuti >= 0 && minuti < 60){
minuti++;
}
if(minuti == 60){
minuti = 0;
}
}
if (button == _BUTTON_down) {
if(minuti > -1 && minuti <= 59){
minuti--;
}
if(minuti == -1){
minuti = 59;
}
}
if (minuti < 10 && minuti >= 0) {
print_value(14,rowMessage,0);
print_value(15,rowMessage,minuti);
}
else {
print_value(14,rowMessage,minuti);
}
lcd.setCursor(15,rowMessage);
}
// setta accensione e spegnimento canale uno
void setTimeOne(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, oneStartHour);
break;
case 2:
setStartMinute(button, oneStartMinute);
break;
case 3:
setStopHour(button, oneStopHour);
break;
case 4:
setStopMinute(button, oneStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
// setta accensione e spegnimento canale due
void setTimeTwo(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, twoStartHour);
break;
case 2:
setStartMinute(button, twoStartMinute);
break;
case 3:
setStopHour(button, twoStopHour);
break;
case 4:
setStopMinute(button, twoStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
// setta accensione e spegnimento canale tre
void setTimeThree(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, threeStartHour);
break;
case 2:
setStartMinute(button, threeStartMinute);
break;
case 3:
setStopHour(button, threeStopHour);
break;
case 4:
setStopMinute(button, threeStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
//* settaggio ora accensione LED
void setStartHour(int button, int &led_on_hour)
{
blinker = true;
if (button == _BUTTON_up) {
if(led_on_hour >= 0 && led_on_hour < 24){
led_on_hour++;
}
if(led_on_hour == 24){
led_on_hour = 0;
}
}
if (button == _BUTTON_down) {
if(led_on_hour > -1 && led_on_hour <= 23){
led_on_hour--;
}
if(led_on_hour == -1){
led_on_hour = 23;
}
}
if (led_on_hour < 10 && led_on_hour >= 0) {
print_value(4,rowMessage,0);
print_value(5,rowMessage,led_on_hour);
}
else {
print_value(4,rowMessage,led_on_hour);
}
print_text(6,rowMessage,":");
lcd.setCursor(5,rowMessage);
}
//* settaggio minuto accensione LED
void setStartMinute(int button, int &led_on_minute)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(led_on_minute >= 0 && led_on_minute < 60){
led_on_minute++;
}
if(led_on_minute == 60){
led_on_minute = 0;
}
}
if (button == _BUTTON_down) {
if(led_on_minute > -1 && led_on_minute <= 59){
led_on_minute--;
}
if(led_on_minute == -1){
led_on_minute = 59;
}
}
if (led_on_minute < 10 && led_on_minute >= 0) {
print_value(7,rowMessage,0);
print_value(8,rowMessage,led_on_minute);
}
else {
print_value(7,rowMessage,led_on_minute);
}
lcd.setCursor(8,rowMessage);
}
//* settaggio ora spegnimento LED
void setStopHour(int button, int &led_off_hour)
{
blinker = true;
if (button == _BUTTON_up) {
if(led_off_hour >= 0 && led_off_hour < 24){
led_off_hour++;
}
if(led_off_hour == 24){
led_off_hour = 0;
}
}
if (button == _BUTTON_down) {
if(led_off_hour > -1 && led_off_hour <= 23){
led_off_hour--;
}
if(led_off_hour == -1){
led_off_hour = 23;
}
}
if (led_off_hour < 10 && led_off_hour >= 0) {
print_value(14,rowMessage,0);
print_value(15,rowMessage,led_off_hour);
}
else {
print_value(14,rowMessage,led_off_hour);
}
print_text(16,rowMessage,":");
lcd.setCursor(15,rowMessage);
}
//* settaggio minuti spegnimento LED
void setStopMinute(int button, int &led_off_minute)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(led_off_minute >= 0 && led_off_minute < 60){
led_off_minute++;
}
if(led_off_minute == 60){
led_off_minute = 0;
}
}
if (button == _BUTTON_down) {
if(led_off_minute > -1 && led_off_minute <= 59){
led_off_minute--;
}
if(led_off_minute == -1){
led_off_minute = 59;
}
}
if (led_off_minute < 10 && led_off_minute >= 0) {
print_value(17,rowMessage,0);
print_value(18,rowMessage,led_off_minute);
}
else {
print_value(17,rowMessage,led_off_minute);
}
lcd.setCursor(18,rowMessage);
}
void setFade(int button){ // settaggio alba tramonto dei canali
switch (cursorPosition) {
case 0:
case 1:
setFadeTime(button, oneMinFade, 4);
break;
case 2:
setFadeTime(button, twoMinFade, 11);
break;
case 3:
setFadeTime(button, threeMinFade, 18);
break;
default:
cursorPosition = 3;
break;
}
}
//* settaggio tempo alba/tramonto
void setFadeTime(int button,int &varFade, byte chrPos)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(varFade >= 0 && varFade <= 60){
varFade++;
}
if(varFade == 61){
varFade = 0;
}
}
if (button == _BUTTON_down) {
if(varFade > -1 && varFade <= 60){
varFade--;
}
if(varFade == -1){
varFade = 60;
}
}
if (varFade < 10 && varFade >=0){
print_value(chrPos,rowMessage,0);
print_value(chrPos+1,rowMessage,varFade);
}
else {
print_value(chrPos,rowMessage,varFade);
}
lcd.setCursor(chrPos+1,rowMessage);
}
void setLux(int button){
switch (cursorPosition) {
case 0:
case 1:
setMaxLux(button, oneMax, ONE_LED, 1);
break;
case 2:
setMaxLux(button, twoMax, TWO_LED, 7);
break;
case 3:
setMaxLux(button, threeMax, THREE_LED, 14);
default:
cursorPosition = 3;
break;
}
}
//* settaggio luminosità massima dei vari canali
void setMaxLux(int button, int &varLux, byte PIN_LED, byte chrPos){
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(varLux >= 0 && varLux < 100){
varLux++;
}
}
if (button == _BUTTON_down) {
if(varLux > 0 && varLux <= 100){
varLux--;
}
}
int bright = (varLux * 2.55);
//Serial.println(lux);
analogWrite(PIN_LED, bright);
blinker = true;
if (varLux < 10) {
lcd.setCursor(chrPos,rowMessage);
lcd.print(' ');
lcd.setCursor(chrPos+1,rowMessage);
lcd.print(' ');
print_value(chrPos+2,rowMessage,varLux);
}
else if (varLux >= 10 && varLux <= 99){
lcd.setCursor(chrPos,rowMessage);
lcd.print(' ');
print_value(chrPos+1,rowMessage,varLux);
}
else {
print_value(chrPos,rowMessage,varLux);
}
lcd.print("%");
}
void setManualOn(int button){ //setta on off manualmente i singoli canali
switch (cursorPosition) {
case 0:
case 1:
manualOn(button, outValOne, ONE_LED, 1);
break;
case 2:
manualOn(button, outValTwo, TWO_LED, 7);
break;
case 3:
manualOn(button, outValThree, THREE_LED, 14);
default:
cursorPosition = 3;
break;
}
}
//* accensione manuale dei canali
void manualOn(int button, byte &Val, byte PIN_LED, byte chrPos)
{
blinker = true;
if (button == _BUTTON_up) {
Val = 255;
//analogWrite(PIN_LED, Val);
}
if (button == _BUTTON_down) {
Val = 0;
//analogWrite(PIN_LED, Val);
}
if(Val > 0)
{
print_text(chrPos + 1,rowMessage,"On ");
lcd.setCursor(chrPos,rowMessage);
}
else
{
print_text(chrPos + 1,rowMessage,"Off");
lcd.setCursor(chrPos,rowMessage);
}
analogWrite(PIN_LED, Val);
}
void setLcdTime(int button){ //settaggio del tempo di illuminazione dell'LCD
blinker = true;
if (button == _BUTTON_up) {
if(timeLcd >= 0 && timeLcd <= 90){
timeLcd = timeLcd + 10;
}
}
if (button == _BUTTON_down) {
if(timeLcd > 10 && timeLcd <= 100){
timeLcd = timeLcd -10;
}
}
if (timeLcd <= 90){
print_value(9,rowMessage,timeLcd);
}
else{
print_text(9,rowMessage,"On");
}
}
void setLuxOpenPlafo(int button){ // settaggio minima luminosità led a plafo aperta
blinker = true;
if (button == _BUTTON_up) {
if(maxOpenPlafo >= 0 && maxOpenPlafo <= 99){
maxOpenPlafo++;
}
}
if (button == _BUTTON_down) {
if(maxOpenPlafo > 1 && maxOpenPlafo <= 100){
maxOpenPlafo--;
}
}
if(maxOpenPlafo > 9 && maxOpenPlafo < 100){
print_text(12,rowMessage," ");
print_value(13,rowMessage,maxOpenPlafo);
}
if(maxOpenPlafo < 10){
print_text(12,rowMessage," ");
print_value(14,rowMessage,maxOpenPlafo);
}
}
//* Funzione per la stampa su LCD di valori numerici
void print_value(int col, int row, int value)
{
lcd.setCursor(col,row);
lcd.print(value);
if (blinker == true) {
lcd.blink();
}
else {
lcd.noBlink();
}
}
//* Funzione per la stampa su LCD di valori testo
void print_text(int col, int row, char* text)
{
lcd.setCursor(col,row);
lcd.print(text);
if (blinker == true) {
lcd.blink();
}
else {
lcd.noBlink();
}
}
//* Funzione di salvataggio dei dati nella eeprpom relativi a
// data corrente, ora corrente, orari di accensione e spegnimento
// della plafo, tempo di alba-tramonto, luminosità singoli canali
void save_data()
{
if (setting == 1)
{
RTC.stop();
RTC.set(DS1307_MIN,minuti); //setta i minuti
RTC.set(DS1307_HR,ora); //setta l'ora
RTC.set(DS1307_DATE,giorno); //setta la data
RTC.set(DS1307_MTH,mese); //setta il mese
RTC.set(DS1307_YR,(anno-2000)); //setta l'anno
RTC.start();
}
if (setting ==2 || setting == 3 || setting == 4)
{
EpromOneStartHour = oneStartHour;
EpromOneStartMinute = oneStartMinute;
EpromOneStopHour = oneStopHour;
EpromOneStopMinute = oneStopMinute;
EpromTwoStartHour = twoStartHour;
EpromTwoStartMinute = twoStartMinute;
EpromTwoStopHour = twoStopHour;
EpromTwoStopMinute = twoStopMinute;
EpromThreeStartHour = threeStartHour;
EpromThreeStartMinute = threeStartMinute;
EpromThreeStopHour = threeStopHour;
EpromThreeStopMinute = threeStopMinute;
}
if( setting == 5 )
{
EpromOneFadeDuration = oneMinFade;
EpromTwoFadeDuration = twoMinFade;
EpromThreeFadeDuration = threeMinFade;
}
if( setting == 6 )
{
EpromOneMax = oneMax;
EpromTwoMax = twoMax;
EpromThreeMax = threeMax;
}
if( setting == 8 )
{
EpromTimeLcd = timeLcd;
}
if( setting == 9 )
{
EpromMaxOpenPlafo = maxOpenPlafo;
}
}
//* mostra su LCD la scritta dati salvati lampeggiante
void print_save_date()
{
for (int i=0; i <= 3; i++){
print_text(0,3,"Dati salvati");
delay(500);
print_text(0,3," ");
delay(500);
}
}
// funzione di lettura delle memorie all'avvio del programma
// chiamata da setup e ad ogni salvataggio dei dati
// alla prima chiamata controlla se le memorie sono fuori range e
// corregge i dati
void set_reset_value()
{
oneMax = EpromOneMax;
twoMax = EpromTwoMax;
threeMax = EpromThreeMax;
max1 = oneMax;
max2 = twoMax;
max3 = threeMax;
oneStartHour = EpromOneStartHour;
oneStartMinute = EpromOneStartMinute;
oneStartSeconds = (long) oneStartHour * 3600 + (long) oneStartMinute* 60;
twoStartHour = EpromTwoStartHour;
twoStartMinute = EpromTwoStartMinute;
twoStartSeconds = (long) twoStartHour * 3600 + (long) twoStartMinute * 60;
threeStartHour = EpromThreeStartHour;
threeStartMinute = EpromThreeStartMinute;
threeStartSeconds = (long) threeStartHour * 3600 + (long) threeStartMinute * 60;
oneStopHour = EpromOneStopHour;
oneStopMinute = EpromOneStopMinute;
onePhotoPeriod = ((long) oneStopHour * 3600 + (long) oneStopMinute * 60) - oneStartSeconds;
twoStopHour = EpromTwoStopHour;
twoStopMinute = EpromTwoStopMinute;
twoPhotoPeriod = ((long)twoStopHour * 3600 + (long)twoStopMinute * 60) - twoStartSeconds;
threeStopHour = EpromThreeStopHour;
threeStopMinute = EpromThreeStopMinute;
threePhotoPeriod = ((long) threeStopHour * 3600 + (long) threeStopMinute * 60) - threeStartSeconds;
oneMinFade = EpromOneFadeDuration;
twoMinFade = EpromTwoFadeDuration;
threeMinFade = EpromThreeFadeDuration;
oneFadeDuration = (long) oneMinFade * 60;
twoFadeDuration = (long) twoMinFade * 60;
threeFadeDuration = (long) threeMinFade * 60;
timeLcd = EpromTimeLcd;
maxOpenPlafo = EpromMaxOpenPlafo;
// analogWrite(ONE_LED, 0);
// analogWrite(TWO_LED, 0);
// analogWrite(THREE_LED, 0);
}
void offPlafo()
{
if (setting != 7){
if(digitalRead(OPEN_PLAFO)== HIGH){
if(on_off_light == true) {
control_light_stop = 1;
analogWrite(ONE_LED, maxOpenPlafo);
analogWrite(TWO_LED, maxOpenPlafo);
analogWrite(THREE_LED, maxOpenPlafo);
}
}
if(digitalRead(OPEN_PLAFO)== LOW) {
control_light_stop = 0;
}
}
}
void goBack()
{
lcd.noBlink();
Root.goBack();
setting = 0;
if(Root.curfuncname == "Root"){
LCD_time_on = true;
}
}
void goEnter()
{
lcd.noBlink();
Root.goEnter();
setting = 0;
control_light_stop = 0;
}
void printStartStopTime(int startHour,
int startMinute,
int stopHour,
int stopMinute
)
{
print_text(0,rowMessage," On: Off:");
if (startHour < 10 && startHour >= 0) {
print_value(4,rowMessage,0);
print_value(5,rowMessage,startHour);
}
else {
print_value(4,rowMessage,startHour);
}
print_text(6,rowMessage,":");
if (startMinute < 10 && startMinute >= 0) {
print_value(7,rowMessage,0);
print_value(8,rowMessage,startMinute);
}
else {
print_value(7,rowMessage,startMinute);
}
if (stopHour < 10 && stopHour >= 0) {
print_text(14,rowMessage," ");
print_value(15,rowMessage,stopHour);
}
else {
print_value(14,rowMessage,stopHour);
}
print_text(16,rowMessage,":");
if (stopMinute < 10 && stopMinute >= 0) {
print_value(17,rowMessage,0);
print_value(18,rowMessage,stopMinute);
}
else {
print_value(17,rowMessage,stopMinute);
}
}
void selectSet(int which) //funzione di selezioni dei vari settaggi alla pressione dei tasti
{
switch (setting) {
case 1:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setDateHour(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setDateHour(which);
}
}
break;
case 2:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeOne(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeOne(which);
}
}
break;
case 3:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeTwo(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeTwo(which);
}
}
break;
case 4:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeThree(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeThree(which);
}
}
break;
case 5:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setFade(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setFade(which);
}
}
break;
case 6:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLux(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLux(which);
}
}
break;
case 7:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setManualOn(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setManualOn(which);
}
}
break;
case 8:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLcdTime(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLcdTime(which);
}
}
break;
case 9:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLuxOpenPlafo(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLuxOpenPlafo(which);
}
}
break;
}
}
void printTemp(int temp)
{
print_text(8,0,"Temp.");
print_value(14, 0, temp);
lcd.write(2);
print_text(17,0,"C");
}
void controlTempLed(byte tempC)
{
if(tempC < firstStepTemp)
{oneMax = max1;
twoMax = max2;
threeMax = max3;
}
else if(tempC >= firstStepTemp && tempC < secondStepTemp)
{oneMax = max1 - (max1/10);
twoMax = max2 - (max2/10);
threeMax = max3 - (max3/10);
}
else if(tempC >= secondStepTemp && tempC < thirdStepTemp)
{oneMax = max1 - (max1/3);
twoMax = max2 - (max2/3);
threeMax = max3 - (max3/3);
}
else if(tempC >= thirdStepTemp)
{oneMax = 0;
twoMax = 0;
threeMax = 0;
}
}
//void barra_up()
//{
// if (millis() - tempo_barra >= quoziente_barra)
// {
// if (stepper_bar == 7)
// {
// ++colonna;
// stepper_bar = 2;
// }
// if (colonna < 20)
// {
// lcd.setCursor(colonna,2);
// ++stepper_bar;
// lcd.write(stepper_bar);
// }
// tempo_barra = millis();
// }
//}
Si ma la libreria LCDMenu2_i2c.h dove l'hai presa?
#24#24#24#24
billykid591
21-02-2012, 22:43
Come avevo anticipato posto il codice del mio programma gestione Plafoniera a LED....è lungo e complesso....però al momento funziona bene. le librerie per la maggioranza le trovate sul sito ufficiale di Arduino alcune invece le ho modificate per adattarle al mio schema....comunque può servire per prendere spunto.
//Programma di controllo della scheda ARQUARIUM
//per la gestione di una plafoniera dimmerabile per
//effetto alba tramonto in pwm 0 - 5 volt
//canali disponibili 5
//# Include
//# ==================================
#include <LiquidCrystal_I2C.h>
#include <Menu.h>
#include <LCDMenu2_I2C.h>
#include <EEPROM.h>
#include <DS1307.h>
#include <Wire.h>
#include <WProgram.h>
#include <EEPROMVar.h>
//# Define
//# ==================================
#define _LCD_rows 4 // numero di righe del display alfanumerico
#define _LCD_cols 20 // numero di colonne del display
#define _BUTTON_up 2
#define _BUTTON_down 4
#define _BUTTON_enter 7
#define _BUTTON_left 14
#define _BUTTON_right 15
#define _BUTTON_prestat 0
#define _BUTTON_press_time 500 //250
#define OPEN_PLAFO 8 // ingresso dell'interruttore per spegnimento plafo quando sollevata
#define ONE_LED 9 // primo canale LED pwm warm nel dolce
#define TWO_LED 10 // secondo canale LED pwm cool nel dolce
#define THREE_LED 11 // terzo canale LED pwm red nel dolce
#define FOUR_LED 3 // quarto canale LED pwm
#define FIVE_LED 5 // quinto canale LED pwm
#define LCD_LIGHT 6 // uscita per backlight del display
#define TEMP_INPUT 16 // ingresso per sensore temperatura
//# Definizioni variabili EEPROM
EEPROMVar<int> EpromOneStartHour = 9; // ora accensione canale uno
EEPROMVar<int> EpromOneStartMinute = 5; // minuto accensione canale uno
EEPROMVar<int> EpromOneStopHour = 20; // ora spegnimento canale uno
EEPROMVar<int> EpromOneStopMinute = 55; // minuto spegnimento canale uno
EEPROMVar<int> EpromOneMax = 100; // massima luminosità canale uno
EEPROMVar<int> EpromOneFadeDuration = 60; // tempo in minuti alba tramonto canale uno
EEPROMVar<int> EpromTwoStartHour = 9;
EEPROMVar<int> EpromTwoStartMinute = 10;
EEPROMVar<int> EpromTwoStopHour = 21;
EEPROMVar<int> EpromTwoStopMinute = 50;
EEPROMVar<int> EpromTwoMax = 100;
EEPROMVar<int> EpromTwoFadeDuration = 60;
EEPROMVar<int> EpromThreeStartHour = 9;
EEPROMVar<int> EpromThreeStartMinute = 0;
EEPROMVar<int> EpromThreeStopHour = 21;
EEPROMVar<int> EpromThreeStopMinute = 0;
EEPROMVar<int> EpromThreeMax = 100;
EEPROMVar<int> EpromThreeFadeDuration = 60;
EEPROMVar<int> EpromTimeLcd= 100; // tempo massimo retroilluminazione LCD
EEPROMVar<int> EpromMaxOpenPlafo = 100; // luminosità massima con plafo aperta
// Le variabili sottoelencate possono essere usate se si ha bisogno di
// controllare più di tre canali
//EEPROMVar<int> EpromFourStartHour = 9;
//EEPROMVar<int> EpromFourStartMinute = 5;
//EEPROMVar<int> EpromFourStopHour = 20;
//EEPROMVar<int> EpromFourStopMinute = 55;
//EEPROMVar<int> EpromFourMax = 100;
//EEPROMVar<int> EpromFourFadeDuration = 60;
//EEPROMVar<int> EpromFiveStartHour = 9;
//EEPROMVar<int> EpromFiveStartMinute = 10;
//EEPROMVar<int> EpromFiveStopHour = 21;
//EEPROMVar<int> EpromFiveStopMinute = 50;
//EEPROMVar<int> EpromFiveMax = 100;
//EEPROMVar<int> EpromFiveFadeDuration = 60;
// variabili di tempo da collegare a quelle in memoria EEPROM
int oneStartHour;
int oneStopHour;
int oneStartMinute;
int oneStopMinute;
int twoStartHour;
int twoStopHour;
int twoStartMinute;
int twoStopMinute;
int threeStartHour;
int threeStopHour;
int threeStartMinute;
int threeStopMinute;
int oneMinFade;
int twoMinFade;
int threeMinFade;
//int fourStartHour;
//int fourStopHour;
//int fourStartMinute;
//int fourStopMinute;
//int fiveStartHour;
//int fiveStopHour;
//int fiveStartMinute;
//int fiveStopMinute;
//int sixStartHour;
//int sixStopHour;
//int sixStartMinute;
//int sixStopMinute;
//int fourMinFade;
//int fiveMinFade;
//int sixMinFade;
//# Variabili di tempo per gestione accensione spegnimento e fading
long oneStartSeconds; // Ora accensione canale uno in secondi
long onePhotoPeriod; // durata foto periodo canale uno
int oneMax; // luminosità massima canale uno
long oneFadeDuration; // durata alba tramonto canale uno
long twoStartSeconds; // Ora accensione canale due in secondi
long twoPhotoPeriod; // durata foto periodo canale due
int twoMax; // luminosità massima canale due
long twoFadeDuration; // durata alba tramonto canale due
long threeStartSeconds; // Ora accensione canale tre in minuti
long threePhotoPeriod; // durata foto periodo canale tre
int threeMax; // luminosità massima canale tre
long threeFadeDuration; // durata alba tramonto canale tre
//le variabili sottostanti possono essere usate se si ha
// bisogno di controllare più di tre canali
//long fourStartSeconds; // Ora accensione canale quattro
//long fourPhotoPeriod; // durata foto periodo canale quattro
//int fourMax; // luminosità massima canale quattro
//long fourFadeDuration; // durata alba tramonto canale quattro
//long fiveStartSeconds; // Ora accensione canale cinque
//long fivePhotoPeriod; // durata foto periodo canale cinque
//int fiveMax; // luminosità massima canale cinque
//long fiveFadeDuration; // durata alba tramonto canale cinque
//long sixStartSeconds; // Ora accensione canale sei
//long sixPhotoPeriod; // durata foto periodo canale sei
//int sixMax; // luminosità massima canale sei
//long sixFadeDuration; // durata alba tramonto canale sei
int max1; // variabile collegata a oneMax
int max2; // variabile collegata a twoMax
int max3; // variabile collegata a threeMax
int ora; // variabile ora corrente
int minuti; // variabile minuto corrente
int giorno; // variabile giorno corrente
int mese; // variabile mese corrente
int anno; // variabile anno corrente
// variabili controllo LED
long secondCounter = 0; // contatore che si resetta alla emzzanotte
long oldSecondCounter = 0; // contatore che si resetta alla mezzanotte
int oneVal; // valore corrente luminosità canale uno
int twoVal; // valore corrente luminosità canale due
int threeVal; // valore corrente luminosità canale tre
// variabili da usare se servono più di tre canali di controllo
//int fourVal; // valore corrente luminosità canale quattro
//int fiveVal; // valore corrente luminosità canale cinque
//int sixVal; // valore corrente luminosità canale sei
int setting = 0; // variabile di controllo modalità settaggi valori
long tempo_home = 0, back_home = 50000;
long tempo;
long tempo_barra;
int stepper_bar = 2;
int colonna = 0;
boolean on_off_light= false; // variabile di controllo stato accensione-spegnimento plafo
boolean LCD_time_on= true;
boolean blinker; // variabile booleana per settare o no il blink sull'LCD
long timeLcd; // tempo retroilluminazione LCD
int maxOpenPlafo; // luminosità residua palfoniera aperta
int control_light_stop = 0;
int cursorPosition = 0;
int buttonPress = 0;
float tempC;
int reading;
byte outValOne; // variabile controllo valore uscita in modalità accensione manuale
byte outValTwo;
byte outValThree;
const byte rowMessage = 2; // numero della riga del display dove appaiono i valori da modificare
byte firstStepTemp = 40; // max temperatura primo step abbassamento luminosità LED del 10%
byte secondStepTemp = 45; // max temperatura secondo step abbassamento luminosità LED del 40%
byte thirdStepTemp = 50; // max temperatura terzo step spegnimento LED
//# Creazione caratteri personali
//# ==================================
uint8_t arrow_up[8] = { // freccia su
0x4,0xE,0x15,0x4,0x4,0x4,0x0};
uint8_t arrow_down[8] = { // freccia giù
0x0,0x4,0x4,0x4,0x15,0xE,0x4};
//uint8_t light_on[8] = {
// 0x0,0x15,0xA,0x1F,0xA,0x15,0x0}; // plafo accesa
uint8_t punto[8] = {
0xC,0xC,0x0,0x0,0x0,0x0,0x0}; // punto gradi centigradi
uint8_t one_bar[8] = {
0x10,0x10,0x10,0x10,0x10,0x10,0x10}; // una barra verticale
uint8_t two_bar[8] = {
0x18,0x18,0x18,0x18,0x18,0x18,0x18}; // due barre verticali
uint8_t tree_bar[8] = {
0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}; // tre barre verticali
uint8_t four_bar[8] = {
0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E}; // quattro barre verticali
uint8_t five_bar[8] = {
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}; // cinque barre verticali
//# Classes
//# ==================================
LiquidCrystal_I2C lcd(0x20,_LCD_cols,_LCD_rows); // set the LCD address to 0x20 for a 16 chars and 2 line display
//LiquidCrystal lcd(2,3,4,5,6,7); // Neuste Version, RW wird nicht mehr gebraucht
Menu top("Root");
// menu, lcd, rows, cols, arrow_up_pos, arrow_down_pos
LCDMenu2 Root(top, lcd , _LCD_rows, _LCD_cols, 0, 1);
//# Buttons
//# ==================================
//UP,DOWN,ENTER,LEFT,RIGHT
int but[5]= {
_BUTTON_up,_BUTTON_down,_BUTTON_enter,_BUTTON_left ,_BUTTON_right};
//Previous States of buttons
boolean pbut[5]={
_BUTTON_prestat,_BUTTON_prestat,_BUTTON_prestat,_B UTTON_prestat,_BUTTON_prestat};
//# Button Enter
//# ==================================
int button_press_enter = 0;
unsigned long g_button_press_time = millis();
// creazione voci del menu e sottomenu..è possibile sostituirle cone voci proprie
// senza superare il numero massimo di colonne - 1 del dislplay LCD impiegato
char strMenuInit[] = "Menu";
char strMenuDate[] = "Imp. Data/Ora";
char strMenuTime[] = "Imp. Tempi on/off";
char strMenuFade[] = "Imp. Alba/Tramonto";
char strMenuLux[] = "Imp. Luminosita'";
char strMenuManualOn[] = "On/Off Manuale";
char strMenuLcdTime[] = "Imp. Tempo LCD";
char strMenuOpenPlafo[] = "Lum. Plafo aperta";
char strMenuTimeOne[] = "Imp. Tempo Warm";
char strMenuTimeTwo[] = "Imp. Tempo Cool";
char strMenuTimeThree[] = "Imp. Tempo Red";
//char strMenuFadeOne[] = "Imp. Fading Warm";
//char strMenuFadeTwo[] = "Imp. Fading Cool";
//char strMenuFadeThree[] = "Imp. Fading Red";
//char strMenuLuxOne[] = "Imp. Lum. Warm";
//char strMenuLuxTwo[] = "Imp. Lum. Cool";
//char strMenuLuxThree[] = "Imp. Lum. Red";
// voci del menu relative ai canali dal 3 al 6 da utilizzare se servono
//char strMenuTimeFour[] = "";
//char strMenuTimeFive[] = "";
//char strMenuTimeSix[] = "";
//char strMenuFadeFour[] = "";
//char strMenuFadeFive[] = "";
//char strMenuFadeSix[] = "";
//char strMenuLuxFour[] = "";
//char strMenuLuxFive[] = "";
//char strMenuLuxSix[] = "";
//# Menu
//# ==================================
Menu Item1(strMenuInit);
Menu Item12(strMenuDate);
Menu Item13(strMenuTime);
Menu Item14(strMenuFade);
Menu Item15(strMenuLux);
Menu Item16(strMenuManualOn);
Menu Item17(strMenuLcdTime);
Menu Item18(strMenuOpenPlafo);
Menu Item131(strMenuTimeOne);
Menu Item132(strMenuTimeTwo);
Menu Item133(strMenuTimeThree);
//Menu Item134(strMenuTimeFour);
//Menu Item135(strMenuTimeFive);
//Menu Item136(strMenuTimeSix);
//Menu Item141(strMenuFadeOne);
//Menu Item142(strMenuFadeTwo);
//Menu Item143(strMenuFadeThree);
//Menu Item144(strMenuFadeFour);
//Menu Item145(strMenuFadeFive);
//Menu Item146(strMenuFadeSix);
//Menu Item151(strMenuLuxOne);
//Menu Item152(strMenuLuxTwo);
//Menu Item153(strMenuLuxThree);
//Menu Item154(strMenuLuxFour);
//Menu Item155(strMenuLuxFive);
//Menu Item156(strMenuLuxSix);
//# ==================================
//## Menu Init
void menuinit()
{
top.addChild(Item1);
Item1.addChild(Item12);
Item1.addChild(Item13);
Item1.addChild(Item14);
Item1.addChild(Item15);
Item1.addChild(Item16);
Item1.addChild(Item17);
Item1.addChild(Item18);
Item13.addChild(Item131);
Item13.addChild(Item132);
Item13.addChild(Item133);
// Item13.addChild(Item134);
// Item13.addChild(Item135);
// Item13.addChild(Item136);
// Item14.addChild(Item141);
// Item14.addChild(Item142);
// Item14.addChild(Item143);
// Item14.addChild(Item144);
// Item14.addChild(Item145);
// Item14.addChild(Item146);
// Item15.addChild(Item151);
// Item15.addChild(Item152);
// Item15.addChild(Item153);
// Item15.addChild(Item154);
// Item15.addChild(Item155);
// Item15.addChild(Item156);
Root.display();
}
//## Button
void button(int which, char select='z')
{
if(which == _BUTTON_up || select == 'w') {
//UP
switch (setting) {
case 0:
Root.goUp();
//Serial.println("'up'");
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_down || select == 's') {
//DOWN
switch (setting) {
case 0:
Root.goDown();
//Serial.println("'down'");
break;
default:
selectSet(which);
}
}
else if(which == _BUTTON_left || select == 'l') {
//LEFT
if (cursorPosition >= 1) {
cursorPosition--;
}
switch (setting) {
case 0:
cursorPosition = 0;
goBack();
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_right || select == 'r') {
//RIGHT
if(cursorPosition < 5){
cursorPosition++;
}
switch (setting) {
case 0:
Root.goEnter();
button_press_enter = 1;
break;
default:
selectSet(which);
break;
}
}
else if(which == _BUTTON_enter || select == 'e') {
//ENTER
if (setting != 0)
{
save_data();
blinker = false;
print_save_date();
Root.goEnter();
setting = 0;
control_light_stop = 0;
}
set_reset_value();
}
}
//## Button Check
void buttoncheck()
{
for (int i=0;i<=4;i++)
{
if (digitalRead(but[i])) {
if (pbut[i]==0 && (millis()-g_button_press_time) >= _BUTTON_press_time) {
button(but[i]);
buttonPress = but[i];
//pbut[i]=1;
g_button_press_time = millis();
if(timeLcd < 100){
analogWrite(LCD_LIGHT,255);
}
tempo_home = millis();
}
}
else {
pbut[i]=0;
//buttonPress=0;
if( millis() - tempo_home > back_home )
{
Root.goBack();
Root.goBack();
lcd.noBlink();
set_reset_value();
setting = 0;
cursorPosition = 0;
control_light_stop = 0;
LCD_time_on = true;
}
if(timeLcd < 100){
if( millis() - tempo_home > (timeLcd * 1000) )
{
analogWrite(LCD_LIGHT,20);
//tempo_home = millis();
}
}
}
}
//if(Serial.available()) {
// char c = Serial.read();
// button(-1,c);
//}
}
//## Function Check
void funccheck(int button)
{
int x;
if(button_press_enter == 1) {
button_press_enter = 0;
if(Root.curfuncname == strMenuInit) {
//Serial.println("Function: Controller LED");
setting = 0;
LCD_time_on = false;
}
else if(Root.curfuncname == strMenuDate) { // menu impostazione data e ora generale
setting = 1;
//Serial.println("Function: Imp. data ora");
ora = RTC.get(DS1307_HR, true);
minuti = RTC.get(DS1307_MIN, true);
giorno = RTC.get(DS1307_DATE, true);
mese = RTC.get(DS1307_MTH, true);
anno = RTC.get(DS1307_YR, true);
lcd.clear();
print_text(0,0, strMenuDate);
cursorPosition= 1;
print_time_date(2);
setDateHour(button);
// set_month(mese);
// set_year(anno);
// set_hour(ora);
// set_minute(minuti);
// set_day(0);
}
else if(Root.curfuncname == strMenuTimeOne) { // menu impostazione tempi accensione canale uno
Serial.println("Function: Imp. tempi canale uno");
setting = 2;
lcd.clear();
print_text(0,0, strMenuTimeOne);
printStartStopTime(oneStartHour, oneStartMinute, oneStopHour, oneStopMinute);
cursorPosition= 1;
setTimeOne(button);
// set_on_light_minute(led_on_minute);
// set_off_light_hour(led_off_hour);
// set_off_light_minute(led_off_minute);
// set_on_light_hour(led_on_hour);
}
else if(Root.curfuncname == strMenuTimeTwo) { // menu impostazione tempi accensione canale due
setting = 3;
lcd.clear();
print_text(0,0, strMenuTimeTwo);
printStartStopTime(twoStartHour, twoStartMinute, twoStopHour, twoStopMinute);
cursorPosition= 1;
setTimeTwo(button);
}
else if(Root.curfuncname == strMenuTimeThree) { // menu impostazione tempi accensione canale tre
setting = 4;
lcd.clear();
print_text(0,0, strMenuTimeThree);
printStartStopTime(threeStartHour, threeStartMinute, threeStopHour, threeStopMinute);
cursorPosition= 1;
setTimeThree(button);
}
else if(Root.curfuncname == strMenuFade) { // menu impostazione alba tramonto
setting = 5;
lcd.clear();
print_text(0,0, strMenuFade);
print_text(0,1,"Warm Cool Red");
print_text(0,rowMessage,"Min: Min: Min:");
setFadeTime(button, oneMinFade, 4);
setFadeTime(button, twoMinFade, 11);
setFadeTime(button, threeMinFade, 18);
//
// print_value(4,rowMessage, oneMinFade);
// print_value(11,rowMessage, twoMinFade);
// print_value(18,rowMessage, threeMinFade);
cursorPosition= 1;
setFade(button);
}
else if(Root.curfuncname == strMenuLux) { // menu impostazione luminosità LED singoli canali
setting = 6;
control_light_stop = 1;
lcd.clear();
print_text(0,0,strMenuLux);
print_text(1,1,"Warm Cool Red");
setMaxLux(button, oneMax, ONE_LED, 1); // SCRIVE I VALORI DEI CANALI
setMaxLux(button, twoMax, TWO_LED, 7);
setMaxLux(button, threeMax, THREE_LED, 14);
cursorPosition = 1;
setLux(button);
}
else if(Root.curfuncname == strMenuManualOn) { // menu accensione manuale singoli canali
setting = 7;
control_light_stop = 1;
lcd.clear();
print_text(0,0,strMenuManualOn);
print_text(1,1,"Warm Cool Red");
outValOne = 0;
outValTwo = 0;
outValThree = 0;
manualOn(button, outValOne, ONE_LED, 1);
manualOn(button, outValTwo, TWO_LED, 7);
manualOn(button, outValThree, THREE_LED, 14);
cursorPosition= 1;
setManualOn(button);
/* manual_on_off_cool(on_off_light);
manual_on_off_red(on_off_light);
manual_on_off_warm(on_off_light);*/
}
else if(Root.curfuncname == strMenuLcdTime) { // menu impostazione tempo accesnione backlight dell'LCD
setting = 8;
lcd.clear();
print_text(0,0,strMenuLcdTime);
print_text(0,rowMessage,"Secondi:");
setLcdTime(button);
}
else if(Root.curfuncname == strMenuOpenPlafo) { // menu impostazione luce residua LED a plafo aperta
setting = 9;
lcd.clear();
blinker = true;
print_text(0,0,strMenuOpenPlafo);
print_text(0,rowMessage,"Luminosita':");
setLuxOpenPlafo(button);
}
}
}
//# Setup
//# ==================================
void setup()
{
lcd.begin(_LCD_rows,_LCD_cols);
lcd.createChar(0, arrow_up);
lcd.createChar(1, arrow_down);
//lcd.createChar(2, light_on);
lcd.createChar(2, punto);
lcd.createChar(3, one_bar);
lcd.createChar(4, two_bar);
lcd.createChar(5, tree_bar);
lcd.createChar(6, four_bar);
lcd.createChar(7, five_bar);
lcd.init();
//lcd.home();
analogReference(INTERNAL);
pinMode(OPEN_PLAFO, INPUT);
pinMode(ONE_LED, OUTPUT);
pinMode(TWO_LED, OUTPUT);
pinMode(THREE_LED, OUTPUT);
pinMode(FOUR_LED, OUTPUT);
pinMode(FIVE_LED, OUTPUT);
pinMode(LCD_LIGHT, OUTPUT);
pinMode(TEMP_INPUT, INPUT);
analogWrite(LCD_LIGHT,20);
set_reset_value();
tempo = millis();
menuinit();
Serial.begin(9600);
}
//# LOOP
//# ==================================
void loop()
{
buttoncheck();
funccheck(buttonPress);
reading = analogRead(TEMP_INPUT);
tempC = reading / 9.31;
//tempC = (5.0 * reading * 100.0)/1024.0;
controlTempLed(byte(tempC));
Serial.println("Setting:");
Serial.println(setting);
Serial.println("Cursor position");
Serial.println(cursorPosition);
Serial.println("Button Press");
Serial.println(buttonPress);
Serial.println(Root.curfuncname);
Serial.println("Tempo LCD");
Serial.println(timeLcd);
Serial.println("Temperatura");
Serial.println(tempC);
//control_led_lights();
oldSecondCounter = secondCounter;
secondCounter = (long) RTC.get(DS1307_HR,true) * 3600 + (long) RTC.get(DS1307_MIN,false)* 60 + (long) RTC.get(DS1307_SEC,false);
// controlla e setta la durata del fading
if(oneFadeDuration > onePhotoPeriod/2 && onePhotoPeriod > 0) {
oneFadeDuration = onePhotoPeriod/2;
}
if(oneFadeDuration < 1){
oneFadeDuration = 1;
}
if(twoFadeDuration > twoPhotoPeriod/2 && twoPhotoPeriod > 0) {
twoFadeDuration = twoPhotoPeriod/2;
}
if(twoFadeDuration < 1){
twoFadeDuration = 1;
}
if(threeFadeDuration > threePhotoPeriod/2 && threePhotoPeriod > 0) {
threeFadeDuration = threePhotoPeriod/2;
}
if(threeFadeDuration < 1){
threeFadeDuration = 1;
}
//setta le uscite
oneVal = setLed(secondCounter, ONE_LED, oneStartSeconds, onePhotoPeriod, oneFadeDuration, oneMax);
twoVal = setLed(secondCounter, TWO_LED, twoStartSeconds, twoPhotoPeriod, twoFadeDuration, twoMax);
threeVal = setLed(secondCounter, THREE_LED, threeStartSeconds, threePhotoPeriod, threeFadeDuration, threeMax);
if(oneVal > 0 || twoVal > 0 || threeVal > 0)
{ on_off_light= true;}
else
{ on_off_light= false;}
Serial.println("Oneval");
Serial.println(oneVal);
Serial.println("twoval");
Serial.println(twoVal);
Serial.println("threeval");
Serial.println(threeVal);
Serial.println(secondCounter);
Serial.println(oneStartSeconds);
Serial.println(onePhotoPeriod);
Serial.println(oneFadeDuration);
Serial.println("Control light stop");
Serial.println(control_light_stop);
offPlafo();
if (timeLcd == 100){
analogWrite(LCD_LIGHT,255);
}
if (LCD_time_on == true)
{
printTemp(int(tempC));
print_time_date(3);
}
//delay(500);
}
//Funzione per settare accensione
//e spegnimento dei singoli canali LED
//con gestione effetto alba tramonto
int setLed(long Seconds, // tempo corrente in secondi
int ledPin, // numero di pin del canale LED
long start, // tempo di partenza accensione del canale LED
long period, // Periodo di accensione del canale LED
long fade, // durata alba tramonto canale LED
int ledMax // luminosità massima canale LED
)
{
// controlla che non si sia in modalità settaggio luminosità,
// on/off manuale o il coperchio alzato in quel caso esce dalla funzione
int val;
if (control_light_stop == 0){
// fade up...ossia gestione alba
if (Seconds > start || Seconds <= start + fade) {
val = map(Seconds - start, 0, fade, 0, ledMax * 2.55);
}
// fade down...gestione tramonto
if (Seconds > start + period && Seconds <= start + period + fade) {
val = map(Seconds - (start + period), 0, fade, ledMax * 2.55, 0);
}
// off or post-midnight run spegnimento o partenza dopo mezzanotte
if (Seconds <= start || Seconds > start + period + fade) {
if((start + period + fade)%86400 < start && (start + period + fade)%86400 > Seconds)
{
val = map((start + period + fade - Seconds)%86400,0,fade,0,ledMax * 2.55);
}
else {
val = 0;
}
}
if (val > ledMax * 2.55) {
val = ledMax * 2.55;
}
if (val < 0) {
val = 0;
}
analogWrite(ledPin, val); // map(val, 0, 100, 0, 255));
return val;
}
}
//* Funzione print time_date
//* mostra data e ora sul display
void print_time_date(byte row)
{
int ora;
int minuti;
int secondi;
int giorno;
int mese;
int anno;
ora = RTC.get(DS1307_HR, true);
minuti = RTC.get(DS1307_MIN, true);
secondi = RTC.get(DS1307_SEC, true);
giorno = RTC.get(DS1307_DATE, true);
mese = RTC.get(DS1307_MTH, true);
anno = RTC.get(DS1307_YR, true);
blinker = false;
if (giorno < 10 && giorno > 0) {
print_value(0,row,0);
print_value(1,row,giorno);
}
else {
print_value(0,row,giorno);
}
print_text(2,row,"-");
if (mese < 10 && mese > 0) {
print_value(3,row,0);
print_value(4,row,mese);
}
else {
print_value(3,row,mese);
}
print_text(5,row,"-");
print_value(6,row,anno);
if (ora < 10 && ora >= 0) {
print_text(11,row," ");
print_value(12,row,ora);
}
else {
print_value(11,row,ora);
}
print_text(13,row,":");
if (minuti < 10 && minuti >= 0) {
print_value(14,row,0);
print_value(15,row,minuti);
}
else {
print_value(14,row,minuti);
}
print_text(16,row,":");
if (secondi < 10 && secondi >= 0) {
print_value(17,row,0);
print_value(18,row,secondi);
}
else {
print_value(17,row,secondi);
}
}
// funzione di settaggio data e ora corrente
void setDateHour(int button)
{
print_text(16,rowMessage," "); // rende non visibili i secondi
switch (cursorPosition) {
case 0:
case 1:
set_day(button);
break;
case 2:
set_month(button);
break;
case 3:
set_year(button);
break;
case 4:
set_hour(button);
break;
case 5:
set_minute(button);
break;
default:
cursorPosition = 5;
break;
}
}
//* settaggio giorno
void set_day(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(giorno >= 1 && giorno < 32){
giorno++;
}
if(giorno == 32){
giorno = 1;
}
}
if (button == _BUTTON_down) {
if(giorno > 0 && giorno <= 31){
giorno--;
}
if(giorno == 0){
giorno = 31;
}
}
if (giorno < 10 && giorno > 0) {
print_value(0,rowMessage,0);
print_value(1,rowMessage,giorno);
}
else {
print_value(0,rowMessage,giorno);
}
print_text(2,rowMessage,"-");
lcd.setCursor(1,rowMessage);
}
//* settaggio mese
void set_month(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(mese >= 1 && mese < 13){
mese++;
}
if(mese == 13){
mese = 1;
}
}
if (button == _BUTTON_down) {
if(mese > 0 && mese <= 12){
mese--;
}
if(mese == 0){
mese = 12;
}
}
if (mese < 10 && mese > 0) {
print_value(3,rowMessage,0);
print_value(4,rowMessage,mese);
}
else {
print_value(3,rowMessage,mese);
}
print_text(5,rowMessage,"-");
lcd.setCursor(4,rowMessage);
}
//* settaggio anno
void set_year(int button)
{
blinker = true;
if (button == _BUTTON_up) {
anno++;
}
if (button == _BUTTON_down) {
anno--;
}
print_value(6,rowMessage,anno);
lcd.setCursor(9,rowMessage);
}
//* settaggio ora
void set_hour(int button)
{
blinker = true;
// controlla quale bottone è stato premuto
if (button == _BUTTON_up) {
if(ora >= 0 && ora < 24){
ora++;
}
if(ora == 24){
ora = 0;
}
}
if (button == _BUTTON_down) {
if(ora > -1 && ora <= 23){
ora--;
}
if(ora == -1){
ora = 23;
}
}
if (ora < 10 && ora >= 0) {
print_value(11,rowMessage,0);
print_value(12,rowMessage,ora);
}
else {
print_value(11,rowMessage,ora);
}
print_text(13,rowMessage,":");
lcd.setCursor(12,rowMessage);
}
//* settaggio minuti
void set_minute(int button)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(minuti >= 0 && minuti < 60){
minuti++;
}
if(minuti == 60){
minuti = 0;
}
}
if (button == _BUTTON_down) {
if(minuti > -1 && minuti <= 59){
minuti--;
}
if(minuti == -1){
minuti = 59;
}
}
if (minuti < 10 && minuti >= 0) {
print_value(14,rowMessage,0);
print_value(15,rowMessage,minuti);
}
else {
print_value(14,rowMessage,minuti);
}
lcd.setCursor(15,rowMessage);
}
// setta accensione e spegnimento canale uno
void setTimeOne(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, oneStartHour);
break;
case 2:
setStartMinute(button, oneStartMinute);
break;
case 3:
setStopHour(button, oneStopHour);
break;
case 4:
setStopMinute(button, oneStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
// setta accensione e spegnimento canale due
void setTimeTwo(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, twoStartHour);
break;
case 2:
setStartMinute(button, twoStartMinute);
break;
case 3:
setStopHour(button, twoStopHour);
break;
case 4:
setStopMinute(button, twoStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
// setta accensione e spegnimento canale tre
void setTimeThree(int button)
{
switch (cursorPosition) {
case 0:
case 1:
setStartHour(button, threeStartHour);
break;
case 2:
setStartMinute(button, threeStartMinute);
break;
case 3:
setStopHour(button, threeStopHour);
break;
case 4:
setStopMinute(button, threeStopMinute);
break;
default:
cursorPosition = 4;
break;
}
}
//* settaggio ora accensione LED
void setStartHour(int button, int &led_on_hour)
{
blinker = true;
if (button == _BUTTON_up) {
if(led_on_hour >= 0 && led_on_hour < 24){
led_on_hour++;
}
if(led_on_hour == 24){
led_on_hour = 0;
}
}
if (button == _BUTTON_down) {
if(led_on_hour > -1 && led_on_hour <= 23){
led_on_hour--;
}
if(led_on_hour == -1){
led_on_hour = 23;
}
}
if (led_on_hour < 10 && led_on_hour >= 0) {
print_value(4,rowMessage,0);
print_value(5,rowMessage,led_on_hour);
}
else {
print_value(4,rowMessage,led_on_hour);
}
print_text(6,rowMessage,":");
lcd.setCursor(5,rowMessage);
}
//* settaggio minuto accensione LED
void setStartMinute(int button, int &led_on_minute)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(led_on_minute >= 0 && led_on_minute < 60){
led_on_minute++;
}
if(led_on_minute == 60){
led_on_minute = 0;
}
}
if (button == _BUTTON_down) {
if(led_on_minute > -1 && led_on_minute <= 59){
led_on_minute--;
}
if(led_on_minute == -1){
led_on_minute = 59;
}
}
if (led_on_minute < 10 && led_on_minute >= 0) {
print_value(7,rowMessage,0);
print_value(8,rowMessage,led_on_minute);
}
else {
print_value(7,rowMessage,led_on_minute);
}
lcd.setCursor(8,rowMessage);
}
//* settaggio ora spegnimento LED
void setStopHour(int button, int &led_off_hour)
{
blinker = true;
if (button == _BUTTON_up) {
if(led_off_hour >= 0 && led_off_hour < 24){
led_off_hour++;
}
if(led_off_hour == 24){
led_off_hour = 0;
}
}
if (button == _BUTTON_down) {
if(led_off_hour > -1 && led_off_hour <= 23){
led_off_hour--;
}
if(led_off_hour == -1){
led_off_hour = 23;
}
}
if (led_off_hour < 10 && led_off_hour >= 0) {
print_value(14,rowMessage,0);
print_value(15,rowMessage,led_off_hour);
}
else {
print_value(14,rowMessage,led_off_hour);
}
print_text(16,rowMessage,":");
lcd.setCursor(15,rowMessage);
}
//* settaggio minuti spegnimento LED
void setStopMinute(int button, int &led_off_minute)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(led_off_minute >= 0 && led_off_minute < 60){
led_off_minute++;
}
if(led_off_minute == 60){
led_off_minute = 0;
}
}
if (button == _BUTTON_down) {
if(led_off_minute > -1 && led_off_minute <= 59){
led_off_minute--;
}
if(led_off_minute == -1){
led_off_minute = 59;
}
}
if (led_off_minute < 10 && led_off_minute >= 0) {
print_value(17,rowMessage,0);
print_value(18,rowMessage,led_off_minute);
}
else {
print_value(17,rowMessage,led_off_minute);
}
lcd.setCursor(18,rowMessage);
}
void setFade(int button){ // settaggio alba tramonto dei canali
switch (cursorPosition) {
case 0:
case 1:
setFadeTime(button, oneMinFade, 4);
break;
case 2:
setFadeTime(button, twoMinFade, 11);
break;
case 3:
setFadeTime(button, threeMinFade, 18);
break;
default:
cursorPosition = 3;
break;
}
}
//* settaggio tempo alba/tramonto
void setFadeTime(int button,int &varFade, byte chrPos)
{
blinker = true;
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(varFade >= 0 && varFade <= 60){
varFade++;
}
if(varFade == 61){
varFade = 0;
}
}
if (button == _BUTTON_down) {
if(varFade > -1 && varFade <= 60){
varFade--;
}
if(varFade == -1){
varFade = 60;
}
}
if (varFade < 10 && varFade >=0){
print_value(chrPos,rowMessage,0);
print_value(chrPos+1,rowMessage,varFade);
}
else {
print_value(chrPos,rowMessage,varFade);
}
lcd.setCursor(chrPos+1,rowMessage);
}
void setLux(int button){
switch (cursorPosition) {
case 0:
case 1:
setMaxLux(button, oneMax, ONE_LED, 1);
break;
case 2:
setMaxLux(button, twoMax, TWO_LED, 7);
break;
case 3:
setMaxLux(button, threeMax, THREE_LED, 14);
default:
cursorPosition = 3;
break;
}
}
//* settaggio luminosità massima dei vari canali
void setMaxLux(int button, int &varLux, byte PIN_LED, byte chrPos){
// controlla quale bottone premuto
if (button == _BUTTON_up) {
if(varLux >= 0 && varLux < 100){
varLux++;
}
}
if (button == _BUTTON_down) {
if(varLux > 0 && varLux <= 100){
varLux--;
}
}
int bright = (varLux * 2.55);
//Serial.println(lux);
analogWrite(PIN_LED, bright);
blinker = true;
if (varLux < 10) {
lcd.setCursor(chrPos,rowMessage);
lcd.print(' ');
lcd.setCursor(chrPos+1,rowMessage);
lcd.print(' ');
print_value(chrPos+2,rowMessage,varLux);
}
else if (varLux >= 10 && varLux <= 99){
lcd.setCursor(chrPos,rowMessage);
lcd.print(' ');
print_value(chrPos+1,rowMessage,varLux);
}
else {
print_value(chrPos,rowMessage,varLux);
}
lcd.print("%");
}
void setManualOn(int button){ //setta on off manualmente i singoli canali
switch (cursorPosition) {
case 0:
case 1:
manualOn(button, outValOne, ONE_LED, 1);
break;
case 2:
manualOn(button, outValTwo, TWO_LED, 7);
break;
case 3:
manualOn(button, outValThree, THREE_LED, 14);
default:
cursorPosition = 3;
break;
}
}
//* accensione manuale dei canali
void manualOn(int button, byte &Val, byte PIN_LED, byte chrPos)
{
blinker = true;
if (button == _BUTTON_up) {
Val = 255;
//analogWrite(PIN_LED, Val);
}
if (button == _BUTTON_down) {
Val = 0;
//analogWrite(PIN_LED, Val);
}
if(Val > 0)
{
print_text(chrPos + 1,rowMessage,"On ");
lcd.setCursor(chrPos,rowMessage);
}
else
{
print_text(chrPos + 1,rowMessage,"Off");
lcd.setCursor(chrPos,rowMessage);
}
analogWrite(PIN_LED, Val);
}
void setLcdTime(int button){ //settaggio del tempo di illuminazione dell'LCD
blinker = true;
if (button == _BUTTON_up) {
if(timeLcd >= 0 && timeLcd <= 90){
timeLcd = timeLcd + 10;
}
}
if (button == _BUTTON_down) {
if(timeLcd > 10 && timeLcd <= 100){
timeLcd = timeLcd -10;
}
}
if (timeLcd <= 90){
print_value(9,rowMessage,timeLcd);
}
else{
print_text(9,rowMessage,"On");
}
}
void setLuxOpenPlafo(int button){ // settaggio minima luminosità led a plafo aperta
blinker = true;
if (button == _BUTTON_up) {
if(maxOpenPlafo >= 0 && maxOpenPlafo <= 99){
maxOpenPlafo++;
}
}
if (button == _BUTTON_down) {
if(maxOpenPlafo > 1 && maxOpenPlafo <= 100){
maxOpenPlafo--;
}
}
if(maxOpenPlafo > 9 && maxOpenPlafo < 100){
print_text(12,rowMessage," ");
print_value(13,rowMessage,maxOpenPlafo);
}
if(maxOpenPlafo < 10){
print_text(12,rowMessage," ");
print_value(14,rowMessage,maxOpenPlafo);
}
}
//* Funzione per la stampa su LCD di valori numerici
void print_value(int col, int row, int value)
{
lcd.setCursor(col,row);
lcd.print(value);
if (blinker == true) {
lcd.blink();
}
else {
lcd.noBlink();
}
}
//* Funzione per la stampa su LCD di valori testo
void print_text(int col, int row, char* text)
{
lcd.setCursor(col,row);
lcd.print(text);
if (blinker == true) {
lcd.blink();
}
else {
lcd.noBlink();
}
}
//* Funzione di salvataggio dei dati nella eeprpom relativi a
// data corrente, ora corrente, orari di accensione e spegnimento
// della plafo, tempo di alba-tramonto, luminosità singoli canali
void save_data()
{
if (setting == 1)
{
RTC.stop();
RTC.set(DS1307_MIN,minuti); //setta i minuti
RTC.set(DS1307_HR,ora); //setta l'ora
RTC.set(DS1307_DATE,giorno); //setta la data
RTC.set(DS1307_MTH,mese); //setta il mese
RTC.set(DS1307_YR,(anno-2000)); //setta l'anno
RTC.start();
}
if (setting ==2 || setting == 3 || setting == 4)
{
EpromOneStartHour = oneStartHour;
EpromOneStartMinute = oneStartMinute;
EpromOneStopHour = oneStopHour;
EpromOneStopMinute = oneStopMinute;
EpromTwoStartHour = twoStartHour;
EpromTwoStartMinute = twoStartMinute;
EpromTwoStopHour = twoStopHour;
EpromTwoStopMinute = twoStopMinute;
EpromThreeStartHour = threeStartHour;
EpromThreeStartMinute = threeStartMinute;
EpromThreeStopHour = threeStopHour;
EpromThreeStopMinute = threeStopMinute;
}
if( setting == 5 )
{
EpromOneFadeDuration = oneMinFade;
EpromTwoFadeDuration = twoMinFade;
EpromThreeFadeDuration = threeMinFade;
}
if( setting == 6 )
{
EpromOneMax = oneMax;
EpromTwoMax = twoMax;
EpromThreeMax = threeMax;
}
if( setting == 8 )
{
EpromTimeLcd = timeLcd;
}
if( setting == 9 )
{
EpromMaxOpenPlafo = maxOpenPlafo;
}
}
//* mostra su LCD la scritta dati salvati lampeggiante
void print_save_date()
{
for (int i=0; i <= 3; i++){
print_text(0,3,"Dati salvati");
delay(500);
print_text(0,3," ");
delay(500);
}
}
// funzione di lettura delle memorie all'avvio del programma
// chiamata da setup e ad ogni salvataggio dei dati
// alla prima chiamata controlla se le memorie sono fuori range e
// corregge i dati
void set_reset_value()
{
oneMax = EpromOneMax;
twoMax = EpromTwoMax;
threeMax = EpromThreeMax;
max1 = oneMax;
max2 = twoMax;
max3 = threeMax;
oneStartHour = EpromOneStartHour;
oneStartMinute = EpromOneStartMinute;
oneStartSeconds = (long) oneStartHour * 3600 + (long) oneStartMinute* 60;
twoStartHour = EpromTwoStartHour;
twoStartMinute = EpromTwoStartMinute;
twoStartSeconds = (long) twoStartHour * 3600 + (long) twoStartMinute * 60;
threeStartHour = EpromThreeStartHour;
threeStartMinute = EpromThreeStartMinute;
threeStartSeconds = (long) threeStartHour * 3600 + (long) threeStartMinute * 60;
oneStopHour = EpromOneStopHour;
oneStopMinute = EpromOneStopMinute;
onePhotoPeriod = ((long) oneStopHour * 3600 + (long) oneStopMinute * 60) - oneStartSeconds;
twoStopHour = EpromTwoStopHour;
twoStopMinute = EpromTwoStopMinute;
twoPhotoPeriod = ((long)twoStopHour * 3600 + (long)twoStopMinute * 60) - twoStartSeconds;
threeStopHour = EpromThreeStopHour;
threeStopMinute = EpromThreeStopMinute;
threePhotoPeriod = ((long) threeStopHour * 3600 + (long) threeStopMinute * 60) - threeStartSeconds;
oneMinFade = EpromOneFadeDuration;
twoMinFade = EpromTwoFadeDuration;
threeMinFade = EpromThreeFadeDuration;
oneFadeDuration = (long) oneMinFade * 60;
twoFadeDuration = (long) twoMinFade * 60;
threeFadeDuration = (long) threeMinFade * 60;
timeLcd = EpromTimeLcd;
maxOpenPlafo = EpromMaxOpenPlafo;
// analogWrite(ONE_LED, 0);
// analogWrite(TWO_LED, 0);
// analogWrite(THREE_LED, 0);
}
void offPlafo()
{
if (setting != 7){
if(digitalRead(OPEN_PLAFO)== HIGH){
if(on_off_light == true) {
control_light_stop = 1;
analogWrite(ONE_LED, maxOpenPlafo);
analogWrite(TWO_LED, maxOpenPlafo);
analogWrite(THREE_LED, maxOpenPlafo);
}
}
if(digitalRead(OPEN_PLAFO)== LOW) {
control_light_stop = 0;
}
}
}
void goBack()
{
lcd.noBlink();
Root.goBack();
setting = 0;
if(Root.curfuncname == "Root"){
LCD_time_on = true;
}
}
void goEnter()
{
lcd.noBlink();
Root.goEnter();
setting = 0;
control_light_stop = 0;
}
void printStartStopTime(int startHour,
int startMinute,
int stopHour,
int stopMinute
)
{
print_text(0,rowMessage," On: Off:");
if (startHour < 10 && startHour >= 0) {
print_value(4,rowMessage,0);
print_value(5,rowMessage,startHour);
}
else {
print_value(4,rowMessage,startHour);
}
print_text(6,rowMessage,":");
if (startMinute < 10 && startMinute >= 0) {
print_value(7,rowMessage,0);
print_value(8,rowMessage,startMinute);
}
else {
print_value(7,rowMessage,startMinute);
}
if (stopHour < 10 && stopHour >= 0) {
print_text(14,rowMessage," ");
print_value(15,rowMessage,stopHour);
}
else {
print_value(14,rowMessage,stopHour);
}
print_text(16,rowMessage,":");
if (stopMinute < 10 && stopMinute >= 0) {
print_value(17,rowMessage,0);
print_value(18,rowMessage,stopMinute);
}
else {
print_value(17,rowMessage,stopMinute);
}
}
void selectSet(int which) //funzione di selezioni dei vari settaggi alla pressione dei tasti
{
switch (setting) {
case 1:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setDateHour(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setDateHour(which);
}
}
break;
case 2:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeOne(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeOne(which);
}
}
break;
case 3:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeTwo(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeTwo(which);
}
}
break;
case 4:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setTimeThree(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setTimeThree(which);
}
}
break;
case 5:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setFade(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setFade(which);
}
}
break;
case 6:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLux(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLux(which);
}
}
break;
case 7:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setManualOn(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setManualOn(which);
}
}
break;
case 8:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLcdTime(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLcdTime(which);
}
}
break;
case 9:
if(which == _BUTTON_up || which == _BUTTON_down || which == _BUTTON_right){
setLuxOpenPlafo(which);
}
else{
if (cursorPosition == 0){
goEnter();
}
else {
setLuxOpenPlafo(which);
}
}
break;
}
}
void printTemp(int temp)
{
print_text(8,0,"Temp.");
print_value(14, 0, temp);
lcd.write(2);
print_text(17,0,"C");
}
void controlTempLed(byte tempC)
{
if(tempC < firstStepTemp)
{oneMax = max1;
twoMax = max2;
threeMax = max3;
}
else if(tempC >= firstStepTemp && tempC < secondStepTemp)
{oneMax = max1 - (max1/10);
twoMax = max2 - (max2/10);
threeMax = max3 - (max3/10);
}
else if(tempC >= secondStepTemp && tempC < thirdStepTemp)
{oneMax = max1 - (max1/3);
twoMax = max2 - (max2/3);
threeMax = max3 - (max3/3);
}
else if(tempC >= thirdStepTemp)
{oneMax = 0;
twoMax = 0;
threeMax = 0;
}
}
//void barra_up()
//{
// if (millis() - tempo_barra >= quoziente_barra)
// {
// if (stepper_bar == 7)
// {
// ++colonna;
// stepper_bar = 2;
// }
// if (colonna < 20)
// {
// lcd.setCursor(colonna,2);
// ++stepper_bar;
// lcd.write(stepper_bar);
// }
// tempo_barra = millis();
// }
//}
Si ma la libreria LCDMenu2_i2c.h dove l'hai presa?
#24#24#24#24
Le due librerie con i2c nel nome sono modifiche fatta da me sulle librerie originali per poter far funzionare il display tramite il bus I2C...comunque il codice è stato modificato e parzialmente semplificato appena sarà tutto Ok e avrò un pò di tempo libero posterò tutti file e le librerie
Non ti scordar di noi, siamo tutti qui' in attesa delle tue librerie.....
SteMarcia
17-04-2019, 23:33
visto che qualcuno me lo chiede in mp e se ne parla giusto qua in giro adesso, vi posto il codice alba/tramonto e display.
chiaramente:
1) dovete adattare i collegamenti al VOSTRO display, perchè non tutti funzionano allo stesso modo. questo è per schermi hitachi HD44780 e compatibili... il mio è 20x4
ho lasciato tutta la parte decrittiva per mia comodità. voi potete anche cancellarvela... ;-);
2) dovete avere un RTC;
3) è fatta per mia esigenza, quindi ha tre stringhe per le mie 3 tipologie di led: "progfreddo" sono i 20.000°K, "progcaldo" i 10.000°K e "progblu" i royal blu.
4) la stringa alba/tramonto ha segnato sopra l'orario che va da 00 (mezzanotte) a 23 (secondo voi?) e sotto le 3 stringhe con la PERCENTUALE di luminosità di quei led che varia in 60 minuti.
perciò se dalle 9 alle 10 la stringa dei led varia da 50 a 100, significa che in un'ora raggiunge il 100%.
se volete farlo in più tempo basta che allungate i tempi (es. ore 9 50%, ore 10 75%, ore 11 100%).
tutto quello che so l'ho scritto.
ora arrangiatevi! -28
ps: chiaramente lo sketch non visualizza HELLO WORLD come scritto.... ;-)
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
const int Button1 = 0;
const int Button2 = 1;
const int LedFreddo = 9, LedCaldo = 10, LedBlu = 11;
int posx=0,posy=1;
LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
String MenuArray[5][5]={{"Titolo 1" ,"Titolo 2" ,"Titolo 3" ,"Titolo 4" ,"Titolo 5"},
{"Submenu 1 1","Submenu 2 1","Submenu 3 1","Submenu 4 1","Submenu 5 1"},
{"Submenu 1 2","Submenu 2 2","Submenu 3 2","Submenu 4 2","Submenu 5 2"},
{"Submenu 1 3","Submenu 2 3","Submenu 3 3","Submenu 4 3","Submenu 5 3"},
{"Submenu 1 4","Submenu 2 4","Submenu 3 4","Submenu 4 4","Submenu 5 4"} } ;
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
const int ProgFreddo[24]={ 0, 0, 0, 0, 0, 1, 5, 30, 70,100,100,100,100,100,100,100,100,100, 40, 20, 10, 0, 0, 0};
const int ProgCaldo[24]= { 0, 0, 0, 0, 0, 0, 0, 3, 30, 70,100,100,100,100,100, 70,100,100,100, 70, 0, 0, 0, 0};
const int ProgBlu[24]= { 4, 4, 4, 4, 4, 6, 15, 30, 50, 70,100,100, 80, 50, 50,100,100,100,100,100,100, 50, 4, 4};
int OutFreddo, OutCaldo, OutBlu;
void setup() {
Serial.begin(9600);
pinMode(Button1, INPUT);
pinMode(Button2, INPUT);
pinMode(LedFreddo, OUTPUT);
pinMode(LedCaldo, OUTPUT);
pinMode(LedBlu, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(20, 4);
// Print a message to the LCD.
setSyncProvider(RTC.get); // the function to get the time from the RTC
}
void loop() {
int i;
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
CalcolaLed();
VisualizzaOra();
delay(1000);
// print the number of seconds since reset:
lcd.clear();
}
void DisplayMenu() {
if (!digitalRead(Button1)==HIGH) {
posx++;
if (posx>4) posx=0;
}
if (!digitalRead(Button2)==HIGH) {
posy++;
if (posy>4) posy=1;
}
lcd.setCursor(4,2) ;
lcd.print(MenuArray[0][posx]);
lcd.setCursor(4,3) ;
lcd.print(MenuArray[posy][posx]);
}
void VisualizzaOra(){
lcd.setCursor(12,0);
if (hour()<10) lcd.print("0");
lcd.print(hour());
lcd.print(":");
if (minute()<10) lcd.print("0");
lcd.print(minute());
lcd.print(":");
if (second()<10) lcd.print("0");
lcd.print(second());
}
void CalcolaLed() {
int OraAttuale, OraFutura, Minuto, Differenza;
float Incremento, Attuale, T1;
OraAttuale= hour()%24;
OraFutura = (OraAttuale+1)%24;
Minuto=minute();
//---------------------------------------------------------------------------
Differenza=ProgFreddo[OraFutura]-ProgFreddo[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgFreddo[OraAttuale];
OutFreddo= Attuale * 255 / 100 ;
lcd.setCursor(0,0);
lcd.print("F:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
Differenza=ProgCaldo[OraFutura]-ProgCaldo[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgCaldo[OraAttuale];
OutCaldo= Attuale * 255 / 100 ;
lcd.setCursor(0,1);
lcd.print("C:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
Differenza=ProgBlu[OraFutura]-ProgBlu[OraAttuale];
Incremento=Differenza/60.0;
Attuale=Incremento*Minuto+ProgBlu[OraAttuale];
OutBlu= Attuale * 255 / 100 ;
lcd.setCursor(0,2);
lcd.print("B:");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
analogWrite(LedFreddo, OutFreddo);
analogWrite(LedCaldo, OutCaldo);
analogWrite(LedBlu, OutBlu);
T1=analogRead(A0)*0.49;
lcd.setCursor(0,3);
lcd.print("T:");
lcd.print((int)T1);
}
pps: io ho usato mosfet per il pwm.
ppps: qua non me lo incolonna giusto, penso che nel programma di arduino lo faccia...
pppps: prima di dire che non funziona, controllate BENE i vostri collegamenti... -28
Buonasera,
ho provato lo sketch e funziona, ma non capisco come collegare i pulsanti per accedere al menu da display. Mi potresti aiutare?
grazie in anticipo
vBulletin® v3.8.9, Copyright ©: 2000-2025, Jelsoft Enterprises Ltd.
Traduzione italiana Team: vBulletin-italia.it |