problema a far rimanere data e ora corretta su rtc

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);
}

void loop() {

 {
 tDataOra *D = new tDataOra();
 if (getDateTime(D))
 {
     printLongDateTime(D);
     printShortDateTime(D);
 }
 else
    Serial.println("Errore di lettura Data/ora");
 delay(1000);
}
 
 
 
 
 
 // prendo ora attuale
 DateTime now = RTC.now();
 sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
 lcd.setCursor(0,0);
 lcd.print( buffer1 );
 
 sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
 lcd.setCursor(0,1);
 lcd.print( buffer2 );
 Serial.println(buffer1);
 Serial.println(buffer2);

 // Richiesta temperatura
sensors.requestTemperatures(); // Comando per misurare la temp.
 temp0 = sensors.getTempCByIndex(0);
 lcd.setCursor(0,2); // Colonna 0, Riga 0
 lcd.print("acqua:");
 lcd.setCursor (6, 2);
 lcd.print(temp0);
 
 temp1 = sensors.getTempCByIndex(1);
 lcd.setCursor (0,3); //Colonna 0, Riga 1
 lcd.print("plafo:");
 lcd.setCursor (6,3);
 lcd.print(temp1);
 
 
 
//PLAFONIERA =TEMP1 vetole 
 
 if (temp1 > tempSoglia - 0.2 and - 0.6 ) {
   digitalWrite(VENTOLA, LOW);
 }
 if (temp1  < tempSoglia + 0.2 and + 0.6) {
   digitalWrite(VENTOLA, HIGH);
   }

// ventola tangenziale 
 
  if (temp0 > alertacqua - 0.1 and - 0.6) {
   digitalWrite(TANG, LOW);
  }
  if (temp0 < alertacqua + 0.1 and + 0.6) {
 digitalWrite(TANG, HIGH);
  }
// riscaldatore 

if (temp0> riscaldatore + 1.0 and  +4.0 ) {
 digitalWrite (RISC, LOW);
}

if (temp0< riscaldatore - 1.0 and  - 4.0 ){
digitalWrite (RISC, HIGH);

}


 // Calcolo inizio alba in secondi
 albas = oraAlba * 3600 + minAlba * 60;

 // Calcolo inizio tramonto in secondi
 tramontos = oraTramonto * 3600 + minTramonto * 60;


 // Calcolo attuale in secondi
 nows = now.hour() * 3600 + now.minute() * 60 + now.second();


 // Notte
 if (nows < albas || nows > tramontos + durataTramontos) {
   
   digitalWrite(pinR, LOW);
   digitalWrite(pinG, LOW);
   digitalWrite(pinB, LOW);
   digitalWrite(pinUV, LOW);
   digitalWrite(pinW, LOW);
   
   digitalWrite(NOTTE, HIGH);
   digitalWrite(PUMP, LOW);
   digitalWrite(PUMP1, HIGH);

}

 // Alba
 if (nows > albas && nows + delayR < albas + durataAlbas) {
   analogWrite(pinR, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayR)));
 }
 if (nows > albas && nows + delayG < albas + durataAlbas) {
   analogWrite(pinG, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayG)));
 }
 if (nows > albas && nows + delayB < albas + durataAlbas) {
   analogWrite(pinB, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayB)));
 }
 if (nows > albas && nows + delayUV < albas + durataAlbas) {
   analogWrite(pinUV, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayUV)));
 }
 if (nows > albas && nows + delayW < albas + durataAlbas) {
   analogWrite(pinW, 65 * (float)(((albas + durataAlbas) - nows) / (durataAlbas - delayW)));
 }

 // Giorno
 
 if ( temp1 > alertplafo + 0.2 && + 0.6 ) 
 {  
   digitalWrite(pinR, HIGH);
   digitalWrite(pinG, HIGH);
   digitalWrite(pinB, HIGH);
   digitalWrite(pinUV, HIGH);
   digitalWrite(pinW, HIGH);
   digitalWrite(PUMP,HIGH);
   digitalWrite (PUMP1,LOW);

}


  else if (nows > albas + durataAlbas && nows < tramontos)
{
  digitalWrite(pinR, LOW);
  digitalWrite(pinG, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinUV, LOW);
  digitalWrite(pinW, LOW);
  digitalWrite(PUMP,HIGH);
  digitalWrite (NOTTE,LOW);
}
   
 

 
 // Tramonto
 if (nows > tramontos && nows + delayR < tramontos + durataTramontos) {
   int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayR)));
   analogWrite(pinR, v);
 }
 if (nows > tramontos && nows + delayG < tramontos + durataTramontos) {
   int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayG)));
   analogWrite(pinG, v);
 }
 if (nows > tramontos && nows + delayB < tramontos + durataTramontos) {
   int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayB)));
   analogWrite(pinB, v);
 }
 if (nows > tramontos && nows + delayUV < tramontos + durataTramontos) {
   int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayUV)));
   analogWrite(pinUV, v);
 }
 if (nows > tramontos && nows + delayW < tramontos + durataTramontos) {
   int v = 65 - (65 * (float)(((tramontos + durataTramontos) - nows) / (durataTramontos - delayW)));
   analogWrite(pinW, v);
 }

 }

