rtc ds 3231

salve
mi è appena arrivato l rtc ds 3231 , .
mi serve per regolare l accensione delle luci del mio acquario , ho gia scritto un post sull accensione delle luci e ringrazzio tutti per l aiuto che mi avete dato , in quella discussione usavo i millis(); , nwella stessa discussione mi era stato consigliato l uso del rtc .
essendo completamente ignorante ho cercato sulla rete , anche perche l esempio dell ide , almeno per me , non e molto esaustivo , e da quello che ho letto ho buttato giu un pezzo di codice ,

#include <RTClib.h>

#define co2 5
#define luce 6

RTC_DS3231 rtc;




int orari_luci
int orari_co2 



  // put your setup code here, to run once:

void setup() {

  pinMode(co2, OUTPUT);
  pinMode(luce, OUTPUT);
  
}

void loop() {


DataTime now = RTC.now();
String temperature = "";
int ore = now.hour();
int minuti = now.minute();
int secondi = now.second();
int anno = now.year();
boolean luci_on = true, co2_on = true;



}

con la gestione dell rtc dovrei gestire accensione luci ed apertura co2 , per il momento mi fermo qui o meglio se ho capito bene poi i momenti di accednsione e spegnimento si gestiscono tutti con gli if giusto?ma non so come
la parte di codice sopra è giusta?
qualche consiglio ?
grazie

Nel codice che hai postato ci sono diversi errori:

  • punto e virgola mancanti dopo la dichiarazione delle 2 variabili int
  • rtc la definisci minuscola e la usi maiuscola,
  • DateTime l'hai scritto sbagliato

A parte questo, non hai messo nel setup la parte di inizializzazione dell'RTC (vedi sketch di esempio). La variabile temperature non la usi... a cosa serve? Prendi i valori di ore, minuti, secondi ma non li usi...

Immagino tu abbia un orario prestabilito a cui accendere la luce e uno a cui spegnerla, quindi dovresti confrontare i valori ore, minuti con gli orari che hai stabilito.

Qualcosa tipo

(if ((ore == ore_on) && (minuti == minuti_on)) {
luci_on = true;
}

Lo stesso con off.

grazie per la risposta rapida.
non ho provato la copilazione ho semplicemente buttato giu tanto per vedere se la strada era quella giusta . o megli l inizio era giusto ,
la ttemperatura e una cosa che vorrei aggiungere e farla visualizzare su una schermo lcd 16x2
p.s.
l rtc mi e arrvato senza pila , va saldato lo stoker , che pila serve? o meglio da qiuanti volt? credo 3 giusto ?
dovro fare uno stampato dove inserire anche dei lm317 pe rle luci elettor valvole ecc quindi centrera anche la pila .

un altro p.s. ma al momento dell avvio del tutto , l rtc presiumo che parta da 00/00/00 giusto?
ho messo anche l anno , dimenticando mese e giorno , ma l rtc conta solo ore minuti secondi o anchegiorni , mesi , anno?
grazie mille

Mi scrivi. "alle 10 accendi alle 21 spegni tutti i giorni ?"
Del giorni/mese/anno quindi che ti frega ? Nulla mi pare. Ti interessa l'orario.
Mi pare il codice di @fratt qui sopra sia okay

int ore = now.hour();
int minuti = now.minute();
int secondi = now.second();
...
if(ore>=10 && ore<21)  
{ accendi 
}
else
{ spegni
}

la batteria dovrebbe essere una LIR2032, che è una batteria ricaricabile. occhio che ce ne sono di molto simili non ricaricabili. se usi queste devi modificare l'RTC per "staccare" il circuito di ricarica, altrimenti ci sono problemi. su internet ci sono diverse guide su come fare.

sull'RTC che uso io c'è proprio il posto per la batteria... non capisco il problema della saldatura...

se guardi l'esempio della libreria, vedi che nel setup oltre a inizializzare il modulo, imposta anche l'orario. lo fai la prima volta, poi commenti la riga e il modulo continua a tenere aggiornata l'ora grazie alla batteria.

l'RTC "conta" anche la data.

ho scritto accendi alle 10 spegni alle 21 tanto per dare giu un esempio , perche a dire il vero le stagioni mi interesserebbero ( non sono fondamentali ma se ci fossero guastare non guastano)
per la libreria domani controllero ,
dovro controllare piu cose , cmq per ora devo , vedere bene la parte del rtc che riguarda luci e co2 , se mi riesce ci inseriro anche il cibo , ( per la part emeccanica non ci sono problem ho costruito una copia di una pompa che abbiamo spedito in iran per il petrolio ma la parte software e un disastro :frowning: ) :confused: :confused: :confused:

int ore = now.hour();
int minuti = now.minute();
int secondi = now.second();
int anno = now.year();
boolean luci_on = true, co2_on = true;
int ore_accensione = 860+00+00 ;
int ore_spegniumento = 19
60+00+00 ;
cosi le variabili vanno bene?

Primo, una cosa alla volta.
Secondo, int non basta, arrivi al massimo a 32767, quindi long
Poi se scrivi le costanti in decimale, 083000 => 810000+30100+0
Se li vuoi in secondi allora 83600+3060+0

curiosità... perché complicarsi la vita per avere un numero unico con ore/minuti/secondi quando con un if e un && si risolve?
tra l'altro credo che i secondi puoi anche tralasciarli...

con la variabile int posso scrivere 8*60+60+60 , ci dovrebbe entrare? o ho capito male , scusate ma non ho il manusale sotto mano e non mi ricordo a quanto arriuvano le variabili ,
va be i secondi ovviamente li possio tralasciare , era tanto per completezza
ora vado a nanna ( altrimenti il neurologo si arrabbia)
domani riprovo collegando anche irtc ( che dovrebbe andare cmq anche senza batteria giusto? basta non scollegarlo dall alimentazione.
buona notte e grazie a tutti per la pazienza

nid69ita:
Secondo, int non basta, arrivi al massimo a 32767, quindi long
Se li vuoi in secondi allora 83600+3060+0

ho sbagliato il conto va portato tutto in secondi giusot?
provero e poi vi posto il codice
cosi me lo potrete correggere :slight_smile: :slight_smile: :slight_smile:
grazie ancora per l aiuto

albepancio:
con la variabile int posso scrivere 8*60+60+60 , ci dovrebbe entrare?

Ma ore60+60+60 a che serve ? se vuoi i secondi totali sono 3600H+60M+S
se ti bastano i minuti sono 60
H+M ma perdi i secondi


boolean estate;//------------------>questo booleano ti serve per far capire se è estate piuttosto inverno
boolean acc_bianca;// variabile che discrimina l accensione dei led bianchi
boolean acc_rossa; //variabile accensione led rossi
boolean acc_blu;//variabile accensione led blu

//////////////////////////////////////////////////////////////////////77
//variabili per rtc
int long ore;
int long minuti ;
int long secondi ;
int long anno ;

//////////////////////////////////////////////7
//definisco pin uscita delle luci
#define luce_bianca 3
#define luce_rossa 4
#define luce_blu 5
//////////////////////////////////////////////////////////////////
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;
////////////////////////////////////////////////////////////////////////////////////////
void setup() {

//definisco pin luci
pinMode(luce_bianca, OUTPUT);
pinMode(luce_rossa, OUTPUT);
pinMode(luce_blu, OUTPUT);

digitalWrite(luce_bianca, LOW); // spengo il led bianchi
digitalWrite(luce_rossa, LOW); // spengo il led rossi
digitalWrite(luce_blu, LOW); // spengo il led blu

void loop() {
DateTime now = rtc.now();

//Per comodità uso variabili e non direttamente ciò che restituisce il modulo RTC
int long ore = now.hour();
int long minuti = now.minute();
int long secondi = now.second();
int long anno = now.year();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7
//funzione orari accensione, spegnimento luci piante d estate

void estate_led_piante() {
//per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
if ((ore == 25200) && (minuti == 1800)) { // se sono le 7,30 accendi luci piante
accensioneLed_piante();

}
if((ore == 68400) && (minuti == 1800)){// se sono le 19,30 spegni luci piante
spegnimentoLed_piante();
}

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//funzione orari accensione , spegnimento luci piante d inverno

void inverno_led_piante() {
//per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
if ((ore == 28800) && (minuti == 1800)) { // se sono le 8,30 accendi luci piante
accensioneLed_piante();

}
if((ore == 64800) && (minuti == 1800)){// se sono le 18,30 spegni luci piante
spegnimentoLed_piante();
}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//fase accensione spegnimento luci per le piantte

void accensioneLed_piante() {
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
analogWrite(luce_rossa, fadeValue);
analogWrite(luce_blu, fadeValue);
delay(20);
}
}

void spegnimentoLed_piante() {
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(luce_rossa, fadeValue);
analogWrite(luce_blu, fadeValue);
delay(20);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
sfruttando l architettura che mi era stata suggerita nel pos ( uso dei millis() ) ho creato una funzione per l accensione / spegnimento , dicriminado estate inverno , ora devo vedere come discriminare l estate inverno con l rtc ,
escludendo (orrori di scrittura) come impostazione puo andare?
p.s. devo aggiujngere la funzione per le luci bianche che dovranno accendersi con qualche minuto di ritardo ed spegnersi con qualche minuto di anticipo rispetto alle alòtre
grazie
le tante //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7 mi servono per distinguere le parti del codice ,,,,,,, altrimenti le incasino ( non ho una viosta eccellente)

Pezzi di codice buttati a caso ? Manco compilerebbe !

Che senso ha adesso sto pezzo ?
int long ore = now.hour();
int long minuti = now.minute();
int long secondi = now.second();
se now.hour() ritorna l'ora sarà numero tra 0 e 23, perché un long ?

Da dove saltano fuori sti numeri assurdi ?
void estate_led_piante()
{ if ((ore == 25200) && (minuti == 1800)) { // se sono le 7,30 accendi luci piante

long orario= now.hour()*3600+now.minute()*60+now.second();
questo può essere il calcolo. alle 10:23:48 orario = 37428

Scomodo, meglio pensare in decimale.
long orario= now.hour()*10000+now.minute()*100+now.second();
alle 10:23:48 orario vale 102348 molto più semplice da leggere

orario la dichiari long e fuori da tutto, ad inizio del programma.
void estate_led_piante()
{ //per prima cosa controlliamo il contatore se è maggiore di 5 altrimenti salterà tutta la funzione
if ( orario >= 73000) // se sono le 7,30 accendi luci piante
{ accensioneLed_piante();
}
if( orario >= 193000 ) // se sono le 19,30 spegni luci piante
{ spegnimentoLed_piante();
}
}

boolean estate;//------------------>questo booleano ti serve per far capire se è estate piuttosto inverno
boolean acc_bianca;// variabile che discrimina  l accensione dei led bianchi
boolean acc_rossa; //variabile accensione led rossi
boolean acc_blu;//variabile accensione led blu


//////////////////////////////////////////////////////////////////////77
//variabili per rtc
 int long ore;
  int long minuti ;
  int long secondi ;
  int long anno ;
int pos = 0;    // variable posizione servo
  //////////////////////////////////////////////7
  //definisco pin uscita delle luci
#define luce_bianca 3
#define luce_rossa 4
#define luce_blu  5
///////////////////////////////////////////////////////////////////////
//definisco pin per il cibo
#define cibo 6
//////////////////////////////////////////////////////////////////
// librerie
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;
////////////////////////////////////////////////////////////////////////////////////////
//libreria ser vo
#include <Servo.h>

Servo myservo;  // create servo object to control a servo



void setup() {

  //definisco pin luci
  pinMode(luce_bianca, OUTPUT);
  pinMode(luce_rossa, OUTPUT);
  pinMode(luce_blu, OUTPUT);
     
 //definicopin servo cibo
 myservo.attach(9);
 ////////////////////////////////////////////
 //spengo le luci
 
  digitalWrite(luce_bianca, LOW);   // spengo il led bianchi
  digitalWrite(luce_rossa, LOW);   // spengo il led rossi
  digitalWrite(luce_blu, LOW);   // spengo il led blu
  

}

void loop() {
  DateTime now = rtc.now();

  //Per comodità uso variabili e non direttamente ciò che restituisce il modulo RTC
  int long  ore = now.hour();
  int long minuti = now.minute();
  int long secondi = now.second();
  int long anno = now.year();
 

}
 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7
//funzione orari accensione, spegnimento luci piante d estate

void estate_led_piante() {
  //per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
  if ((ore == 25200) && (minuti == 1800)) { // se sono le 7,30 accendi luci piante
    accensioneLed_piante();
    
    }
    if((ore == 68400) && (minuti == 1800)){// se sono le 19,30 spegni luci piante
   spegnimentoLed_piante();
  }

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//funzione  orari accensione , spegnimento luci piante d inverno


void inverno_led_piante() {
  //per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
  if ((ore == 28800) && (minuti == 1800)) { // se sono le 8,30 accendi luci piante
    accensioneLed_piante();
    
    }
    if((ore == 64800) && (minuti == 1800)){// se sono le 18,30 spegni luci piante
   spegnimentoLed_piante();
  }

}

//fine funzione piante-----------------------------------------------------------------------------------------------------------------------------------

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//funzione orari accensione, spegnimento luci bianche estate

void estate_led_bianchi() {
  //per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
  if ((ore == 25200) && (minuti == 2400)) { // se sono le 7,40 accendi luci bianche
    accensioneLed_bianchi();
    
    }
    if((ore == 68400) && (minuti == 1200)){// se sono le 19,20spegni luci piante
   spegnimentoLed_bianchi();
  }

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//funzione  orari accensione , spegnimento luci bianchi d inverno


void inverno_led_bianchi() {
  //per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
  if ((ore == 28800) && (minuti == 2499)) { // se sono le 8,40 accendi luci piante
    accensioneLed_bianchi();
    
    }
    if((ore == 64800) && (minuti == 1200)){// se sono le 18,20 spegni luci piante
   spegnimentoLed_bianchi();
  }

}

////////fine funzione estate inverno luci bianche

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////






//fase accensione spegnimento luci per le piantte

void accensioneLed_piante() {
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    analogWrite(luce_rossa, fadeValue);
    analogWrite(luce_blu, fadeValue);
    delay(20);
  }
}

void spegnimentoLed_piante() {
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(luce_rossa, fadeValue);
    analogWrite(luce_blu, fadeValue);
    delay(20);
  }
}
//////////////////////////////////////////////////////////////////////////////////////////////////

//funzione accensione , spegnimento luci bianche
void accensioneLed_bianchi() {
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    analogWrite(luce_bianca, fadeValue);
   
    delay(20);
  }
}

void spegnimentoLed_bianchi() {
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(luce_bianca, fadeValue);
    
    delay(20);
  }
}

questo e tutto il codice con le funzioni estate inverno pe rle luci bianche e piante( rosse blu) manche la funzione che discriminera estate, inverno
ù
ùscusa non ho letto il tuo mess e arrivato mentre scrivevo
p.s. non ho capito qwuesto { //per prima cosa controlliamo il contatore se è maggiore di 5 altrimenti salterà tutta la funzione........
grazi eper le risposte

Se ri-dichiari le variabili dentro la loop() non vengono viste nelle funzioni.
Quindi la loop ... è vuota e non fa nulla ? e quando richiami le funzioni ?

Almeno la loop() deve essere

void loop() 
{ DateTime now = rtc.now();
  ore = now.hour();
  minuti = now.minute();
  secondi = now.second();
  anno = now.year();

  estate_led_piante();
  inverno_led_piante();
}
boolean estate;//------------------>questo booleano ti serve per far capire se è estate piuttosto inverno
boolean acc_bianca;// variabile che discrimina  l accensione dei led bianchi
boolean acc_rossa; //variabile accensione led rossi
boolean acc_blu;//variabile accensione led blu


//////////////////////////////////////////////////////////////////////77
//variabili per rtc
 int long ore;
  int long minuti ;
  int long secondi ;
  int long anno ;
int pos = 0;    // variable posizione servo
  //////////////////////////////////////////////7
  //definisco pin uscita delle luci
#define luce_bianca 3
#define luce_rossa 4
#define luce_blu  5
///////////////////////////////////////////////////////////////////////
//definisco pin per il cibo
#define cibo 6
//////////////////////////////////////////////////////////////////
// librerie
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;
////////////////////////////////////////////////////////////////////////////////////////
//libreria ser vo
#include <Servo.h>

Servo myservo;  // create servo object to control a servo



void setup() {

  //definisco pin luci
  pinMode(luce_bianca, OUTPUT);
  pinMode(luce_rossa, OUTPUT);
  pinMode(luce_blu, OUTPUT);
     
 //definicopin servo cibo
 myservo.attach(9);
 ////////////////////////////////////////////
 //spengo le luci
 
  digitalWrite(luce_bianca, LOW);   // spengo il led bianchi
  digitalWrite(luce_rossa, LOW);   // spengo il led rossi
  digitalWrite(luce_blu, LOW);   // spengo il led blu
  /////////////////////////////////////////////7
    DateTime now = rtc.now();

  //Per comodità uso variabili e non direttamente ciò che restituisce il modulo RTC
  int long  ore = now.hour();
  int long minuti = now.minute();
  int long secondi = now.second();
  int long anno = now.year();

}

void loop() {


}
 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7
//funzione orari accensione, spegnimento luci piante d estate

void estate_led_piante() {
  //per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
  if ((ore == 25200) && (minuti == 1800)) { // se sono le 7,30 accendi luci piante
    accensioneLed_piante();
    
    }
    if((ore == 68400) && (minuti == 1800)){// se sono le 19,30 spegni luci piante
   spegnimentoLed_piante();
  }

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//funzione  orari accensione , spegnimento luci piante d inverno


void inverno_led_piante() {
  //per prima cosa controlliamo il cont

meglio cosi? le avevo dichiarate dentro il lloop perche se le dichiaravo nel setup mi dava errore , come variabili non dichiarate , ho provato adesso e non so il perche ma mi ha compilato tutto .
p.s. ma quel { //per prima cosa controlliamo il contatore se è maggiore di 5 altrimenti salterà tutta la funzione

?? parliamo due lingue diverse ?
Ti ho riscritto esattamente la loop() e tu sposti le cose inutilmente nella setup() ?