[TUTORIAL] Orologio/Cronometro con RTC e collegamento ad Internet (Parte 1 di 2)

TUTORIAL
differenza delay & millis pag.2
funzione aumenta ss:mm pag 2
fotoaccoppiatore pag.3
millis pag.3
cronometro pag.4
RTC pag.8
schetck finale e foto pag.15

ciao a tutti...
vorrei realizzare un semplice orologio con un lcd 16x2, con una piccola particolatita, quando gli viene dato un input dall'esterno (in teoria 24v ma in pratica si può abbassare con un semplice 7805 a circa 5 volt sul pin 2), scriva l'orario in cui gli è stato dato l'input e attivi un cronometro che conta da quanto tempo è stato eccitato il pin 2 finche non viene spinto un tasto si reset..
spero di essermi spiegato.. forse è piu facile a dirse che a farsi..
avevo dato un'occhiata alla funzione di interrupt ma non riesco a farla eseguire correttamente..
grazie mille in anticipo

Ciao,
hai varie possibili strade, alcune più semplici, altre un po' più articolate ...

La più semplice, senza scomodare gli interrupts, è che nel ciclo di loop leggi due piedini digitali ...
... uno per il segnale di partenza del "cronometro" e uno per il segnale di "stop" (... quello che chiami reset). Alla pressione del primo ti salvi in una variabile il valore di millis() e in una flag il fatto che è stato attivato (... così se arrivano attivazioni successive le ignori); alla pressione del secondo, fai la differenza tra il valore salvato e il millis() attuale e ... sai esattamente il tempo trascorso, resetti la flag e sei pronto ad un altro ciclo. :slight_smile:

Se poi hai paura di perdere il segnale di avvio perché è molto rapido e magari potrebbe sfuggirti ...
... complicando un pochino la cosa, non fai altro che mettere la prima parte (salvare millis() ed attivare la flag) in una ISR che leghi al tuo pin con un attachInterrupt() :wink:

Guglielmo

Da 24 a 5 é un bel salto e forse ti conviene abbasarla a 9 con un partitore di tensione.

PaoloP:
Da 24 a 5 é un bel salto e forse ti conviene abbasarla a 9 con un partitore di tensione.

E perché mai ??? :astonished:

Praticamente NON c'è assorbimento di corrente (deve andare a pilotare un pin digitale di Arduino) quindi ... dove è il problema :wink:

Guglielmo

Forse è meglio un traslatore di livelli, dipende da quanto è lungo l'impulso che arriva. In questo modo si separano anche i circuiti a 24V ed a 5V e si ha la necessaria velocità per far sì di non perdersi l'impulso per strada.

Beh ... allora, se si vogliono fare bene le cose ... la soluzione migliore è un bel foto-accoppiatore e hai separato del tutto i due ambienti :wink:

Guglielmo

Usare uno stabilizzatore per abbassare la tensione di un segnale é una cattiva idea. Gli stabilizzatori non sono fatti per questo e non funzionano bene senza carico.

La cosa piú sicura é usare un optocopler.
Un altra soluzione é usare un partitore e mettere in paralello al entrata un zener da 4,7V.

Ciao Uwe

uwefed:
Usare uno stabilizzatore per abbassare la tensione di un segnale é una cattiva idea. Gli stabilizzatori non sono fatti per questo e non funzionano bene senza carico.

Ovviamente, in quel caso, un minimo carico ce lo devi mettere, altrimenti lo stabilizzatore non è nella sua area di lavoro ... ma ne basterebbe uno veramente "minimo" ...

uwefed:
La cosa piú sicura é usare un optocopler.

Siamo pienamente d'accordo ... difatti l'ho scritto un post sopra :grin: :grin: :grin:

Guglielmo

Non ho letto bene. Pensavo parlasse dell'alimentazione, non del segnale.
Voto per il fotoacoppiatore. :wink:

Ciao... Grazie mille a tutti per le risposte.... Non ci sono grossi problemi per la velocità della impulso..
L impulso può stare eccitato da pochi minuti a diverse ore quindi il problema non sussiste.. Avevo pensato a un 7805 visto lo scarso carico e la scarsa velocità di eccitazione Dell input, ripeto può rimanere anche diverse ore eccitato..

@guglielmo.. Non devo usare la pressione di un tasto per farmi cambiare di stato il mio input ma quella famosa tensione di 24 volt che poi andremmo a variare..

Come ti è già stato detto ... la soluzione migliore, anche al fine di disaccoppiare il circuito a 24V da quello di Arduino, è quella di usare un foto-accoppiatore ... semplice, veloce ed indolore XD

Guglielmo

Sì sì sì... Ho letto vada per il fotoaccoppiatore.. Mi lo già documentando... :slight_smile:
Ora il problema più grande per me rimane come scrivere lo sketch..

Beh ... per quello alcune linee guida te le ho date all'inizio ... QUI :wink:

Guglielmo

si si l'ho visto e l'ho letto attentamente solo che non riesco a farla...:frowning:

geppopazzo:
si si l'ho visto e l'ho letto attentamente solo che non riesco a farla...:frowning:

Ma ... la parte orologio ... l'hai già fatta ???

Guglielmo

si si la parte dell'orologio è gia stato fatta la devo perfezionare ma a grandi linee c'e

Bé ... magari se posti il codice (mi raccomando, racchiuso tra i TAG "code", quelli che inserisce il bottone # che hai in edit) vediamo dove poter inserire la lettura dei due pin e il conteggio del tempo ... :roll_eyes:

Guglielmo

#include <LiquidCrystal.h>
int sec;
int minuto = 40;
int ora = 17;
LiquidCrystal LCD (7,8,9,10,11,12);
void setup() {
  LCD.begin(16, 2);
}

void loop() {
  for(sec=0; sec<60; sec++) {
    LCD.clear() ;
    if (ora<10) {LCD.print(" ");}
    LCD.setCursor(4,0);
    LCD.print(ora);
    LCD.print(":");
    if (minuto<10) {LCD.print("0");}
    LCD.print(minuto);
    LCD.print(":");
    if (sec<10) {LCD.print("0");}
    LCD.print(sec);

    delay(1000); //Provare con tempi minori per aumentare la precisione
  }
  minuto=minuto+1;
  if(minuto>59) {minuto=0; ora=ora+1;}
  if(ora>23);
}

spero di averci preso.....:):slight_smile:

Così però, se da un lato ti sei semplificato la vita, con un banale delay(), dall'altra, per quello che vuoi fare, te la sei complicata ... difatti, durante quel secondo .. il programma è completamente fermo ... :frowning:

Allora ...
... prova ad usare la stessa logica che hai usato con i minuti ... evitando il FOR, ma sfruttando la millis() per misurare il tempo in modo non bloccante.

Studiati per prima cosa QUESTO articolo e, quando lo hai assimilato, ti studi QUESTO qui.

Una volta che li hai ben capiti, comincia ad applicarli al questo tuo orologio, in modo da avere un ciclo loop() che, in realtà, non si ferma mai, ma gira in continuazione, condizionando l'incremento dei secondi (... e, di conseguenza, con la logica che già usi, dei minuti e delle ore) ad un semplice test su millis() :wink:

A quel punto sarà molto facile aggiungere la parte in più che vuoi tu ... :slight_smile:

Guglielmo

ottimo ora mi metto subito all'opera... grazie mille.. quindi ci risentiamo nei possimi giorni...:slight_smile:
grazie mille