ma mi da qualche problema cosa posso fare?

Perché non usi i CODE TAG (icona </>) per racciudere lo skech e fare cosí la discussione piú leggibile?
lo sai fare perché lo hai giá fatto. Per favore modifica gli ultimi post.
Grazie ciao Uwe

ecco scusatemi non mi ero accorto, quindi come posso fare a ovviare al problema?

Buongiorno nessuno sa aiutarmi perfavore grazie in anticipo

Nessuno sa aiutarmi?

marco3020:
ma lo devo riadattare al mio come faccio? se lo metto insieme al mio codice attuale non funziona manco el luci vanno mi dice manca rtc

Il mio sospetto/ipotesi è che ci sia un problema elettrico visto che sul bus I2C hai il display LCD e l'RTC e anche il sensore di temperatura. Ti confesso che non ho mai fatto funzionare più dispositivi sullo stesso bus per cui su quel lato non ti posso aiutare.

ma come potrei riadattarlo al mio sketch ?

Buon pomeriggio a tutti voglio fare un ultima prova e voglio provare a impostare data e ora su lcd con i pulsanti qualcuno mi spiega come fare? se ci vogliono resistenze o no grz

Buongiorno sto utilizzando questo sketc: hhttp://www.mauroalfieri.it/elettronica/rtc-shield-ds1307-impostare-data-e-ora.html. Vedo LCD illuminarsi ma non visualizzo niente, cosa posso fare?

Buona sera oggi ho provato a far andare rtc staccando i rele e da stesso errore lo cambio e vi aggiorno

Io sto utilizzando un modulo SD con RTC incluso . Quando mi è arrivato la parte RTC non funzionava così ho sostituito il ds1307 con uno nuovo ed ho risolto il problema .
Ho notato che l'orario usa "sballarsi" quando c'è un corto sulla batteria . controlla con un tester di non avere corti sulla linea della batteria o sul quarzo

E come controllo i corti sul quarzo?

Controlla se la frequenza è stabile e combacia con il valore del quarzo con un frequenzimetro

Oggi è arrivato il ds3231 la procedura è la stessa del ds1307?

Buongiorno a tutti ho collegato il ds3231 e funziona bene ma lo devo riadattare epr il mio sketch in quanto mi dice data time no non è una sua funzione, e poi che mi spiega qualcuno gentilmente come far si che quando alertplafo supera un range le luci si spengono g ecco sketch grazie infinite :

#include <Time.h>
#include <DS3232RTC.h>
#include <PCF8574_HD44780_I2C.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

IPAddress ip( 192,168,1,6 );
IPAddress gateway( 192,168,1,1 );
IPAddress subnet( 255,255,255,0 );

EthernetServer server(80);

RTC_Millis RTC;

//RTC_DS3231 RTC;

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; 
int rele4 = 41;
int rele5 = 43;
int rele6 = 45;

char buffer1[20];
char buffer2[20];

float riscaldatore = 22.0; // allerta temperatura acqua bassa 
float alertacqua = 27.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 SKIM 39
#define PUMP 41
#define NOTTE 43
#define RISC 45

void setup()
{

Serial.begin(9600);
  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  lcd.init();           // LCD Initialization
  lcd.backlight( );      // Backlight ON
  lcd.clear();          // Clear the display

  numberOfDevices = 1;

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  
  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(SKIM, OUTPUT);
  pinMode(PUMP, OUTPUT);
  pinMode(NOTTE, 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);

}

void loop() 
{

    if (millis() > 500000)
    {
    digitalWrite(SKIM, HIGH);
    }
  
  
  // prendo ora attuale
  DateTime now = RTC.now();
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(0,0);
  lcd.print( buffer1 );
  
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,1);
  lcd.print( buffer2 );
  Serial.println(buffer1);
  Serial.println(buffer2);

problema risolto cosi: mettendo data time= RTC.get();

ora funziona tutto, grazie mille

Hai incluso 2 volte la libreria Wire .
Se hai risolto modifica il titolo del topic mettendo [ RISOLTO ] davnti