Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Arduino come timer relè luci natalizie

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[11] Re: Arduino come timer relè luci natalizie

Messaggioda Foto Utentedanielepower » 10 dic 2015, 17:02

Grazie mille ad entrambi =D>
Foto UtenteRussell quindi nel momento che levo la batteria l'RTC si "formatta"? bene
_
Quindi i passaggi che dovrei fare sono:
- levare la batteria (gia fatto)
-rimettere la batteria
-caricare questo sketch su arduino:
Codice: Seleziona tutto
// di seguito includo la libreria per la comunicazione su bus I2C
    #include <Wire.h>
    #include "RTClib.h"

void setup()
{
  // 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 il tempo e la data in esadecimale
  Wire.write((byte)0x00); // 1° byte SECONDI impostabili da 0x00 a 0x59
  Wire.write((byte)0x05); // 2° byte MINUTI impostabili da 0x00 a 0x59
  Wire.write((byte)0x80 | 0x10); // 3° byte ORE impostabili da 0x00 a 0x24
  Wire.write((byte)0x04); // 4° byte GIORNO della settimana impostabile da 0x01 a 0x07
  Wire.write((byte)0x10); // 5° byte GIORNO del mese impostabile da 0x00 a 0x31
  Wire.write((byte)0x12); // 6° byte MESE impostabile da 0x00 a 0x12
  Wire.write((byte)0x15); // 7° byte ANNO impostabile da 0x00 a 0x99
  Wire.endTransmission();
}

void loop()
{
  delay(100);
}


( Al rigo 19, ovvero: Wire.write((byte)0x80 | 0x10); // 3° byte ORE impostabili da 0x00 a 0x24 metto 0x80 | 0x10 ??)

-Successivamente carico il codice dato da Foto UtenteJackd in [9]
Codice: Seleziona tutto
       // Date and time functions using a DS1307 RTC connected via I2C and Wire lib
         
        #include <Wire.h>
        #include "RTClib.h"
         
        RTC_DS1307 RTC;
       
       int OnH = 16; //Ora On
       int OnM = 8; //minuto On
       int OnS = 01; //secondo on
       int OffH = 16; // ora off
       int OffM = 9; // minuto off
       int OffS = 01; // secondo off
        //orari in secondi
       int ONsecondi = OnS + OnM*60 + OnH*3600;
       int OFFsecondi = OffS + OffM*60 + OffH*3600;
       int secondiAttuali = 0;
       int relay = 2; // pin connesso al rele
       boolean relayOn = false;
       
       
       void setup () {
            //inizializza librerie
          Serial.begin(57600);
            Wire.begin();
            RTC.begin();
          //imposto pin rele come uscita
          pinMode(relay, OUTPUT);
         
          if (! RTC.isrunning()) {
            Serial.println("RTC is NOT running!");
            // following line sets the RTC to the date & time this sketch was compiled
            RTC.adjust(DateTime(__DATE__, __TIME__));
          }
         
        }
         
        void loop () {
          //se ti leggevi la descrizione della libreria, saltava fuori che la riga seguente
          //ti estrae dal rtc in una sola chiamata tutti i dati che te servono
          DateTime now = RTC.now();
          //per poi essere estratti con le seguenti righe e girati alla seriale
            Serial.print(now.year(), DEC);
            Serial.print('/');
            Serial.print(now.month(), DEC);
            Serial.print('/');
            Serial.print(now.day(), DEC);
            Serial.print(' ');
            Serial.print(now.hour(), DEC);
            Serial.print(':');
            Serial.print(now.minute(), DEC);
            Serial.print(':');
            Serial.print(now.second(), DEC);
            Serial.println();
          //troviamo i secondi attuali     
          secondiAttuali = now.second() + now.minute() * 60 + now.hour() * 3600;
         if ( secondiAttuali >= ONsecondi && secondiAttuali < OFFsecondi){
          digitalWrite(relay, HIGH); // eccito il relè collegato al pin2
          relayOn = true;
        } else if (relayOn=true){
          digitalWrite(relay, LOW);
          relayOn=false;
          }
         
            delay(3000);
        }


Devo procedere così?

EDIT: ho fatto come ho scritto ma non funziona :( Nel monitor seriale escono scritte tipo W�Ã7�ô*0ò..
Avatar utente
Foto Utentedanielepower
592 4 6
Sostenitore
Sostenitore
 
Messaggi: 515
Iscritto il: 6 dic 2014, 17:58

0
voti

[12] Re: Arduino come timer relè luci natalizie

Messaggioda Foto UtenteJackd » 10 dic 2015, 17:14

Leggendo le specifiche della libreria, ti dovrebbe bastare mettere il codice che ti ho dato,
perché, se ho inteso bene, controlla se l'rtc sta funzionando, se non sta funzionando,
"imposta" la data e ora del rtc con la data e ora che è stato compilato lo sketch (prendendola dal tuo PC)
quindi controlla che hai la data e ora corretti.

Prova che so curioso de vedere se funziona
Avatar utente
Foto UtenteJackd
650 3 7
Frequentatore
Frequentatore
 
Messaggi: 230
Iscritto il: 15 set 2014, 19:10
Località: Padova

0
voti

[13] Re: Arduino come timer relè luci natalizie

Messaggioda Foto UtenteRussell » 10 dic 2015, 18:14

se ti stampa i geroglifici significa che hai un problema di 'print'

perche' non provi anche con quello che trovi nell'esempio che ti avevo segnalato, che sembra piuttosto semplice?
L'uso della classe DateTime introduce ulteriore carne al fuoco.

ad esempio puoi prendere spunto dal frammento:

Codice: Seleziona tutto
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  ....


dove la funzione readDS3231time è definita poche righe sopra
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2194
Iscritto il: 4 ott 2009, 10:25

0
voti

[14] Re: Arduino come timer relè luci natalizie

Messaggioda Foto Utentedanielepower » 10 dic 2015, 19:41

Mi state dicendo di fare cose troppo complicate per me che conosco da "lontano" il C+ #-o

controlla se l'rtc sta funzionando[...]
Prova che so curioso de vedere se funziona

Non so come #-o

Russell ha scritto:ad esempio puoi prendere spunto dal frammento:
code
dove la funzione readDS3231time è definita poche righe sopra


Ho preso il codice di quell'articolo che mi avevi consigliato (questo) e l'ho messo nel mio sketch e provato a modificare ma non riuscivo a capire nemmeno dove impostare l'orario #-o

Qui:
Codice: Seleziona tutto
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();

dovrei mettere i dati di ora e data attuale al posto di decToBcd ?

Ora provo a tradurre l'articolo con google tradutorre ma...
Avatar utente
Foto Utentedanielepower
592 4 6
Sostenitore
Sostenitore
 
Messaggi: 515
Iscritto il: 6 dic 2014, 17:58

1
voti

[15] Re: Arduino come timer relè luci natalizie

Messaggioda Foto UtenteJackd » 10 dic 2015, 19:53

Foto UtenteRussell inanzi tutto grazie di avere la pazienza di seguirci :) vediamo se da un semplice rtc per le luci di natale ci impariamo anche qualcosa... o facciamo solo casino...

Foto Utentedanielepower per curiosità mia personale, visto che non ho per le mani l'hardware che hai tu,
se togli alimentazione ad arduino e togli la batteria, in maniera da resettare l'rtc, rimonti tutto, e carichi il codice che ti ho passato cosi comè senza tue modifiche, ce la fai a fare uno screenshot del monitor seriale?
Vorrei capire dove ho fatto io l'errore.
Avatar utente
Foto UtenteJackd
650 3 7
Frequentatore
Frequentatore
 
Messaggi: 230
Iscritto il: 15 set 2014, 19:10
Località: Padova

0
voti

[16] Re: Arduino come timer relè luci natalizie

Messaggioda Foto Utentedanielepower » 10 dic 2015, 20:10

Jackd ha scritto: rimonti tutto, e carichi il codice che ti ho passato cosi comè senza tue modifiche, ce la fai a fare uno screenshot del monitor seriale?
Vorrei capire dove ho fatto io l'errore.


Certo
-Ho resettato
-caricato il codice che hai postato in [9]
-ecco a te il risultato:
Cattura18.PNG


Il relè è sempre eccitato, quando apro il monitor seriale si spegne per due secondi e successivamente si eccita nuovamente







Lo schema è sempre questo qui



______________________
ora ho morificato il tuo codice mettendo questo frammento così:
Codice: Seleziona tutto
       int OnH = 19; //Ora On
       int OnM = 13; //minuto On
       int OnS = 10; //secondo on
       int OffH = 19; // ora off
       int OffM = 15; // minuto off
       int OffS = 15; // secondo off
        //orari in secondi
       int ONsecondi = OnS + OnM*60 + OnH*3600;
       int OFFsecondi = OffS + OffM*60 + OffH*3600;
       int secondiAttuali = 0;
       int relay = 2; // pin connesso al rele
       boolean relayOn = false;

Il relè non si eccita al tempo impostato, è sempre a riposo #-o
Avatar utente
Foto Utentedanielepower
592 4 6
Sostenitore
Sostenitore
 
Messaggi: 515
Iscritto il: 6 dic 2014, 17:58

1
voti

[17] Re: Arduino come timer relè luci natalizie

Messaggioda Foto UtenteJackd » 10 dic 2015, 20:52

adesso qualcuno ci sgrida, ma il fatto che lo sketch sia impostato a 57600baud
ed il monitor seriale a 9600, puo essere che faccia apparire risultati strani?
cambia al volo sul monitor seriale i baud a 57600 e vediamo se almeno le scritte si sistemano,
cosi poi vediamo dove si ferma il resto.
Avatar utente
Foto UtenteJackd
650 3 7
Frequentatore
Frequentatore
 
Messaggi: 230
Iscritto il: 15 set 2014, 19:10
Località: Padova

0
voti

[18] Re: Arduino come timer relè luci natalizie

Messaggioda Foto Utentedanielepower » 10 dic 2015, 23:17

Foto UtenteJackd COMPLIMENTI =D>
Il tuo sketch funziona. perfettamente, credo.

Mentre stavo studiando sento un relè che si eccita( :mrgreen: ) torno al PC e lo trovo azionato e dopo un minuto torna nelle condizioni di riposo. =D>

ho portato il boud a 57600 baud e si legge la data e l'ora (che però è il ritardo di tre ore)

il tuo codice funziona :D ora non capisco perché non riesco a impostare bene l'orario #-o

grazie mille ad entrambi O_/
Avatar utente
Foto Utentedanielepower
592 4 6
Sostenitore
Sostenitore
 
Messaggi: 515
Iscritto il: 6 dic 2014, 17:58

Precedente

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti