Binary Clock

ciao a tutti!

ho realizzato questo Binary Clock, prendendo spunto da uno visto in un negozio di gadget tempo fà!

L'idea mi è saltata fuori dipo il ritrovamento di due integrati SAA1064 in alcuni display di fotocopiatori! Dopo un'attento studio del data sheet e appreso l'uso della comunicazione I2C, in pochi minuti sono riuscito a scrivere "CIAO" sui 4 display a 7 segmenti presenti sul modulo!

bene, fatto ciò, ho dissaldato l'integrato e montato su BB! due ressistenze, un paio di NPN e una manciata di led.....ho creato il layout dell'orologio che avevo in mente!

Standard più che altro. l'ora viene visualizzata in BCD, quindi non in binario puro!

ho trovato un'immagine su google per spiegare meglio la disposizione dei led e la lettura! ma a voi non serve :wink:
Binary Clock

in allegato un'immagine del mio in fase di sviluppo!

allora, al momento ho deciso di usare la swRTC di Leo, e devo dire che funziona egregiamente! ma sono incappato in un problema di calcoli e visualizzazione che non riesco a superare in amniera semplice! forse voi più svelti con i calcoli in binario, avete già una soluzione pronta! :slight_smile:

in pratica io mi muovo così:

#include <Wire.h>
#include <swRTC.h>

byte saa1064 = 0x76 >> 1; 

byte Ore, Minuti, Secondi = 0;

swRTC rtc;


void setup()
{
  Wire.begin(); 
  delay(500);
  rtc.stopRTC();
  rtc.setTime(12, 18, 30);
  rtc.setDate(5, 4, 2012);
  rtc.startRTC();
  initDisplay();
}

void initDisplay()

{
  Wire.beginTransmission(saa1064);
  Wire.send(B00000000); 
  Wire.send(B01000111); 
  Wire.endTransmission();
}

void displayDigits()

{
  
    Wire.beginTransmission(saa1064);
    Wire.send(2);
    Wire.send(Secondi); // digit 1
    Wire.send(Minuti); // digit 2
    Wire.send(Ore); // digit 3
    Wire.endTransmission();
    delay(500);

}

void clearDisplay()

{
  Wire.beginTransmission(saa1064);
  Wire.send(2);
  Wire.send(0); // digit 1
  Wire.send(0); // digit 2
  Wire.send(0); // digit 3
  Wire.endTransmission();
}

void loop()
{
  
  clearDisplay();
  Secondi = rtc.getSeconds();
  Minuti = rtc.getMinutes();
  Ore = rtc.getHours();
  
  //Qui serve l'aiuto per la conversione BCD!!!

  displayDigits();


}

Lasciandolo così, funziona, ma non in BCD. il conteggio procede naturalmente in binario! ma nel modo in cui dovrebbe funzionare, nella prima riga di destra, arrivato a 9 deve ripartire da 0 e segnare 1 della seconda colonna da destra, per creare appunto il 10!
non sò se mi sono spiegato bene.

credevo inizialmente di aver risolto aggiungendo 6 ai byte dal 10 al 15, ma il problema si ripresenta arrivati a 19!!

in somma, sono arrivato ad annodarmi il cervello, e prima che iniziassi a delirare e parlare in binario col prossimo, ho deciso di scrivere qui! :slight_smile:

sò già che mi sono espresso da cane, quindi resto qui a rispondere a chiarimenti, in caso!

grazie!!

:stuck_out_tongue:

Grande Leo! la tua libreria è sconvolgentemente facile da usate! Strabiliante! 5 stelline!!!

ma trovare un modo per far gestire la batteria tampone all'arduino? magari al solo stand-alone? tipo, un pin che polita un transistor che alimenta il il chip se manca l'alimentazione primaria. e magari a conseguenza di ciò, lo manda in sleep per non consumare troppo. boo! "idee passanti"!

:drooling_face:

z3us:
L'idea mi è saltata fuori dipo il ritrovamento di due integrati SAA1064

Ciao, pure io oggi ho trovato un SAA1064.
Stavo leggendo il datasheet e inviando dati, ma per ora non ho acceso nemmeno un segmento.
Quindi ti chiedo gentilmente un' aiutino:

z3us:
Wire.beginTransmission(saa1064);
Wire.send(B00000000);
Wire.send(B01000111);
Wire.endTransmission();

