[RISOLTO] Problema con stazione meteo Arduino

Salve a tutti ho un problema per quanto riguarda l' RTC dello schetch di una stazione meteo, che mi sto costruendo, consiste nella trasmissione dall'esterno all' interno di casa, di alcuni valori, quali: temperatura, umidità(acquisiti tramite un DHT22) e velocità del vento.

In pratica, pur avendo la batteria carica l'RTC non si sincronizza e non mantiene l'orario. Questo è uno dei problemi principali che provando e riprovando, non sono riuscito a risolvere. Spero che possiate darmi una mano perchè in questo momento sono bloccato. Grazie in anticipo a chiunque mi aiuterà.

/******************************************************************
 Created with PROGRAMINO IDE for Arduino - 21.09.2018 17:32:56
 Project     :Wheather Station (Receiver)
 Libraries   :RcSwitch.h Wire.h NewliquidCrystal.h rtcLib.h
 Author      :Giacomo Pascon
 Description :Receiver for the whether station by Giacomo Pascon
 Copyright   :Giacomo Pascon (All Rights Reserved) 
******************************************************************/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RCSwitch.h>
#include "RTClib.h"



LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //dichiaro LCD
RCSwitch rc = RCSwitch(); //dichiaro rf433
RTC_DS3231 rtc;

//simboli LCD
byte barra[8]{B00100,B00100,B00100,B00100,B00100,B00100,B00100,B00100};
byte term[8]{B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110};
byte goccia[8]{B00000,B00100,B01110,B01110,B11111,B11111,B11111,B01110};
byte pallino[8]{B01100,B10010,B10010,B01100,B00000,B00000,B00000,B00000};
byte bandiera[8] = {B00001,B10111,B11111,B11111,B11110,B11000,B10000,B10000};
byte Mh[8] = {B00100,B00111,B00101,B10000,B11111,B10101,B10101,B10101};
String value;
float t;
float h;
float v;
word statogiorno = 0;
word statomese = 0;
word statoora = 0;
word statominuti = 0;

void setup()
{
   if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
lcd.begin(20,4); //inizializzo lcd
rc.enableReceive(0); //inizializzo la ricezione sul pin 2

//creo i caratteri
lcd.createChar(1,barra);
lcd.createChar(2,term);
lcd.createChar(3,goccia);
lcd.createChar(4,pallino);
lcd.createChar(5,bandiera);
lcd.createChar(6,Mh);
    
}

void loop()
{
//stampo i caratteri per dividere in due parti il display
lcd.setCursor(11,0);
lcd.write(1);    
lcd.setCursor(10,1);
lcd.write(1);    
lcd.setCursor(11,2);
lcd.write(1);    
lcd.setCursor(10,3);
lcd.write(1);

lcd.setCursor(0,0);
lcd.write(2);
lcd.setCursor(1,0);
lcd.print('=');  

lcd.setCursor(0,1);
lcd.write(3);
lcd.setCursor(1,1);
lcd.print('=');  

lcd.setCursor(0,2);
lcd.write(5);
lcd.setCursor(1,2);
lcd.print('=');  

DateTime now = rtc.now(); 

int reiceivedvalue = rc.getReceivedValue();
value = String(reiceivedvalue);
if(value.substring(0,3) == "888"){
t = value.substring(3).toInt();
lcd.setCursor(2,0);
lcd.print(t);
lcd.setCursor(7,0);


}
//riconosco se ricevo l'umidità e la stampo su lcd
if(value.substring(0,3) == "999"){
h = value.substring(3).toInt();
lcd.setCursor(2,1);
lcd.print(h);
lcd.setCursor(7,1);



}
//riconosco se ricevo la temperatura e la stamppo su lcd
if(value.substring(0,3) == "889"){
t = (value.substring(3).toInt()) * (-1);
lcd.setCursor(2,0);
lcd.print(t);
lcd.setCursor(7,0);
lcd.print('%');


}
//riconosco se ricevo il vento e lo stamppo su lcd
if(value.substring(0,3) == "777"){
v = value.substring(3).toInt();
lcd.setCursor(2,2);
lcd.print(v);
lcd.setCursor(7,2);
lcd.print('K');
lcd.setCursor(8,2);
lcd.write(6);

}
//stampo data su lcd
lcd.setCursor(11,0);
lcd.print(now.day(),DEC);
lcd.setCursor(13,0);
lcd.print('/');
lcd.setCursor(14,0);
lcd.print(now.month(),DEC);
lcd.setCursor(16,0);
lcd.print('/');
lcd.setCursor(17,0);
lcd.print(now.year(),DEC);

//stampo l'ora su lcd
lcd.setCursor(14,1);
lcd.print(now.hour(),DEC);
lcd.setCursor(16,1);
lcd.print(':');
lcd.setCursor(17,1);
lcd.print(now.minute(),DEC);


if(statogiorno != now.day()){
lcd.setCursor(12,0);
lcd.print(' ');
statogiorno = now.day();


}

if(statomese != now.month()){
lcd.setCursor(15,0);
lcd.print(' ');
statomese = now.month();


}
if(statoora != now.hour()){
lcd.setCursor(15,1);
lcd.print(' ');
statoora = now.hour();


}
if(statominuti != now.minute()){
lcd.setCursor(18,1);
lcd.print(' ');
statominuti = now.minute();


}
}

Staz_Meteo_Ric.ino (3.59 KB)

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

Per me poche informazioni. Non si sincronizza RTC con cosa ? In che senso ? Non vedo nel codice la richiesta via internet o via radio a qualche servizio di orario tipo NTP ?!?
C'e' rf433 di cosa ? Mi pare dai poche info.

Scusami era il mio primo post, non mi sono espresso bene.

Allora:
Ricevo le informazioni via radio con un rf433Mhz, successivamente le stampo su un display i2c 20x4, siccome mi pareva quasi sprecato un display così grande per scrivere solamente temperatura, umidità e velocità del vento ho deciso di aggiungere un RTC per indicare la data e l'ora sulla parte destra del display.

Il mio problema è che non riesco a sincronizzare l' RTC via I2c con arduino perchè non riesco a dare il giusto indirizzo all'RTC.
Prima avevo un rtc1307 che poi creando la basetta finale ho bruciato. Per il 1307 bastava inserire l'indirizzo i2c all'interno delle parentesi dell'istruzione "rtc.begin()".
Ti allego un 'esempio...

rtc.begin(0x30);

...l'ora si sincronizzava perfettamente con il mio computer.

Quando invece ho provato a inserire l'RTC3231 sono cominciati i problemi...
Ho provato di tutto: ho caricato il codice di esempio...

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  Serial.begin(9600);

  delay(3000); // wait for console opening

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
   // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    
    delay(1000);
}

...in seriale mi dava l'errore:

"RTC lost power lets set the time!"

Ho controllato la batteria con un multimetro e indicava 3,2 volts.

Ho provato a ripetere l' istruzione:

rtc.begin(0x30);

...Mi dave questo errore:
" no matching function for call to 'RTC_DS3231::begin(int)' "

In sostanza sono bloccato.

Ti allego dunque una copia del trasmettitore...

/******************************************************************
 Created with PROGRAMINO IDE for Arduino - 21.09.2018 17:32:56
 Project     :Wheather Station (transmitter)
 Libraries   :Dht.h RcSwitch.h
 Author      :Giacomo Pascon
 Description :Transmitter for the whether station by Giacomo Pascon
 Copyright   :Giacomo Pascon (All Rights Reserved) 
******************************************************************/
//dichiaro le librerie
#include <DHT.h>
#include <RCSwitch.h>

RCSwitch rc = RCSwitch(); //dichiaro nome rf433
DHT dht(5,DHT22); //dichiaro nome dht22
int anemometro = 2; //variabile pin anemometro  

//dichiarazioni delle variabili 
long durata; 
int stato;
long startime;
float windspeed;
void setup()
{
 dht.begin(); //inizializzo dht22
 rc.enableTransmit(10); //inizializzo trasmissione
 pinMode(anemometro,INPUT); //dichiaro pin anemometro
 attachInterrupt(2,letturavento,CHANGE); //inizializzo l'interrupt per l'anemometro
 }

void loop()
{
 int t = (dht.readTemperature() * 10);  //variabile temperatura
 int h = (dht.readHumidity() * 10);  //variabile umidità
  
 if(t < 0){
 int tneg = t;
 rc.send(889000 + (tneg * (-1)),24); //moltiplico la temperatura *-1 se è negativa e la invio
 
 }
 else if(t > 0){
 rc.send(888000 + t,24); //invio temp. se è positiva
 
 
 }
 int vento = (windspeed*10);
 rc.send(999000 + h,24); //invio l'umidità
 rc.send(777000 + vento,24); //invio la vel. del vento
}
void letturavento()
{

anemometro = digitalRead(anemometro);   // legge il pin del sensore
if ((stato == 0) & (anemometro == 1)) {
// punto di transizione
durata = millis() - startime;
// calcola la durata della pulsazione
startime = millis();
// setta il nuovo tempo di partenza 
windspeed = 2500.0/durata;
// calcola la velocità in Km/h
}
stato = anemometro;
// imposta lo stato uguale alla lettura del pin

Grazie in anticipo per il tuo tempo...

Ho difficoltà a capire. "RTC lost power lets set the time!" è solo una frase del titolo
Dice che per qualche motivo l'RTC non è settato. Non che mancata corrente :o
A seconda della libreria, istruzioni come rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
oppure RTC.adjust(DateTime(DATE, TIME)); ti settano l'RTC con orario fisso o quello di compilazione.

Non capisco i vari pezzi di codice che posti (scusa ma mi paio "a caso")
Ma se tu hai un rf433 prendi l'ora da radio e poi setti l'RTC (nella setup direi). Dal rf433 sai leggere l'ora/data via radio ?

Poi le librerie dei vari RTC possono essere diverse le une dalle altre. Da questo link di Alfieri: RTC DS3231 per arduino - Mauro Alfieri Elettronica Domotica
Puoi anche vedere poi qui:
Time Library, Timekeeping and Time/Date Manipulation on Teensy
ci sono vari esempi di sincro RTC con vari metodi.

La lib per DS3231 ha .begin() senza parametri, indirizzo fissato nel file .h come #define RTC_ADDR 0x68

Ti ringrazio ho capito... Semplicemente avevo dimenticato l'istruzione RTC.adjust :sweat_smile:

Perdonami il disturbo per un errore cosi banale frutto di una svista...

Grazie ancora...