Buona sera , sto per andare a nanna , ma so che dormirò serenamente perché domattina ( spero) sarò più vicino alla soluzione del mio quesito.
Siccome possiedo un vecchio , e fantastico, orologio/datario a palette (nota marca in quel di Udine)
vorrei molto vederlo in funzione. Il mio modello ha bisogno di un "pilota" che lo faccia girare. Ricordo , proverò successivamente a banco , che voglia ai suoi soli due capi di connessione una tensione da 24v DC che però inverte la polarità ad ogni impulso. (ogni minuto).
Che poi magari qualcuno di voi è un reduce di questi fantastici oggetti e mi potrà correggere se sto ricordando male.
Comunque sia , ad ora sono riuscito a scrivere un codice per avere l'ora esatta e riesco anche ad azionare un comando ad ogni minuto (grande soddisfazione per me....non immaginate quanto)
Ora il dilemma : come posso "ciclare" un output? sarebbe questa la strada da seguire?
oppure esiste un relé commutatore ?
Arduino si ricorda se ha azionato un output? potrei usare il costrutto switch?
Boh, spero sia chiara la mia richiesta.
grazie .
/* COLLEGARE PULSANTI C.TO DEBOUNCE*/
#include <TimeLib.h>
#include <Wire.h>
#include <PCF8574_HD44780_I2C.h>
PCF8574_HD44780_I2C lcd(0x27,16,2);
#include <DS3232RTC.h>
time_t t;
tmElements_t tm;
#define settaggio 10 //pulsante settaggio
#define avanti 9 //pulsante +
#define indietro 8 //pulsante -
int indiceset = 0; // indice utilizzato per avviare e gestire la routine di settaggio dei parametri
int setta = 0; // valore pulsante settaggio
int su = 0; // pulsante +
int giu = 0; // pulsante -
int incremento = 0; // valore utilizzato per aumentare o diminuire il parametro in via di settaggio
int indicedati = 0; // indice di scorrimetno della tabella tabdati
int riga = 0; // riga del display sulla quale si sta agendo
int datodaesporre = 0; // parametro in via di esposizione
long tempoprec = 0; // zona di memorizzazione del momento dell'ultima esposizione dei dati
long tempocorrente = 0; // zona di memorizzazione del momento corrente
int intermittenza = 0; // 0 espone il parametro, 1 non espone il parametro
int tabdati [21] // tabella di acquisizione dei parametri
{ // min max valore
10, 99, 0, // anno
1, 12, 0, // mese
1, 31, 0, // giorno
0, 23, 0, // ora
0, 59, 0, // minuto
0, 59, 0, // secondo
0, 0, 0, // centesimi
};
int digits = 0; // zona di memorizzazione dei minuti e dei secondi da esporre sul display lcd
char tabmesi [37] = "genfebmaraprmaggiulugagosetottnovdic"; // tabella descr. mesi
int mese = 0; // zona di memorizzazione del mese corrente
int lavoro = 0;
int era_minuti ;
int ora_minuti ;
void esponidati()
{
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.print(day());
lcd.print(' ');
mese = month();
mese = mese - 1;
lcd.print (tabmesi [(mese * 3)]);
lcd.print (tabmesi [(mese * 3 + 1)]);
lcd.print (tabmesi [(mese * 3 + 2)]);
lcd.print(' ');
lcd.print(year());
lcd.setCursor(4, 1);
lcd.print(hour());
digits = (minute());
printDigits();
digits = (second());
printDigits();
}
void printDigits()
{
lcd.print(':');
if (digits < 10)
lcd.print('0');
lcd.print(digits);
}
void sincronizzarduino () //settaggio dell'orologio e routine di sincronizzazione del timer di arduino con il timer del ds3231
{
lcd.clear ();
lcd.setCursor(0, 0);
setSyncProvider(RTC.get); // sincronizza il timer di Arduino con i dati presenti sul modulo RTC
lcd. clear ();
if (timeStatus() != timeSet) // verifica se la sincronizzazione e' andata a buon fine
lcd.print(" orologio non");
else
lcd.print(" orologio");
lcd.setCursor (0, 1);
lcd.print (" sincronizzato");
delay (1500);
}
void acquisiscidati () //settaggio dell'orologio
{
lcd.clear ();
// inserisce in tabdati i valori provenienti dal timer di arduino
tabdati [2] = year();
tabdati [2] = tabdati [2] - 2000;
tabdati [5] = month ();
tabdati [8] = day ();
tabdati [11] = hour ();
tabdati [14] = minute ();
tabdati [17] = second ();
for (indiceset = 0; indiceset < 6; indiceset = indiceset)
{
esponitabdati ();
setta = 0;
su = 0;
giu = 0;
incremento = 0;
setta = digitalRead (settaggio);
su = digitalRead (avanti);
giu = digitalRead (indietro);
if ((setta == 1) || (su == 1) || (giu == 1))
delay (500); // attende 5 decimi di secondo per evitare di interpretare una doppia pressione
if (setta == 1)
indiceset ++;
if (su == 1)
incremento = 1;
if (giu == 1)
incremento = -1;
//
// modifica il parametro corrente di tabadati con il valore presente in "incremento" e verifica
// che il nuovo valore in tabdati non ecceda i limiti
tabdati [(indiceset * 3) + 2] = tabdati [(indiceset * 3) + 2] + incremento;
if (tabdati [(indiceset * 3) + 2] > tabdati [(indiceset * 3) + 1])
tabdati [(indiceset * 3) + 2] = tabdati [(indiceset * 3) + 1];
if ( tabdati [(indiceset * 3) + 2] < tabdati [(indiceset * 3) ] )
tabdati [(indiceset * 3) + 2] = tabdati [(indiceset * 3)];
}
// inserisce in ds3231 i nuovi dati
tm.Year = y2kYearToTm(tabdati [2]);
tm.Month = tabdati [5];
tm.Day = tabdati [8];
tm.Hour = tabdati [11];
tm.Minute = tabdati [14];
tm.Second = tabdati [17];
t = makeTime(tm);
RTC.set(t); // aggiorna (setta) il modulo RTC
setTime(t); // aggiorna (setta) il modulo RTC
indiceset = 0; // azzera l'indice di tabdati e riprende le normali funzioni dell'orologio
}
void esponitabdati () //esposizione dei dati in via di settaggio
{
tempocorrente = millis ();
if ((tempocorrente - tempoprec) > 500) // espone solo se sono passati piu' di 5 decimi di secondo dall'ultima visualizzazione
{
tempoprec = tempocorrente;
riga = 0;
lcd.setCursor (6, 0);
lcd.print ("/");
lcd.setCursor (9, 0);
lcd.print ("/");
lcd.setCursor (6, 1);
lcd.print (":");
lcd.setCursor (9, 1);
lcd.print (":");
for (indicedati = 0; indicedati < 6; indicedati++)
{ // espone i parametri presenti in tabdati
if (indicedati > 2)
riga = 1;
datodaesporre = tabdati [(indicedati * 3) + 2];
lcd.setCursor (((indicedati - riga * 3) * 3) + 4, riga);
if (datodaesporre < 10)
lcd.print ("0");
lcd.print (datodaesporre);
}
riga = 0;
if (indiceset > 2)
riga = 1;
if (intermittenza == 1) // gestisce il blinking del parametro corrente
{
intermittenza = 0;
lcd.setCursor (((indiceset - riga * 3) * 3) + 4, riga);
lcd.print ("00");
}
else
{
intermittenza = 1;
datodaesporre = tabdati [(indiceset * 3) + 2];
lcd.setCursor (((indiceset - riga * 3) * 3) + 4, riga);
if (datodaesporre < 10)
lcd.print ("0");
lcd.print (datodaesporre);
}
}
}
void setup()
{
Serial.begin (9600);
pinMode (settaggio, INPUT);
pinMode (avanti, INPUT);
pinMode (indietro, INPUT);
pinMode (13, OUTPUT);
lcd.begin(16, 2);
lcd.backlight();
lcd.print (" buongiorno");
delay (1500);
sincronizzarduino (); // sincronizza il timer di arduino con i dati forniti da ds3231
lcd.clear();
}
void loop()
{
int ora_minuti = minute() ;
indiceset = 0;
indiceset = digitalRead (settaggio);
if (indiceset == 1) // se e' stato premuto il pulsante di settaggio
{ delay (500); // attende un secondo per evitare l'interpretazione di una doppia pressione)
acquisiscidati (); // lancia la routine di settaggio
}
tempocorrente = millis();
if ((tempocorrente - tempoprec ) > 900) // se e' passato piu' di un secondo dall'ultima visualizzazione
{
esponidati ();
tempoprec = tempocorrente;
}
if (ora_minuti != era_minuti) {
digitalWrite (13, HIGH);
delay(500);
digitalWrite (13, LOW);
era_minuti = ora_minuti ;
}
}