problema con RTC

Sera a tutti

dunque abbandonato per il momento il WIFI perchè non sono ancora in grado,mi sono messo con qualkosa di piu piccolo…l’RTC.

Montato scaricato la libreria di leonardo miliani “#include <swRTC.h>”…funziona perfettamente anche se non trovo un link con tutti i comandi…gia risolto da solo piccoli problemucci per leggere l’ora con LCD.

Ma una cosa non mi è chiara…
Come faccio a mantenere l’ora e la data se levo corrente???siccome ha una batteria a tampone a qualkosa dovrà pure servire??? >:( >:(

Metti il programma che c’hai caricato che … già immagino cosa c’è … ::slight_smile:

Guglielmo

#include <core_build_options.h>
#include <swRTC.h>
swRTC rtc; //create a new istance of the lib

//variabili per loop LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(22,23,24,25,26,27);//dichiaro  pin utilizzato

void setup()
{
 Serial.begin(9600);//velocita Serial Monitor 

 lcd.begin(16,2);//LCD  
 analogWrite(2,100);//LCD
      
 rtc.stopRTC(); //RTC
 rtc.setTime(19,51,0); //RTC
 rtc.setDate(19,03,2018); //RTC
 rtc.startRTC(); //RTC  
}

void  LCD_RTC()
{
  if(rtc.getSeconds()==0)
    {  
     lcd.setCursor(7,0);
     lcd.print(" ");
    }
  lcd.setCursor(0,0); 
  lcd.print(rtc.getHours(), DEC);
  lcd.print(":");
  lcd.print(rtc.getMinutes(), DEC);
  lcd.print(":");
  lcd.print(rtc.getSeconds(), DEC);

  lcd.setCursor(0,1);
  lcd.print(rtc.getDay(), DEC);
  lcd.print("/");
  lcd.print(rtc.getMonth(), DEC);
  lcd.print("/");
  lcd.print(rtc.getYear(), DEC);
 }
 
void loop()

{
 LCD_RTC();
}

E se nel setup(), dopo la prima volta, non elimini le righe che rimettono sempre la stessa ora ... ... come pretendi che l'orologio vada avanti ? ? ? :o

Dopo la prima volta, in cui imposti data e ora esatta, devi ricaricare il codice SENZA le righe:

rtc.stopRTC(); //RTC
rtc.setTime(19,51,0); //RTC
rtc.setDate(19,03,2018); //RTC

Guglielmo

era la prima cosa che era venuta in mente pure a me,ma ho già provato… se lo tolgo dal setup e ricarico ,mi da tutti i valori a Zero.

Ma ... aspetta un'attimo ... dove hai letto che quella libreria sia per un RTC esterno ? ? ?

La swRTC serve a creare un RTC software e NON ad usare il tuo RTC HW !!! Leggiti la descrizione QUI !

Che RTC hai comprato ? ? ?

Guglielmo

Ds3231 RTC Module...era compreso nel kit quando ho speso i miei primi 70 euro per la scheda

la batteria era gia integrata ...col tester la vedo carica(non credo sia colpa della batteria).

No infatti, t’ho detto che hai SBAGLIATO libreria ! la swRTC NON va bene.

Vai nell’IDE, nel gestore delle librerie e cerca DS3231 … troverai “DS3231 di Andrew Wickert” … installala e usa uno degli esempi allegati alla liberia.

Puoi usare prima l’esempio che fa il set e poi quello che fa il test.

Guglielmo

ok domani ci riprovo Grazie per il momento

fatto ma non riesco ancora a settarlo,immagino si faccia dal serial monitor ho ancora problemi.
qui l’esempio con le righe che non capisco

#include <DS3231.h>
#include <Wire.h>

DS3231 Clock;

byte Year;
byte Month;
byte Date;
byte DoW;//?????????????
byte Hour;
byte Minute;
byte Second;

void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, //???????????????????????
		byte& Hour, byte& Minute, byte& Second) {
	// Call this if you notice something coming in on 
	// the serial port. The stuff coming in should be in 
	// the order YYMMDDwHHMMSS, with an 'x' at the end.
	boolean GotString = false;
	char InChar;
	byte Temp1, Temp2;
	char InString[20];

	byte j=0;
	while (!GotString) {
		if (Serial.available()) {
			InChar = Serial.read();
			InString[j] = InChar;
			j += 1;
			if (InChar == 'x') {
				GotString = true;
			}
		}
	}
	Serial.println(InString);
	// Read Year first
	Temp1 = (byte)InString[0] -48;
	Temp2 = (byte)InString[1] -48;
	Year = Temp1*10 + Temp2;
	// now month
	Temp1 = (byte)InString[2] -48;
	Temp2 = (byte)InString[3] -48;
	Month = Temp1*10 + Temp2;
	// now date
	Temp1 = (byte)InString[4] -48;
	Temp2 = (byte)InString[5] -48;
	Day = Temp1*10 + Temp2;
	// now Day of Week
	DoW = (byte)InString[6] - 48;		
	// now Hour
	Temp1 = (byte)InString[7] -48;
	Temp2 = (byte)InString[8] -48;
	Hour = Temp1*10 + Temp2;
	// now Minute
	Temp1 = (byte)InString[9] -48;
	Temp2 = (byte)InString[10] -48;
	Minute = Temp1*10 + Temp2;
	// now Second
	Temp1 = (byte)InString[11] -48;
	Temp2 = (byte)InString[12] -48;
	Second = Temp1*10 + Temp2;
}

void setup() {
	// Start the serial port
	Serial.begin(9600);

	// Start the I2C interface
	Wire.begin();
}

void loop() {

	// If something is coming in on the serial line, it's
	// a time correction so set the clock accordingly.
	if (Serial.available()) {
		GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second);

		Clock.setClockMode(false);	// set to 24h
		//setClockMode(true);	// set to 12h

		Clock.setYear(Year);
		Clock.setMonth(Month);
		Clock.setDate(Date);
		Clock.setDoW(DoW);
		Clock.setHour(Hour);
		Clock.setMinute(Minute);
		Clock.setSecond(Second);

in pratica quasi tutte,ma in particolare quelle col punto interrogativo

DoW sta per Day of Week ovvero il “numero del giorno” della settimana. Considera che, come da datasheet, si parte da domenica, quindi domenica = 1, lunedì = 2, martedì = 3, …

Come è chiaramente scritto nel commento della funzione che legge dalla seriale, devi inviare una stringa dal, dal monitor seriale, fatta così:

YYMMDDwHHMMSSx

dove, in questo momento:

YY è l’anno = 18, MM è il mese = 03, DD è il giorno = 20, w è il giorno della settimana = 3, HH sono le ore = 20, MM sono i minuti = 01 e SS sono i secondi = 50 il tutto deve terminare con una x minuscola, da cui:

1803203200150x

Ti consiglio di impostare il monitor seriale in modo da inviare tutta la stringa quando premi CR (in basso a destra).

Guglielmo

Fatto ora funziona grazie Guglielmo

Ho notato una cosa spostando la lettura su LCD, i secondi occupano 4 spazi in totale,mi spiego meglio,dietro ai secondi appaiono a dei simboli strani (che ho gia fatto sparire con un semplice lcd.print(" ");)…ma cosa sono???

Sicuramente hai usato lcd.println()

si infatti ho solo sostituito la scritta serial. con la scritta lcd.

ora che l'ho tolta il simboli sono spariti...puoi spiegarmelo?????

Perchè se usi println invece di print, aggiunge due caratteri, che corrispondono al a capo e al return

ok grazie
un altra cosa dove posso trovare la lista dei comandi che posso utilizzare con questa libreria???

mi sto accorgendo che alcuni comandi base tipo => || =< non me li compila

ok sono a buon punto,ho fatto molte modifiche per il mio schect........ma addentrandomi negli esempi non ho capito questa riga" Serial.print(now.unixtime() / 86400L);" a cosa serve L????

now.unixtime() ritorna il tempo UNIX che è un numero a 32 bit che rappresenta i "secondi" a partire da una data fissa. E' molto comodo per fare "operazioni" (sommare, sottrarre, confrontare, ecc).

Prendere now.unixtime() e dividerlo per 86400 (che sono i secondi in un giorno) significa avere il valore in "giorni" invece che in secondi.

La 'L' dopo il numero serve ad indicare il tipo di 86400 ovvero un long. Sarebbe stato più corretto mettere 'UL' (ovvero unsigned long) visto che unixtime è sempre positivo.

Guglielmo

questa parte l'avevo già capita...parte dal 1\1\1970.....infatti avevo già fatto una riga per vedere gli anni trascorsi da quella data"Serial.println(now.unixtime()/60/60/24/365); "tolto il 365 l'ho confrontata con la riga"" Serial.print(now.unixtime() / 86400L);" ed ho visto che combaciano quindi ho capito il meccanismo.......solo che non ho capito quella "L"...a cosa serve.