RTC Shield, comportamento strano

Buonasera a tutti, è da un po' che a fasi alterne mi studio Arduino e le sue applicazioni.

Ultimamente ho costruito un controller per acquario tropicale ma invece di copiare da altri sto tentando anche a scopo didattico di fare da solo, e di imparare come si dice..." sul campo".

Ho assemblato l'apparato ma nella prima fase della programmazione è sorto un imprevisto che non capisco...

Tutto il sistema sarà controllato dall'ora e per questo il circuito è dotato di RTC shield, LCD I2C 20X4, sonda temperatura DS18b20 e sostanzialmente un banco relè.

Quando attacco l'arduino nano alla porta usb e faccio partire lo sketch tutto ok, ma se dopo avere staccato la porta usb la riattacco mi accorgo che l'ora è rimasta bloccata a quando ho asportato l'alimentazione.

Se poi invece di alimentare tramite usb, alimento il circuito tramite un trasformatore che gestirà tutto il circuito ( visto che andrà dall'acquario...) allora al posto del giorno e delle ore formato dd:mm.yyyy e hh:mm:ss viene fuori una lista di numeri tipo:
dd:mm:yyyy viene 165:165:eccetera

Io credo che ci sia qualcosa che non va con rtc shield....

Se serve copio lo sketch.ì, o le foto dell'armamentario

Grazie. :slight_smile:
Saluti

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

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

byte Centigradi[8] = {
B00010, 
B00101,
B00010,
B00000,
B00000,
B00000,
B00000,
B00000
};

byte Apice_2[8] = {
B00110,
B01001,
B00010,
B00100,
B01111,
B00000,
B00000, 
B00000
}; 
byte Freccsu[8] = {
B00100,
B01110,
B10101,
B00100,
B00100,
B11111,
B00000, 
B00000
}; 

LiquidCrystal_I2C lcd(0X27 , 20 , 4);
RTC_DS1307 RTC;

const int setpin = 6;
boolean statepin = 0;
void setup () {

  Wire.begin();
  RTC.begin();
  lcd.begin();
  lcd.createChar (0, Centigradi); // load simbolo Centigradi to memory 0
  lcd.createChar (1, Apice_2); // load 2 apice to memory 1
  lcd.createChar (2, Freccsu); // load Freccia su to memory 2

//RTC.adjust(DateTime(__DATE__, __TIME__));
  
  if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));
    Serial.println("RTC fa le bizze e scrive quel che vuole");
  }
}
void loop () {

  DateTime now = RTC.now();
  
  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  lcd.setCursor(12,0);
  lcd.print( buffer1 );
  
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,0);
  lcd.print( buffer2 );

 lcd.setCursor (0,1); //posizione Temperatura
 lcd.print("Temp:");
 //lcd.print(sensors.getTempCByIndex(0));
 lcd.print("XX,X");
 lcd.print(char(0));
 
 lcd.setCursor (12,1); //posizione Pompa
 lcd.print("POMPA:");
 lcd.print("XXX");
 
 lcd.setCursor (0,2); //posizione Co2
 lcd.print("CO");lcd.print(char(1));lcd.print(":");
 //lcd.print("d");lcd.print("ppm ");
 
 lcd.setCursor (8,2); //posizione Co2 valve
 lcd.print("FASE:");
 //lcd.print(char(1));lcd.print(" V:");lcd.print("STOP");
 
 
 lcd.setCursor (0,3); //posizione ULTIMARIGA
 lcd.print("RISC:");
 // bisogna vedere se metterlo quando è acceso
 lcd.print(char(2));
 
 
 lcd.setCursor (11,3); //posizione ULTIMARIGA
 lcd.print("LUCE:");lcd.print("XXX%");
  
  delay(1000);
}

minimo lo sketch

"165" mi è successo quando i fili del mio RTC autocostruito escono dalla breadboard o non fanno buon contatto.
Sicuro che quando vai con l'alimentatore sia alimentato anche l'RTC?

o forse perchè non hai ri-commentato la riga del codice che serve per la prima sincro del RTC con l'orario del PC...

Ecco lo sketch.
Lo RTCshield con usb attaccata produce orario corretto, oppure lo prende da un'altra parte?

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

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

