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


Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)







Ho sostituito questa parte di codice con quella data da te:

