Ultimamente ho trascurato il forum ma, entrando nel clima natalizio, si hanno nuove idee e quindi nuovi problemi; che solo grazie a voi riesco a risolvere

Mi è venuto in mente di utilizzare Arduino come Timer per le luci natalizie esterne. Il progetto non è molto complesso ma, essendo ignorante in materia di linguaggio C, per me lo è.
Ho cercato in rete ed ho trovato QUESTO che fa (dovrebbe fare) proprio al caso mio.
/Spero di non infrangere il regolamento del forum/
componenti occorrenti:
1Arduino ;
Board 8 relè;
RTC - DS1307
2 Resistenze da 1K (pullup)
1 Oscillatore da 32.768Mhz
1 Porta batteria tampone per circuiti stampati
1 Batteria tampone da 3V
Cavetteria varia;
Breadboard
Schema collegamento qui
Codice:
- Codice: Seleziona tutto
/*
2013-11-20
Applicazione realizzata da Ivan Scordato, tutto il materiale
disponibile sul sito EMC ELETTRONICA
http://it.emcelettronica.com/blog/18420
Contatti: ivanwebmaster@rocketmail.com
*/
// di seguito includo la libreria per la comunicazione su bus I2C
#include
int start_h=00; // ora in cui si deve attivare il relè
int start_m=00; // minuto in cui si deve attivare il relè
int start_s=00; // secondo in cui si deve attivare il relè
int end_h=00; // ora in cui si deve disattivare il relè
int end_m=00; // minuto in cui si deve disattivare il relè
int end_s=00; // secondo in cui si deve disattivare il relè
// per comodità eseguo la conversione
// dell'orario di accensione in secondi
int start_secondi = start_s+ start_m*60 +start_h*60*60;
// per comodità eseguo la conversione
// dell'orario di spegnimento in secondi
int end_secondi = end_s+ end_m*60 +end_h*60*60;
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();
// di seguito la variabile per convertire l'ora corrente in secondi
int Secondigiorno = secondi+ minuti*60 +ora*60*60;
// stampo sul monitor seriale la data corrente
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'
if (Secondigiorno >=start_secondi && Secondigiorno < end_secondi){
digitalWrite(2, HIGH); // eccito il relè collegato al pin2
delay(1000);
releacceso = 1;
}
else
if (releacceso = 1){
digitalWrite(2, LOW); // stacco il relè collegato al pin2
delay(1000);
releacceso = 0;}
}
Ho collegato come da schema indicato,
Scaricato le librerie per l' RTC ds1307 da QUI,
Caricato il codice su arduino,
Modificato il codice adattandolo in questo modo:
- Codice: Seleziona tutto
// di seguito includo la libreria per la comunicazione su bus I2C
#include "RTClib.h"
#include <Wire.h>
int start_h=01; // ora in cui si deve attivare il relè
int start_m=21; // minuto in cui si deve attivare il relè
int start_s=02; // secondo in cui si deve attivare il relè
int end_h=20; // ora in cui si deve disattivare il relè
int end_m=22; // minuto in cui si deve disattivare il relè
int end_s=02; // secondo in cui si deve disattivare il relè
// per comodità eseguo la conversione
// dell'orario di accensione in secondi
int start_secondi = start_s+ start_m*60 +start_h*60*60;
// per comodità eseguo la conversione
// dell'orario di spegnimento in secondi
int end_secondi = end_s+ end_m*60 +end_h*60*60;
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)0x02); // 1° byte SECONDI da 0x00 a 0x59
Wire.write((byte)0x20); // 2° byte MINUTI da 0x00 a 0x59
Wire.write((byte)0x20 | 0x00); // 3° byte ORE da 0x00 a 0x24
Wire.write((byte)0x02); // 4° byte GIORNO della settimana da 0x01 a 0x07
Wire.write((byte)0x08); // 5° byte GIORNO del mese da 0x00 a 0x31
Wire.write((byte)0x12); // 6° byte MESE da 0x00 a 0x12
Wire.write((byte)0x15); // 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();
// di seguito la variabile per convertire l'ora corrente in secondi
int Secondigiorno = secondi+ minuti*60 +ora*60*60;
// stampo sul monitor seriale la data corrente
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'
if (Secondigiorno >=start_secondi && Secondigiorno < end_secondi){
digitalWrite(2, HIGH); // eccito il relè collegato al pin2
delay(1000);
releacceso = 1;
}
else
if (releacceso = 1){
digitalWrite(2, LOW); // stacco il relè collegato al pin2
delay(1000);
releacceso = 0;}
}
ma purtroppo non funziona

Le mie domande sono:
1-Tra i componenti occorenti dice:
Oscillatore da 32.768Mhz
Il mio RTC DS1307 sembra gia averlo, ecco una foto:
Sbaglio ho gia ha l'oscillatore da 32.768Mhz? (penso dovrebbe essere quel cilindro grigio al centro)
2- Nel codice, alla riga circa 39, dove va impostato l'ora "attuale" vi è:
- Codice: Seleziona tutto
Wire.write((byte)0x80 | 0x10); // 3° byte ORE da 0x00 a 0x24
io ho fatto varie prove, chiedo se va bene così:
- Codice: Seleziona tutto
Wire.write((byte)0x00 | 0x20); // 3° byte ORE da 0x00 a 0x24
Grazie infinite