Ad esempio qui hai inviato un "control register" (perche' ?)
seguito dalle istruzioni che specificano di usare 4 digit alla massima potenza.. Ma i bytes da inviare non dovevano essere sempre 7 ? Perche' hai fatto una endTransmission prima di inviare i 4 bytes mancanti ?

z3us:
Wire.beginTransmission(saa1064);
Wire.send(2);
Wire.send(Secondi); // digit 1
Wire.send(Minuti); // digit 2
Wire.send(Ore); // digit 3
Wire.endTransmission();

Qui hai inviato il numero 2 (numero 2 ? Perche? )

CIAO

Ciao acik

in effetti non è di immediata comprensione! Ma ti spiego io.

allora: Per prima cosa, il SAA và settato ogni volta che lo devi usare. i settaggi rimangono finche è alimentato, quindi li fai nel setup() e via!

step1: Apri la comunicazione I2C.
step2: Invii 0 (B00000000) così che lui capisca che lo vuoi settare.
step3: invii la configurazione, che nel dettaglio si trova alla fine di pagina 6 del datasheet. Mi dilungo per spiegarla. se lasci il primo bit a 0 il SAA si mette in modalità 2 display, se lo metti a 1 invece, si attiva la modalità 4 display multiplexer. il secondo e il terzo bit non sò a cosa possano servire nel pratico, ma attivano o disattivano i display, quindi vanno a 1 entrambi. il quarto bit serve per testare, se lo metti a 1 si accendono tutti i segmenti di tutti i dislay. invece il quinto, sesto e settimo regolano la corrente. occhio che sono cumulativi, quindi puoi fare le somme tra i vari valori o usarli singolarmente.
step4: chiudi la comunicazione I2C.

adesso il SAA è pronto per funzionare!
passiamo alla visualizzazione:

step1: Apri la comunicazione I2C.
step2: invii il numero del display dal quale vuoi partire, e poi i seguenti vanno a cascata. ti spiego, ad esempio se vuoi scrivere CIAO ti servono tutti e 4 i display e devi partire dal primo a scrivere la C. Quindi invii 1 (B00000001), così facendo scriverai il primo carattere sul primo display, e quando invierai il secondo sarà direttamente sparato sul secondo display e via dicendo. se però devi scrivere PIO e vuoi partire a scriverlo dal 2° display, invii 2 (B00000010) così facendo lui invierà la P al 2° display, e poi al 3° e poi al 4°, ignorando il 1°! ok?
step3: invii i dati ai display in consecutiva a partire da quello che hai scelto prima!
step4: Chiudi la comunicazione I2C.

se qualcos'altro non ti è chiaro, chiedi pure, che ormai lo conosco bene sto SAA!

ciao!

z3us:
Grande Leo! la tua libreria è sconvolgentemente facile da usate! Strabiliante! 5 stelline!!!

Grazie :wink:

ma trovare un modo per far gestire la batteria tampone all'arduino? magari al solo stand-alone? tipo, un pin che polita un transistor che alimenta il il chip se manca l'alimentazione primaria. e magari a conseguenza di ciò, lo manda in sleep per non consumare troppo. boo! "idee passanti"!

:drooling_face:

Ci avevo già pensato, e la libreria di per sé sull'Arduino può continuare a lavorare anche col chip in sleep. Il problema è però l'accuratezza. Eseguendo dei test ho notato che mantenere il chip in sleep e continuare a far aggiornare l'orario porta ad un aumento dell'intervallo temporale conteggiato.
Mi spiego. Quando metti il micro in sleep non è come spengere una lampadina con un interruttore: il micro esegue una serie di operazioni affinché il successivo "risveglio" possa avvenire in maniera corretto e la ripresa dell'esecuzione del codice dal punto in cui era stato interrotto. Al momento del risveglio il discorso è identico: il micro impiega un certo lasso di tempo, seppur brevissimo, per tornare allo stato di piena operatività. Pensa che la libreria entra ed esce dallo sleep 1000 volte al secondo, tanti sono gli overflow del contatore interno ed i relativi interrupt che risvegliano il micro. I 2 tempi di cui sopra, sommati, portano ad un visto rallentamento del conteggio del tempo, con tutti i problemi del caso.

L'unica alternativa potrebbe essere quella di far lavorare il micro ad una frequenza molto bassa, per contare il tempo a te basterebbe anche un clock di 1 MHz. Ad 1 MHz puoi alimentare l'Atmega328 a 2,7V se hai il core "P", a 1,8V se hai i nuovi core "PA".

PS:
manca ancora la foto del tuo orologio :wink:

z3us:
adesso il SAA è pronto per funzionare!
passiamo alla visualizzazione:

Quindi in qualsiasi momento posso inviarevdue bytes: il primo per selezionare il display, il secondo per inviare i dati....

Ok, domani mattina ci riprovo.
Grazie

Grazie Leo per le delucidazioni!

quindi, da ciò che ho appreso, è difficile immettere una correzzione per il tempo "perso" per lo sleep e il risveglio, giusto?

per la questione frequenza, ti appoggio pienamente! tanto che, l'idea finale era quella di usare in Attiny85. in quanto mi occorrerebbero solo i due pin per l'I2C e un eventuale tasto o al massimo due per impostare l'orario o simili! Di base mi pare che l'Attiny lavori a 1Mhz giusto? e la tua libreria funziona anche lì!
con questo, potrei alimentare il tutto con un piccolissimo alimentatore e un pacco batterie per il backup! vedremo!

@acik: si, esatto. se il primo byte è 0 lui entra nel setup, se invece è compreso tra 1 e 4 invii i dati ai 4 display!

ciao

la foto...... dimenticata la 2° volta!

z3us:
quindi, da ciò che ho appreso, è difficile immettere una correzzione per il tempo "perso" per lo sleep e il risveglio, giusto?

Lo scarto è troppo elevato. Conviene tenere il micro sveglio.

per la questione frequenza, ti appoggio pienamente! tanto che, l'idea finale era quella di usare in Attiny85. in quanto mi occorrerebbero solo i due pin per l'I2C e un eventuale tasto o al massimo due per impostare l'orario o simili!

Rammentati che per usare l'I2C sui Tiny devi utilizzare la libreria TinyWire con le modifiche che ho segnalato nella mia guida però sei "legato" ad usare l'IDE 0022 perché con la 1.0 non ho ancora provveduto a verificare se tutte le cose funzionano perfettamente.
Per regolare l'orario ti servono minimo 2 tasti: 1 per entra/prossimo/ok ed 1 per scorri/esci.

Di base mi pare che l'Attiny lavori a 1Mhz giusto? e la tua libreria funziona anche lì!

Tutti i micro Atmel escono di fabbrica preimpostati a 1 MHz.
La swRTC lavora anche con clock di 1 MHz.

con questo, potrei alimentare il tutto con un piccolissimo alimentatore e un pacco batterie per il backup! vedremo!

Dipende se l'alimentatore deve servire tutto il circuito oppure solo il Tiny. Devi tener conto del consumo dei led, principalmente.

giusto leo! Devo un po vedere i led quanto ciucciano, anche perche credo che metterò dei bianchi alta intensità!

per la conversione in BCD sapete darmi qualche dritta?..... mi manca solo questo per ultimare il codice, almeno quello di base!

z3us:
giusto leo! Devo un po vedere i led quanto ciucciano, anche perche credo che metterò dei bianchi alta intensità!

Quelli ad alta luminosità lavorano sempre con la tensione nominale classica ed il consumo di corrente dei normali led. Diverso è il discorso dei led ad alta potenza.

per la conversione in BCD sapete darmi qualche dritta?..... mi manca solo questo per ultimare il codice, almeno quello di base!

Beh, ci sono degli algoritmi che eseguono tale operazione. Ad esempio alcune liberie per i DS1307 integrano le conversioni da bit a decimali e viceversa.
Sennò puoi scrivere qualcosa di tuo. Considera che per rappresentare cifre da 0 a 9 hai bisogno di 4 bit. Puoi operare sui singoli bit usando le funzioni precostituite di Arduino bitRead, bitClear, bitSet. bitWrite (le trovi nel reference del sito).

Sto preparando la struttura per contenere l'orologio!

un po di cnc domenicale!

i 20 quadrati 3x3cm ospiteranno un led blu ciascuno, i 3 rettangoli grossi l'elettronica!

il tutto verrà ricoperto da un foglio di carta opaca e poi da una maschera, tipo stencil con incise delle figure da definire. sembrerà un oggetto strano con led che accendono e spengono, ma ad un occhio più da Nerd, si rivelerà un orologio!

Vedrete più avanti!

sotto i passaggi per i collegamenti dei led!

ciao!

Curioso... :smiley:

popolo di smanettoni, aiutatemi!

come diffondo bene la luce superdiretta di un led in un cubo di 30x30x10mm?

mi pare di aver letto da qualche parte che limando la punta del led, la lente quidni, perdo un po di luminosità totale, ma si ottiene un fascio più diffuso! è vero?

o mi devo rassegnare a metterlo di lato o usarne due ai due lati?

:.

z3us:
Sto preparando la struttura per contenere l'orologio!

un po di cnc domenicale!

i 20 quadrati 3x3cm ospiteranno un led blu ciascuno, i 3 rettangoli grossi l'elettronica!

il tutto verrà ricoperto da un foglio di carta opaca e poi da una maschera, tipo stencil con incise delle figure da definire. sembrerà un oggetto strano con led che accendono e spengono, ma ad un occhio più da Nerd, si rivelerà un orologio!

Vedrete più avanti!

sotto i passaggi per i collegamenti dei led!

ciao!

Complimenti sopratutto per la struttura :slight_smile: un giorno riuscirò a costruirmi una cnc!

z3us:
popolo di smanettoni, aiutatemi!

come diffondo bene la luce superdiretta di un led in un cubo di 30x30x10mm?

mi pare di aver letto da qualche parte che limando la punta del led, la lente quidni, perdo un po di luminosità totale, ma si ottiene un fascio più diffuso! è vero?

o mi devo rassegnare a metterlo di lato o usarne due ai due lati?

:.

Coprilo con un qualche materiale opaco. Basterebbe anche un po' di carta

si l'idea era proprio quella! volevo però attenuare il pallino blu che si formava.

bhe, ho 100 led, uno lo posso limare per prova..... immolato per la scienza! :smiley:

leo, approposito, non ho ancora guardato come hai fatto, ma posso fregarti un pezzo del codice del "multiplexato" per impostare l'ora sul mio binary?

Se volevo che non mi copiavano il codice, non lo mettevo lì :wink:
L'unica cosa, è sotto licenza CC 3.0 SA-BY-NC (abbasso il closed source) quindi se lo usi, dammene credito, distribuiscilo anche tu sotto CC e non farci soldi sopra :stuck_out_tongue_closed_eyes:

bene Capo!

la ringrazio! :wink: