Go Down

Topic: Creazione temporizzatore con RTC DS1307 - aiuto codice (Read 7072 times) previous topic - next topic

leo72

Trasforma tutto in secondi.
E poi fai il confronto con questi. Come già ti aveva suggerito Uwe, è meglio per gestire gli orari

Ivan_Isk

Si, ho letto il suo consiglio, ma se devo essere sincero l'ho ignorato in quanto non mi è molto chiaro come fare.
Dove e come devo inserire questo?
Code: [Select]
Secondigiorno = secondi+ minuti*60 +ore*60*60

Per questo invece non credo di avere problemi
Code: [Select]

if (Secondigiorno >=28800 &&  Secondigiorno < 29100){
accendi relé;
reléacceso = 1;}
else
if (reléacceso = 1){
spegni relé;
reléacceso = 0;}


Ancora grazie,
Ivan
HELLO WORLD!

Ivan_Isk

Buona sera a tutti, mi sono rimesso a lavorare sul codice e scritto in questo modo non ho problemi nella compilazione.
Spero che funzioni, anche se non ho ancora provato.
Avete altri consigli da darmi?
Code: [Select]
// di seguito includo la libreria per la comunicazione su bus I2C
#include <Wire.h>

int start_h=00;
int start_m=00;
int end_h=00;
int end_m=00;
int releacceso=0;

void setup()
{
    pinMode(2, OUTPUT);    // PIN DOVE E' COLLEGATO IL RELE'
   
  // inizializzo la comunicazione seriale
  Serial.begin(9600);

  //inizializzo la libreria
  Wire.begin();

  // adesso, inizializzo la comunicazione con il DS1307.
  // L'indirizzo del DS1307 di default è 0x68
  Wire.beginTransmission(0x68);
  // il primo byte stabilisce il registro
  Wire.write((byte)0x00);
  // imposto l'orario e la data
  Wire.write((byte)0x00); // 1° byte SECONDI da 0x00 a 0x59
  Wire.write((byte)0x10); // 2° byte MINUTI da 0x00 a 0x59
  Wire.write((byte)0x80 | 0x10); // 3° byte ORE da 0x00 a 0x24
  Wire.write((byte)0x01); // 4° byte GIORNO della settimana da 0x01 a 0x07
  Wire.write((byte)0x21); // 5° byte GIORNO del mese da 0x00 a 0x31
  Wire.write((byte)0x03); // 6° byte MESE da 0x00 a 0x12
  Wire.write((byte)0x12); // 7° byte ANNO 0x00 a 0x99
  Wire.endTransmission();
}

void loop()
{
  // inizzializzo la trasmissione partendo dall'indirizzo 0x00
  Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();

  // richiedo 7 byte dal dispositivo con indirizzo 0x68
  Wire.requestFrom(0x68, 7);
  // recupero i 7 byte relativi ai corrispondenti registri
  byte secondi = Wire.read();
  byte minuti = Wire.read();
  byte ora = Wire.read();
  byte giorno_sett = Wire.read();
  byte giorno_mese = Wire.read();
  byte mese = Wire.read();
  byte anno = Wire.read();
  int Secondigiorno = secondi+ minuti*60 +ora*60*60;

  Serial.print("Ora corrente: ");
  Serial.print(ora, HEX);
  Serial.print(":");
  Serial.print(minuti, HEX);
  Serial.print(":");
  Serial.println(secondi, HEX);

  Serial.print("Giorno della settimana: ");
  Serial.println(giorno_sett, HEX);

  Serial.print("Data corrente: ");
  Serial.print(giorno_mese, HEX);
  Serial.print("/");
  Serial.print(mese, HEX);
  Serial.print("/");
  Serial.println(anno, HEX);
  Serial.println();
   delay(1000);
   
   // QUI' IMPOSTO I PARAMETRI DI ACCENSIONE DEL RELE' --- COME FACCIO A IMPOSTARE - DA QUANDO A QUANDO- DOVRA' RESTARE ECCITATO?
   if (Secondigiorno >=28800 &&  Secondigiorno < 29100){
digitalWrite(2, HIGH);
    delay(1000);
releacceso = 1;
}
else
if (releacceso = 1){
digitalWrite(2, LOW);
    delay(1000);
releacceso = 0;}
   
   
}


A presto,
Ivan
HELLO WORLD!

gpb01

Ivan,
per i confronti di date e ore ... dai un'occhiata a QUESTA vecchia discussione  ... la funzione per il TimeStamp è sempre molto utile ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP

Attento che secondi giorno può avere come massimo 86399 mentre int ha 32767: non ci sta!
Usa long per la variabile secondigiorno.

Ivan_Isk

HELLO WORLD!

lorbian

Ciao,

il mio problema è verificare quanti secondi in un giorno funziona la caldaia di casa. Il programma è fatto ma
uso Arduino Uno che non ha il clock preciso e quindi ho collegato l' RTC DS1307 per usarne il quarzo migliore.

Quello che non trovo è un comando che estragga il valore UNIXtime  quando parte la caldaia in modo da ottenere, per differenza con l' unixtime che avanza, il tempo che ha lavorato.

insomma: se la caldaia parte a unixtime 123456789 e si ferma a 123456799 avrà lavorato 10 secondi. mi manca "bloccare il dato di partenza". Con che comando?

Grazie mille in anticipo!

Ciao.

gpb01

@lorbian : In che senso "bloccare il dato di partenza" ?  ... non ti basta salvarlo in una variabile di tipo "unsigned long" ?

Guglielmo
Search is Your friend ... or I am Your enemy !

lorbian

ho provato ma il dato continua ad aumentare.

long tempobase =(now.unixtime());

ogni secondo che passa " tempobase" cambia come cambia "now.unixtime()"

a me serve che quando leggo il dato il numero che ha letto rimanga quello in modo che da lì possa iniziare a contare.

Grazie in anticipo.



gpb01

Scusa ma ... continua a cambiare solo se continui ad assegnare il valore alla variabile !

Se lo assegno SOLO nel momento in cui ti serve di ricordare il tempo ... di sicuro non cambia  :smiley-twist:

Quindi ... vedi beni DOVE assegni tale valore e quante volte lo fai ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up