questo è il mio attuale :
#define DS1307_ADDRESS 0x68
#include <PCF8574_HD44780_I2C.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
//RTC_Millis RTC;
RTC_DS1307 RTC;
byte zero = 0x00;
struct tDataOra
{
byte second; //0-59
byte minute; //0-59
byte hour; //0-23
byte weekDay; //1-7
byte monthDay; //1-31
byte month; //1-12
byte year; //0-99
};
// Converte dalla notazione BCD alla notazione in base 10
byte bcdToDec(byte val)
{
// val % 16 => corrisponde ai 4 bit a destra di un byte
// (val - val % 16)/ 16 => corrisponde ai 4 bit a sinistra di un byte
// ovvero a shiftare verso destra di 4 bit quindi
// (val-val%16)/16 equivale a val >> 4
return ( (val-val%16)/16*10 + val%16 );
}
boolean getDateTime(void *V)
{
tDataOra *D=(tDataOra *)V;
// inizializzo la trasmissione partendo
// dall'indirizzo 0x00
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
// requestFrom e' utilizzato dal master per richiedere
// n byte alle device slave. In questo caso ne richiede
// 7 bytes alla device con l'indirizzo indicato
// il DS1307 utilizza 56 bit (7byte) per registrare la data/ora
Wire.requestFrom(DS1307_ADDRESS, 7);
if (Wire.available())
{
D->second = bcdToDec(Wire.read());
D->minute = bcdToDec(Wire.read());
D->hour = bcdToDec(Wire.read() & 0b111111); // modo 24 ore
// considero i primi 6 bit
D->weekDay = Wire.read(); // non mi serve convertire (Range da 1 a 7 => 3 bit)
D->monthDay = bcdToDec(Wire.read());
D->month = bcdToDec(Wire.read());
D->year = bcdToDec(Wire.read());
return true;
}
return false;
}
void printShortDateTime(void *V)
{
char buffer[25]={'\0'};
tDataOra *D=(tDataOra *)V;
sprintf(buffer, "%02d/%02d/20%02d %02d:%02d:%02d",
D->monthDay,D->month,D->year,
D->hour, D->minute, D->second);
Serial.println(buffer);
}
void printLongDateTime(void *V)
{
const char* days[] = { "Domenica", "Lunedi'", "Martedi'", "Mercoledi'",
"Giovedi'", "Venerdi'", "Sabato" };
const char* months[] = { "Gennaio", "Febbraio", "Marzo", "Aprile",
"Maggio", "Giugno", "Luglio", "Agosto",
"Settembre", "Ottobre", "Novembre", "Dicembre"};
char buffer[40]={'\0'};
tDataOra *D=(tDataOra *)V;
sprintf(buffer, "%s, %u %s 20%2u %02u:%02u:%02u",
days[D->weekDay-1], D->monthDay, months[D->month-1],D->year,
D->hour, D->minute, D->second);
Serial.println(buffer);
}
PCF8574_HD44780_I2C lcd(0x3F, 20, 4);
int oraAlba = 9;
int minAlba = 10;
long albas;
int durataAlbas = 720;
int oraTramonto = 17;
int minTramonto = 10;
long tramontos;
int durataTramontos = 720;
long nows;
int delayR = 0;
int delayG = 120;
int delayB = 240;
int delayUV = 360;
int delayW = 360;
int pinR = 2;
int pinG = 3;
int pinB = 4;
int pinW = 5;
int pinUV = 6;
//rele
float rele1 = 35;
float rele2 = 37;
int rele3 = 39;
float rele4 = 41;
int rele5 = 43;
char buffer1[20];
char buffer2[20];
float riscaldatore = 22.0; // allerta temperatura acqua bassa
float alertacqua = 26.0; // ventola tangenziale
float alertplafo = 44.0; // alerta plafoniera temperatura troppo alta
float tempSoglia = 38.0; //temperatura ventole plafo
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address;
float temp0=0;
float temp1=0;
int numberOfDevices;
#define VENTOLA 35
#define TANG 37
#define NOTTE 39
#define PUMP 41
#define PUMP1 43
#define RISC 45
void setup()
{
lcd.init(); // LCD Initialization
lcd.backlight( ); // Backlight ON
lcd.clear(); // Clear the display
numberOfDevices = 1;
Serial.begin(9600);
Wire.begin();
sensors.begin();
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinW, OUTPUT);
pinMode(pinUV, OUTPUT);
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
pinMode(rele5, OUTPUT);
pinMode(VENTOLA, OUTPUT);
pinMode(TANG, OUTPUT);
pinMode(RISC, OUTPUT);
pinMode(NOTTE, OUTPUT);
pinMode(PUMP, OUTPUT);
pinMode(PUMP1, OUTPUT);
digitalWrite( rele1, LOW );
digitalWrite( rele2, LOW );
digitalWrite( rele3, LOW );
digitalWrite( rele4, LOW );
digitalWrite(rele5, LOW);
///////////////////////////// SETTAGGIO ORA ////////////////////////////////////
/*
Come settare correttamente ora:
1) compilare lo sketch con quella riga , a) oppure b)
2) flashare l'Arduino con quello sketch, in modo che lo sketch regoli l'RTC
3) ricompilare lo sketch SENZA quella riga
4) riflashare l'Arduino con il nuovo sketch
Ora puoi fare tutti gli stacchi che vuoi e l'RTC andrà per conto suo correttamente.*/
RTC.adjust(DateTime(__DATE__, __TIME__)); // settaggio ora automatico b)
//RTC.begin(DateTime(__DATE__, __TIME__));
///////////////////////////////////////////////////////////////////////////////////
delay(3000);
}