Go Down

Topic: RISOLTO OROLOGI con caratteristiche "normali" es. visualizzare ore 9:10 / 09:10 (Read 1 time) previous topic - next topic

auriol

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.

lucadentella

Ciao

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

Code: [Select]
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: [Select]
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: [Select]
setChar(chip_id, 7, ' ', false);

fammi sapere se funziona!
lucadentella.it

auriol

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.

auriol

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.

lucadentella

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")
lucadentella.it

Go Up