Pages: [1]   Go Down
Author Topic: RISOLTO OROLOGI con caratteristiche "normali" es. visualizzare ore 9:10 / 09:10  (Read 1287 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Continua la mia avventura con gli Orologi.
Ho notato che la quasi totalità (almeno quelli da me testati) degli orologi "amatoriali" alla mezzanotte anzichè visualizzare come tutti gli quelli commerciali  0:00 visualizzano 00:00 e questa anomalia continua fino alle ore 9:59 che viene visualizzata 09:59.
E' evidente che c'è uno zero di troppo anche se comprendo che nella logica di un contatore è normale il doppio zero.
Io vorrei realizzare un Orologio normale... senza doppio zero poi l'obiettivo finale è il radiocontrollo con onde radio o gps. Sul radiocontrollo mi sono un pò documentato sul GPS non ho al momento info.
Torniamo allo 00.
Allego una parte del codice dove ritengo si possa agire per condizionare la visualizzazione dell'ora senza zero iniziale fino alle 9:59

get_date_DS1307(&second, &minute, &hour, &day_of_week, &day_of_month, &month, &year, &sqwe, &bst_flag);
  // ---------------------     LEGGE IL TEMPO dal MAXIM DS RTC e lo visualizza   -----------------------------

  led_print(hour, 6);                               // Print the hour
  lc.setChar(chip_id, 5, '-', false);                // Print the divider
  led_print(minute, 3);                             // Now the minutes
  lc.setChar(chip_id, 2, '-', false);                // Another divider
  led_print(second, 0);                             // And the seconds just to make it look exciting!

Non so se sia semplice fare una cosa del genere e quale formula utilizzare.
E' fattibile senza eccessive complicazioni?
Riguardo il radiocontrollo onde radio o gps in pratica qual'è la soluzione migliore?
Grazie per i suggerimenti.
Saluti.
« Last Edit: May 05, 2012, 10:12:09 am by auriol » Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

senza modificare la libreria, ti basta un controllo sul primo carattere della variabile (immagino sia un char*) hour...

qualcosa tipo

if(hour[0] == '0') hour[0] = ' ';
Logged

lucadentella.it

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Avevo pensato a un qualcosa di simile, in pratica lo spegnimento condizionato del  primo display.
Domani faccio qualche prova.
Grazie.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho fatto diversi tentativi e quello che si avvicina alla soluzione

get_date_DS1307(&second, &minute, &hour, &day_of_week, &day_of_month, &month, &year, &sqwe, &bst_flag);
 
// Captures the current time from the Maxim clock IC

  if (hour<10 ){
  led_print(hour, 6);
  lc.setRow(chip_id, 7, 0);
  }
  else
  led_print(hour, 6);                               // Print the hour
 
  //if(hour[0] == '0') hour[0] = ' ';
  //led_print(hour, 6);
  lc.setChar(chip_id, 5, '-', false);                // Print the divider
  led_print(minute, 3);                             // Now the minutes
  lc.setChar(chip_id, 2, '-', false);                // Another divider
  led_print(second, 0);                             // And the seconds just to make it look exciting!

In effetti il display si spegne ma non in modo stabile, infatti emette dei lievi ma percettibili flash (tenta di visualizzare lo 0) ed è evidente che questa soluzione non è perfetta. La riga di comando suggerita mi da errore e probabilmente va incastrata meglio nel codice generale.
Saluti.
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

c'è qualcosa che non va... se hour è definito byte* (come dichiari hour?) non puoi considerarlo un numero e quindi fare "hour < 10"... che errore ti da in fase di compilazione? Puoi postare tutto lo sketch?
Logged

lucadentella.it

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allego il Link con il listato:
http://www.justblair.co.uk/Arduino-Shields/arduino-cloc-a-maxim-ds1307max7221-based-clock-with-auto-daylight-savings-adjustment.html
Il mio tentativo non da errori e spegne il display ma non è una soluzione accettabile perchè lo spegnimento non è permanente e lo zero cerca di visualizzarsi anche se in modo tenue ma percettibile.Sicuramente la tua soluzione matematica è migliore di fatto da 00 a 09 occorre ignorare/ eliminare lo 0 e solo dalle 10 in poi visualizzare le unità.
L'errore che ottengo è una riga arancione in zona visualizzazione via seriale (funzione che a me non serve proprio).
A parte la mia idea di non visualizzare lo 0 l'orologio funziona bene anche se ho aggiunto il termometro con LM35 più altre migliorie nei limiti di quello che so fare. Il listato è quello originale privo di modifiche.
Grazie per la collaborazione posso ricambiare con i file pcb con Eagle per montare in modo stabile l'orologio per chi li desidera.
L'ultima spiaggia poi è il Radiocontrollo, ma al momento non sono in grado di integrare questa funzione che rende l'orologio autonomo al 100%
Saluti.
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

forse ho capito... il tuo problema sta nella funzione led_print():

Code:
void led_print(int time_int, int pos) {             
  byte ones, tens;                                 
  ones=time_int%10;                                 
  tens=time_int/10%10;                             
  lc.setDigit(chip_id, pos, (byte) ones, false);   
  lc.setDigit(chip_id, pos+1, (byte) tens, false);
}

Come vedi questa funzione accetta un numero in ingresso e lo divide (modulo e resto) in decine e unità... ovviamente se la tua variabile hour vale 6, nella funzione avrai ones=6 e tens=0.

senza modificare la funzione puoi fare così nel tuo sketch:

Code:
if (hour<10 ) {
  led_print(hour, 6);
  lc.setDigit(chip_id, 6, hour, false);
  }
  else
  led_print(hour, 6);

in questo modo non vai a scrivere nulla nella posizione 7...
se poi vuoi assicurarti che ci sia proprio uno spazio in tale posizione puoi esplicitamente aggiungere sotto la setDigit questo:

Code:
setChar(chip_id, 7, ' ', false);

fammi sapere se funziona!
Logged

lucadentella.it

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie
Ho letto ma adesso sono un pò stanco perchè cerco di essere pure io di aiuto, almeno per le mie conoscenze più orientate all'elettronica che alla programmazione, domani con calma provo.
E' un buon Orologio e appena ultimato posso postare il listato modificato con il termometro integrato e alcune migliorie di visualizzazione.
Saluti.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve.
Ho provato adesso ma con la prima prova tutto come prima ciè es. visualizza 09 poi ho inserito la seconda riga oggetto del suggerimento inizialmente mi dava errore, ma solo perchè non mi sono reso conto di anteporre lc. fatto ciò nessun errore! caricato il codice il risultato è stato purtroppo pari pari quello da me ottenuto cioè il display si spegne ma con tentativi flash di far apparire lo zero, ritengo si debba intervenire dal punto di vista matematico e se non ho capito male condizionare la funzione che elabora i dati provenienti dal DS inerenti le ore. Cioè le ore comprese fra  00   e  09   devono risultare in pratica comprese fra  0 e 9 , solo dal 10 in poi tutto deve ritornare come prima.  In questo modo nessuno zero può tentare di visualizzarsi sul primo display perchè inesistente.
Ottenuto ciò probabilmente non ocorre altro e nemmeno spegnere il display considerato che i numeri da visualizzare fino a 9 sono rappresentati da un solo numero.
Riporto comunque la parte oggetto della modifica apportata su suggerimento:

if (hour<10 ) {
  led_print(hour, 6);
  lc.setDigit(chip_id, 6, hour, false);
  lc.setChar(chip_id, 7, ' ', false);
  }
  else
  led_print(hour, 6);                               // Print the hour
 
  lc.setChar(chip_id, 5, '-', false);                // Print the divider
  led_print(minute, 3);                             // Now the minutes
  lc.setChar(chip_id, 2, '-', false);                // Another divider
  led_print(second, 0);                             // And the seconds just to make it look exciting!

Al momento non sono in grado di impostare la formula giusta condizionata, per ottenere in modo stabile questo risultato.
Penso non sia difficile per gli esperti in C.
Grazie .
Saluti.
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao

refuso mio! quando l'ora è < 10 non devi mettere la led_print ma solo lc.setDigit(chip_id, 6, hour, false);
(ed eventualmente anche la seconda riga di "pulizia")
Logged

lucadentella.it

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Adesso va bene il Display rimane perfettamente al buio, ma occorre necessariamente la riga di pulizia pena visualizzazione di numeri impropri è capitato ad es. invece di ore 8 ore 28.

if (hour<10 ) {
  lc.setDigit(chip_id, 6, hour, false);
  lc.setChar(chip_id, 7, ' ', false);
  }
  else
  led_print(hour, 6);                               // Print the hour
  lc.setChar(chip_id, 5, '-', false);                // Print the divider
  led_print(minute, 3);                             // Now the minutes
  lc.setChar(chip_id, 2, '-', false);                // Another divider
  led_print(second, 0);                             // And the seconds just to make it look exciting!

Adesso l'orologio ha un aspetto meno "amatoriale" ed è del tutto simile agli orologi commerciali, questa modifica contribuisce  anche (seppur in modo marginale) al risparmio energetico spegnendo un inutile display che a "peso morto" visualizzava uno 0. Gli manca solo l'automatismo (che non è oggetto del testo) del radiocontrollo che lo renderebbe privo di manutenzione ordinaria (che comunque grazie all'encoder è semplice) ma comprendo bene che si tratta di modifiche ben più complesse e dispendiose di tempo di quella oggetto del testo, cercherò di documentarmi in tal senso ma non mi pare che ci sia molto in giro, a parte un progetto con PIC.
Comunque grazie già così è uno dei migliori Orologi con display a Led 7 segmenti, l'unico ad oggi (eccetto i dot Matrix) che consente la realizzazione di grandi dimensioni con opportuna interfaccia hardware (già in progetto) per display a 12V tipo Big. (Futura Elettronica).
Sempre disponibile per info costruttive.
Saluti
« Last Edit: May 05, 2012, 10:33:48 am by auriol » Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ottimo! ma una foto di questo orologio? smiley-wink
con radiocontrollo intendi la possibilità di ricevere il segnale orario via DCF/GPS?
Logged

lucadentella.it

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si certo.. ho ordinato on line il DCF... ma non è ancora pervenuto l'orologio è destinato ad una Scuola per cui è meglio l'automatismo.
(Qualcuno parla anche di sistemi GPS di sincronizzazione, ma penso siano più costosi e a dire il vero non mi sono documentato in tal senso.
Per la foto ho già pubblicato in altro thread ma è giusto fare una foto aggiornata con la nuova modifica che è perfetta, adesso è acceso da diverse ore e ho testato le ore 23:59 e poi 9: 59 e tutto va bene ma per quando non sia esperto di codice è evidente che il codice in questa zona non fa una grinza! e potevo anche non provare.
Le Foto..
http://www.flickr.com/photos/77672764@N06/7145418955/in/photostream
http://www.flickr.com/photos/77672764@N06/7145420287/in/photostream
Dove si può notare che si tratta di un sistema "Stand alone" con connettore di programmazione e relativo programmatore USB/Seriale multiuso, appena posso inizio a progettare la scheda di interfaccia per display Big che prevede (salvo modifiche) 4 Chip di cui un' altro Max 7219 che lavorerà in parallelo (in modo da avere un display piccolo che fa da monitor e uno grande da sala) gli atri tre chip riguardano 2 array Darlington UDN2961 a 8 vie e un inverter 4093.
Saluti. e Grazie per il prezioso aiuto.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per chi fosse interessato alla costruzione e a questa modifica preciso che il problema sussiste anche nella visualizzazione della data, ma conoscendo adesso la strada giusta.... ho apportato la modifica anche alla data e ha funzionato subito riporto la modifica:

if (day_of_month<10 ) {
  lc.setDigit(chip_id, 6, day_of_month, false);
  lc.setChar(chip_id, 7, ' ', false);
  }
  else                                                      // END Modifica ----------------------
    led_print(day_of_month, 6);                     // Print the hour
    lc.setChar(chip_id, 5, '-', false);             // Print the divider
    led_print(month, 3);                            // Now the minutes
    lc.setChar(chip_id, 2, '-', false);             // Another divider
    led_print(year, 0);                             // And the year
Colgo l'occasione per includere il Link dove trovate lo schema elettronico di base (inesistente nel progetto originale)
e ringrazio nuovamente per l'aiuto risolutivo della problematica segnalata.
Saluti.
http://www.flickr.com/photos/77672764@N06/7147561419/in/photostream
Logged

Pages: [1]   Go Up
Jump to: