RTC modulo DS1307 - Problema visualizzazione data e ora

Buongiorno a tutti,
ho acquistato un modulo RTC Ds1307, l'ho collegato ad arduino utilizzando la configurazione standard.
Per testarne il funzionamento ho utilizzato lo sketch di esempio presente nella libreria RTClib.
Lo sketch viene caricato correttamente, ma sul monitor seriale compaiono caratteri illeggibili.
Vi è mai capitato un errore simile?
grazie e speriamo che qualcuno sappia aiutarmi :)))))

Allego uno screenshot…

La velocità del monitor seriale, tu ce l'hai a 9600, devi metterla uguale al programma, 56700.

Grazie perfetto, funziona tutto.
Posso chiederti un consiglio?
Sto lavorando per un progetto sul controllo dell'irrigazione tramite sensore igrometrico dfrobot.

Il modulo RTC lo vorrei utilizzare per temporizzare le letture del sensore e le varie azioni da compiere al raggiungimento di soglie impostate.

Es. vorrei che ogni ora venisse eseguita una funzione void irrigazione().
sapete suggerirmi uno sketch di esempio?
Tenendo conto che ho installato le librerie RTC.lib e time.h

Grazieeeee

Se usi quelle librerie mi pare ci siano esempi, basta che prendi la versione di Adafruit.
Negli esempi, la prima cosa è leggere il valore del rtc:
DateTime now = rtc.now();
Ora con now.hour(), now.minute() e now.second() conosci le 3 parti dell'orario.
Conviene lavorare con delle variabili long in cui metti tutte e 3 le info
long curr= now.hour()*10000+now.minute()*100+now.second();
supponiamo che l'ora sia 13:22:54 curr conterrà il numero 132254 ovvero 130000+2200+54
Questo può semplificare i controlli, esempio

void loop()
{ DateTime now = rtc.now();
  long curr= now.hour()*10000+now.minute()*100+now.second();  
  if( curr>=123000)      // se ora corrente maggiore di mezzogiorno e mezzo
  { digitalWrite(13,HIGH);   // accendo led
  }
...
}

Buonasera,
grazie per la risposta celere.
Mi sembra perfetto per impostare ciò di cui avrei bisogno.
Ho provato a fare un test e allego lo screenshot.
Come mai non ha stampato il valore ECCOMIII sul serial?
:slight_smile: :slight_smile:
idee?

appena torno dall’ufficio provo con un led collegato.

Prova a stampare curr, forse devi moltiplicare le ore per 10000, non per 1000.

Il codice postalo e mettilo nei tag code (come da regolamento) perchè in uno screenshot non si vede nulla.
Il codice DEVI racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

18 * 1000 = 18000
53 * 100 = 5300
18000 +
. 5300 =
23300
A cui aggiungi i secondi.
Non può funzionare.
18 * 10000 = 180000
53 * 100 = 5300
180000+
. . 5300=
185300
Deve moltiplicare per 10000, non cambia niente se toglie o mette delay.

Si, non avevo visto che c'erano pochi 0, deve moltiplicare per 10000. Scusate, sò cecato.

nid69ita:
... Ora con now.hour(), now.minute() e now.second() conosci le 3 parti dell'orario.
Conviene lavorare con delle variabili long in cui metti tutte e 3 le info
long curr= now.hour()*10000+now.minute()*100+now.second();
supponiamo che l'ora sia 13:22:54 curr conterrà il numero 132254 ovvero 130000+2200+54

Ma a voi lavorare con gli STANDARD che si usano in tutto il mondo fa proprio schifo? Dovete ogni volta invetarvi dei metodi che spesso non stanno né in cielo né in terra? Portare TUTTO in SECONDI, come si fa di solito (vd. Unix Time) no ?

ore * 3600 + minuti * 60 + secondi ... e fai tutte le operazioni e confronti che vuoi, non solo, quasi tutte le librerie Arduino che trattano gli RTC hanno già le funzioni per fare dette conversioni, quindi ... perché ogni volta reinventate l'acqua calda ? ? ? :o :o :o