byte Centigradi[8] = {
B00010,
B00101,
B00010,
B00000,
B00000,
B00000,
B00000,
B00000
};

byte Apice_2[8] = {
B00110,
B01001,
B00010,
B00100,
B01111,
B00000,
B00000,
B00000
};
byte Freccsu[8] = {
B00100,
B01110,
B10101,
B00100,
B00100,
B11111,
B00000,
B00000
};

LiquidCrystal_I2C lcd(0X27 , 20 , 4);
RTC_DS1307 RTC;

void setup () {

Wire.begin();
RTC.begin();
lcd.begin();
lcd.createChar (0, Centigradi); // load simbolo Centigradi to memory 0
lcd.createChar (1, Apice_2); // load 2 apice to memory 1
lcd.createChar (2, Freccsu); // load Freccia su to memory 2

//RTC.adjust(DateTime(DATE, TIME));

if (! RTC.isrunning()) {
RTC.adjust(DateTime(DATE, TIME));
Serial.println("RTC fa le bizze e scrive quel che vuole");
}
}
void loop () {

DateTime now = RTC.now();

sprintf(buffer1, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.setCursor(12,0);
lcd.print( buffer1 );

sprintf(buffer2, "%02d/%02d/%d", now.day(), now.month(), now.year());
lcd.setCursor(0,0);
lcd.print( buffer2 );

lcd.setCursor (0,1); //posizione Temperatura
lcd.print("Temp:");
//lcd.print(sensors.getTempCByIndex(0));
lcd.print("XX,X");
lcd.print(char(0));

lcd.setCursor (12,1); //posizione Pompa
lcd.print("POMPA:");
lcd.print("XXX");

lcd.setCursor (0,2); //posizione Co2
lcd.print("CO");lcd.print(char(1));lcd.print(":");
//lcd.print("d");lcd.print("ppm ");

lcd.setCursor (8,2); //posizione Co2 valve
lcd.print("FASE:");
//lcd.print(char(1));lcd.print(" V:");lcd.print("STOP");

lcd.setCursor (0,3); //posizione ULTIMARIGA
lcd.print("RISC:");
// bisogna vedere se metterlo quando è acceso
lcd.print(char(2));

lcd.setCursor (11,3); //posizione ULTIMARIGA
lcd.print("LUCE:");lcd.print("XXX%");

delay(1000);
}

Grazie

>Hoop: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag:

[code] _il _tuo_ codice_ [/code]

così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati. Grazie.

Guglielmo

Questa: //RTC.adjust(DateTime(DATE, TIME));

prima carica lo sketch senza commento, poi lo ricarichi con il commento. Togli la batteria al RTC prima di risincronizzarlo.

Ciao

Chiedo scusa :-[ , non rimetto tutto quanto per non allungare il post, ma la prossima volta faccio così come spiegato.

Ho fatto così per il commento prima ho fatto girare senza il commento l'adjust, poi ho lasciato adjust solo dentro il ciclo if (dove se non sta andando rtc fa l'adjust)

Hoop:
Chiedo scusa :-[ , non rimetto tutto quanto per non allungare il post, ma la prossima volta faccio così come spiegato.

Ma lo hai letto bene il mio post ? ? ? :o :o :o

Quindi fallo sul quel post e non solo la prossima volta ! Grazie.

Guglielmo

Obbedisco!

Bene, sono passati 5 giorni da quando ho chiesto una mano per capire perchè il risultato che ottenevo era differente da quanto mi aspettassi.

Ho imparato esattamente come si posta uno sketch, l'attenzione è molta su questo aspetto.

Ma in merito alla domanda che avevo fatto in verità molto poco.

Grazie lo stesso.

Sono passati anche 5 giorni da quando ti hanno fatto due ipotesi e una domanda.
Hai controllato?
Hai risposto?

Hoop:
Obbedisco!

Quando? Dopodomani?

uwefed:
Quando? Dopodomani?

... non solo, aggiungo che, sino a quando il post #4 NON sarà sistemato, nel rispetto del regolamento, NON saranno tollerati altri post (... che verranno, senza ulteriori preavvisi, cancellati).

Guglielmo