//3231 RTC //VARIABILI
#include <Wire.h> //LIBRERIA
#include <RTClib.h> //LIBRERIA
RTC_DS3231 RTC;
void DS3231_RTC()
{
DateTime now=RTC.now();
if(now.hour()<=9){Serial.print("0");Serial.print(now.hour(),DEC);Serial.print(":");}
if(now.hour()>=10){Serial.print(now.hour(),DEC);Serial.print(":");}
if(now.minute()<=9){Serial.print("0");Serial.print(now.minute(),DEC);Serial.print(":");}
if(now.minute()>=10){Serial.print(now.minute(),DEC);Serial.print(":");}
if(now.second()<=9){Serial.print("0");Serial.print(now.second(),DEC);Serial.print(":");}
if(now.second()>=10){Serial.print(now.second(),DEC);Serial.println("");}
void setup()
{
Serial.begin(9600); /*SERIALE MONITOR*/
Wire.begin();
if(RTC.lostPower())
{
RTC.adjust(DateTime(F(__DATE__),F(__TIME__)));
}
}
void loop()
{
DS3231_RTC();
}
} or paste code here
Salve a tutti ho un nuovo problema.....sto provando da alcuni giorni a far funzionare un RTC DS3231....arduino compila...ma vedo numeri fissi come se non se il settaggio di inizio ORA_DATA non sia aggiornato.....sil serial monitor mi appare sempre 165:165:85.....sembra sia a fondoscala.
Prova questo:
/************** Funziona ******************
* DS3231_R_W.ini
* 27 marzo 2019
* Arduino NANO o UNO
* UNO = SDA pin23(A4), SCL pin24(A5)
* NANO = SDA pin
* Legge o scrive data e ora
* Derivato da DS3231_R_Mod.ini
*
* Inserito giorno della settimana
********************************************/
#include <Wire.h>
#include <DS3231.h>
#define DS3231_I2C_ID 0x68
struct{
byte Second = 30;
byte Minute = 33;
byte Hour = 22;
byte W_day = 1; // giorno della settimana
byte M_day = 11;
byte Month = 4;
byte Year = 22;
} now;
RTCDateTime dt;
DS3231 clock;
void setup() {
Serial.begin(9600);
Wire.begin();
//aggiornaRTC();
}
void loop() {
readDate();
Serial.print(" ");
Serial.print(clock.readTemperature(),0);
Serial.println("°C");
Serial.println("");
delay(5000);
}
void readDate() {
Wire.beginTransmission(DS3231_I2C_ID);
Wire.write(0x0);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ID, 7); // get 7 bytes
byte Second = bcd2dec(Wire.read() & 0b1111111);
byte Minute = bcd2dec(Wire.read() & 0b1111111);
byte Hour = bcd2dec(Wire.read() & 0b00111111);
byte WeekDay = bcd2dec(Wire.read()); // 1=Domenica
byte Day = bcd2dec(Wire.read());
byte Month = bcd2dec(Wire.read());
byte Year = bcd2dec(Wire.read());
Serial.print(" ");
switch(WeekDay){
case 1:
Serial.print("Domenica");
break;
case 2:
Serial.print("Lunedì");
break;
case 3:
Serial.print("Martedì");
break;
case 4:
Serial.print("Mercoledì");
break;
case 5:
Serial.print("Giovdì");
break;
case 6:
Serial.print("Venerdì");
break;
case 7:
Serial.print("Sabato");
break;
}
Serial.print(" ");
Serial.print(Day);
Serial.print("/");
Serial.print(Month);
Serial.print("/20");
Serial.print(Year);
Serial.print(" ");
Serial.print(Hour);
Serial.print(":");
Serial.print(Minute);
Serial.print(":");
if (Second < 10) Serial.print("0");
Serial.print(Second);
}
void aggiornaRTC(){
// Imposta l'orario
Wire.beginTransmission(DS3231_I2C_ID);
Wire.write(0x0); // punta al registro 0
Wire.write(0x0); // azzera i secondi
Wire.write(bin2BCD(now.Minute));
Wire.write(bin2BCD(now.Hour));
Wire.endTransmission();
// Imposta la data
Wire.beginTransmission(DS3231_I2C_ID);
Wire.write(0x3); // punta al registro 3
Wire.write(now.W_day);
Wire.write(bin2BCD(now.M_day));
Wire.write(bin2BCD(now.Month));
Wire.write(bin2BCD(now.Year));
Wire.endTransmission();
}
// Convert binary coded decimal (BCD) to normal decimal numbers
byte bcd2dec(byte val) {
return ((val/16*10) + (val%16));
}
byte bin2BCD(byte n){
return ((n / 10) << 4) | (n % 10);
}
Saluti
LelloGi
Grazie LelloGi
ho fatto alcune prove prove credo che in realtà sia un problema Hardware....probabilmente ho stagnato male qualche pista....infatti mi da sempre che RTC non sta comunicando...domani mi procuro un tester e verifico le saldature.
rtc prima va in inizializzato
if (! rtc.begin()) { } se da esito "positivo" devi trovare il perche non viene rilevato
poi deve essere "regolato" e deve avere la pila se no tutte le volte che lo riaccendi è un casino
se vuoi "vedere l'orario ogni secondo devi metterlo nel void loop
ho ricontrollato le saldature effettivamente una era fatta male....ma non funziona lo stesso...mi sono accorto di averlo collegato su SCL2 ed SDA2.....forse il problema sta qui.
mi correggo da solo....ho caricato un esempio e funziona.........il mio schetch invece no.....
Adesso funziona con questo IF, ma non ho capito a cosa serve potete spiegarmelo
//DS3231 RTC //VARIABILI
#include "RTClib.h" //LIBRERIA
RTC_DS3231 rtc; //ISTANZA per Libreria
void LETTURA_DS3231_RTC()
{
DateTime now = rtc.now();
if(now.hour()<=9){Serial.print("0");Serial.print(now.hour(),DEC);Serial.print(":");}
if(now.hour()>=10){Serial.print(now.hour(),DEC);Serial.print(":");}
if(now.minute()<=9){Serial.print("0");Serial.print(now.minute(),DEC);Serial.print(":");}
if(now.minute()>=10){Serial.print(now.minute(),DEC);Serial.print(":");}
if(now.second()<=9){Serial.print("0");Serial.print(now.second(),DEC);Serial.println("");}
if(now.second()>=10){Serial.print(now.second(),DEC);Serial.println("");}
delay(1000);
void setup()
{
Serial.begin(9600);
if(!rtc.begin()){Serial.flush();abort();} //NON HO CAPITO A COSA SERVE A PARTE CHE SENZA NON FUNZIONA
if(rtc.lostPower()){rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));}
}
void loop()
{
LETTURA_DS3231_RTC();
}
} or paste code here
grazie in anticipo a tutti.
if(!rtc.begin()){Serial.flush();abort();} //NON HO CAPITO A COSA SERVE A PARTE CHE SENZA NON FUNZIONA
se noti bene c'è ! all'inizio
quindi detto in altro modo
se rtc non viene rilevato = abort,
poi rtc lost-power (= orario errato) significa di solito che la batteria non c'è o e scarica
rtc.adjust(DateTime(F(DATE),F(TIME) e un comando per aggiornare rtc con l'orario del pc
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.