Guglielmo

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

RTC_DS1307 RTC;
 
void setup () {
 
  Serial.begin(9600); 
  pinMode (2, OUTPUT);

    Wire.begin();
    RTC.begin();
 
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}
 
void loop () {
    DateTime now = RTC.now();
  
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

  long curr= now.hour()*10000+now.minute()*100+now.second(); 
  if( curr>=93100)     
  
{
    digitalWrite(2,HIGH);
    Serial.print('ACCESO');
  delay(4000);
   
} 
    delay(3000);
}

Purtroppo non va neanche così.

L’acqua calda è sempre piacevole da riscoprire :slight_smile:

Guglielmo puoi postare un esempio di come faresti?

Voi chi?
Ho solo cercato di capire perché il codice scritto da bisiareddu non funzionava, comunque hai ragione. 8)

vinsub:
Voi chi?

Difatti ho quotato Nid (… e va incluso anche bisiareddu) :smiley: :smiley: :smiley: :smiley:

Guglielmo

Chiedo scusa Guglielmo se dico "fesserie" ma non è da molto che lavoro con Arduino, so solo che tra me e quella piccola schedina è nato un amore :slight_smile:

Quindi se puoi ILLUMINARMI per fare questa semplice operazione ti sarei grato.

bisiareddu:
Guglielmo puoi postare un esempio di come faresti?

Decidi l’ora e i minuti a cui devi fare quello che devi fare (… se non ti serve la precisione al secondo li puoi anche trascurare, altrimenti nel calcolo includi anche quelli), calcoli il valore equivalente in secondi e semplicemente compari il valore calcolato in tempo reale nel loop() con il valore calcolato di tuo interesse.

In realtà io calcolerei due valori, valore inizio e valore fine e farei le due comparazioni per iniziare e terminare quello che devi fare.

Guglielmo

P.S.: Ora devo andare via, vedi intanto se riesci ad implementarlo … :wink:

gpb01:
Difatti ho quotato Nid (... e va incluso anche bisiareddu) :smiley: :smiley: :smiley: :smiley:

Guglielmo

Non ho inventato nulla. Moltiplicare per 10.000 le ore e 100 i minuti permette poi di scrivere le costanti direttamente, esempio 123000 cosa che è difficile fare se moltiplichi per 3600 e 60. Sono due tecniche arcinote. A me piace di più la prima per il motivo che cito sopra (leggibilità). Ci sono casi in cui è meglio il moltiplicare per 3600 e 60 ovvero ridurre tutto in secondi totale. Dipende da che si deve fare. :slight_smile:

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

RTC_DS1307 RTC;
 
void setup () {
 
  Serial.begin(9600); 
  pinMode (2, OUTPUT);

    Wire.begin();
    RTC.begin();
 
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    
  }
}
 
void loop () {
    DateTime now = RTC.now();
  
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
Serial.println(now.hour());
int tempo1 = (now.hour()*100+now.minute());
const int accensione1 =  1301 ;
const int spegnimento1 =  1303 ;
Serial.println(tempo1);

if (tempo1 > accensione1 && tempo1 <spegnimento1 )
{ 
  
  Serial.println('a');
  }
else{
  
  Serial.println('s');
  
  } 
  delay(4000);
  }

Ho risolto in questo modo, che ne dite?

nid69ita:
Non ho inventato nulla. Moltiplicare per 10.000 le ore e 100 i minuti permette poi di scrivere le costanti direttamente, esempio 123000 cosa che è difficile fare se moltiplichi per 3600 e 60. Sono due tecniche arcinote.

Che sia una tecnica facile e comoda ok, ma ... trovami UNA libreria standard che gestica il tempo e che usi una cosa del genere ... :smiling_imp:

Comunque, ciascuno usa quello che trova più facile usare ... ::slight_smile:

Guglielmo