arduclock

rieccomi questa volta non sono qui per chiedere info e delucidazioni ma per presentare il progetto che sto portando avanti da una settimana.

Qualcuno potrebbe dire che è un lavoro inutile visto che di orologi ormai sene trovano di tutti i tipi anche a prezzi bassissimi. Ma il pensiero di averlo costruito e completato è già una buona soddisfazione.
Dopo questo preambolo ecco una prima fotografia del mio orologio:

Come vedete è ancora da completare e il codice è ancora da completare ma la sua funzione principale funziona.
Arduino controlla i quattro display a sette segmenti con soli tre fili sfruttando uno shift-register (74hc595) il quale a sua volta comanda i 4 cd4511 (decoder bcd-7segmenti) per controllare la scheda display mi ero scritto una libreria alla quale io passo ore minuti e volendo anche una temperatura e lei scompone i valori delle ore dei minuti li invia allo shift-register selezionando il cd4511 in base al digit che devo controllare .
In fine posso controllare la luminosità con un pin aggiuntivo di Arduino.
Ecco una fotografia della scheda display

Per mostrare i secondi ho costruito una led bar composta da 5 led bicolori comandata sempre da shift-register in questo caso, ne ho utilizzati 2 perché in totale i led da comandare sono 10:5 verdi e 5 rossi con le varie combinazioni posso ottener 3 colori rosso verde e arancione.
Ecco una fotografia:

In fine per ottenere l'ora ho utilizzato un ds1307 comandato in I2c con batteria al litio di backup.

Per ora non è possibile regolare l'ora ma ho previsto con uno degli interruttori che ho messo una modalità di programmazione dove con il potenziometro regolo ora e minuti. In fine ho messo una foto resistenza per adattare la luminosità del display con la luminosità della stanza. Con molta luce il display sarà + luminoso per renderlo visibile mentre di con la stanza al buio la luminosità sarà + bassa.

In fine ho pensato di mettere un Buzzer che imita il ticchettio di un orologio analogico . ma sto incontrando qualche difficoltà perche quando utilizzo la funzione tone() il display lampeggia .
Qui mi sorge un dubbio, la funzione analogWrite() e la funzione tone() sono in un qualche modo collegate?

Be spero di riuscir a completare del tutto il mio orologio
Ora a voi commentate pure e criticate pure.
Ciao ciao

Non si vede una foto che sia una ::slight_smile:

bel lavoretto!!!

Ho dato un'occhiata alla libreria Tone ed essa utilizza i timer: forse con analogWrite salta qualche timing interno. Non so...

capisco allora cercherò un altro modo per riscreare il ticchettio

prblema risolto quando prima facevo partire il comando tone ho semplicemente usato il comando analogwrite ad un valore di 255 dopo 20 millisecondi a 100 e dopo altri 20 millisecondi lo setto a 0 tutto senza usare i delay ma basandomi sul millis()
cosi da non fermare il ciclo principale

ho implementato la parte della fotoresistenza che regola in modo automatica la luminosità di tutto e la regolazione di ore e minuti.
per programmare utilizzo 1 interuttore e 1 deviatore e il potenziomentro.
con l'interuttore entro nella modalita programmazione poi con il deviatore scelgo cosa programmare se ore o minuti poi con il potenziometro setto l'ora o i minuti. domani collego il sensore di temperatura e mettero' giu il codice per mostrare ogni minuto la temperatura sul display.
a breve caricherò un video che mostra il funzionamento

ecco il video :

come vedete quando metto il dito sulla fotoresistenza il display cambia luminosita ;D

L'unico appunto per un miglioramento del progetto sarebbe quello di togliere il potenziometro.
Quando vai a modificare l'orario vedo spesso che il display salta da un valore all'altro.

Per il resto è molto carino.

e li è la lettura del potenziometro che magari e li che varia tra un valore ed un altro e quindi sul dip ho questi problemi volendo potrei risolvere cn un encored ma non ho pin liberi da usare perche per interfacciare un encoder servono 2 pin e io non ne ho + di liberi anche di analogici tutto pieno.

Hai messo diversi pulsanti.
Potresti utilizzare il metodo di programmazione usato nelle comuni sveglie, ad esempio:
premi il tasto A per entrare in modalità regolazione;
premi il tasto B per cambiare ore (solo in avanti)
premi ancora il tasto A per spostarti sui minuti.
ecc...

era quello che volevo evitare perche è una cosa che non mi va dei normali orologi cinesi

Ah ah ah ;D ;D ;D

Allora prova a risolvere facendo un buffering del valore letto sulla porta collegata al potenziometro e fornendo solo la media di 5 letture per volta, oppure alza la soglia di rilevamento.

la prima soluzione mi va bene ma per la seconda non ho capito uina cosa in che senso alzare la sogli di rilevamento? io ho il potenziomentro collegato normalmente con un punto a 5 v uno a gnd e il punto centrela ad arduino nel programma io leggo il valore dal potenziomentro e con la funzione map() lo converto in sessantesimi per i minuti e in 24 parti per le ore .

Prova a rivedere la formula di conversioni di modo che ci voglia uno spostamento del potenziometro maggiore.

e ma la funzione map fa tutto da se e poi il valore in input è al massimo di 1024 a 5 v