Go Down

Topic: Orologio RTC 7 segment 4 digit (Read 3 times) previous topic - next topic

maxidvd

Jul 02, 2013, 09:41 pm Last Edit: Jul 02, 2013, 10:04 pm by leo72 Reason: 1
Salve,
vorrei costruire un orologio con un display 7 segment e il DS1307... poi vorrei aggiungerci funzioni ma quello verrà dopo
Fino ad ora sono riuscito a far funzionare il display da solo con la libreria SevSeg e ho provato ad inserire anche un int al posto del valore ma non riesco a farlo comunicare con lo sketch di esempioTime...
Code: [Select]
//Simple number displayer

#include "SevSeg.h"

//Create an instance of the object.
SevSeg sevseg;
int time = 1820; //Example number

void setup() {
 //I am using a common anode display, with the digit pins connected
 //from 2-5 and the segment pins connected from 6-13
 sevseg.Begin(0,2,3,4,5,6,7,8,9,10,11,12,13);
 
}

void loop() {
 sevseg.PrintOutput(); //Produce an output on the display
 sevseg.NewNum(time,2); //Number to be displayed, the second argument is the , place
 
}


Qualcuno potrebbe aiutarmi? :)

PS: in futuro vorrei pilotare il display con il 74HC595 e questa libreria però non ce l'ho ancora e non voglio aspettare il prossimo ordine per averlo... intanto ho un 74HC164 solo che non ho trovato nulla di analogo...

edit by mod:
di 4 link che hai messo, non ce n'era uno corretto... bisogna controllare i messaggi prima di pubblicarli
  :P

leo72

La libreria Time di per sé è imprecisa. Senza hardware esterno o senza mezzi per poter aggiornare l'orario dipende dall'imprecisione del risonatore ceramico, molto elevata.
Parti subito prevedendo un RTC esterno per non dover poi buttar via mezzo codice.

Se cerchi in rete ci sono una MAREA di esempi di orologi fatti con i display a 7 segmenti. Cerca e troverai quello che fa per te.

maxidvd

Sì sì come ho scritto il rtc è previsto e intendevo lo sketch che lo includeva
ho cercato tutto il giorno ma non ho trovato nulla che utilizzasse il mio hardware o come voglio io...

Potresti aiutarmi?

leo72

Ricapitoliamo.
Di che HW disponi al momento? Non quello che vuoi acquistare, ma quello che hai ora in mano.

maxidvd

#4
Jul 03, 2013, 12:48 am Last Edit: Jul 03, 2013, 01:02 am by leo72 Reason: 1
Arduino UNO
7-Segment Display
Real Time Clock Module
74HC164
Questo è il materiale che ho al momento.. Grazie in anticipo :)

leo72

Il display già lo piloti senza problemi.
L'RTC si aggancia ai pin A4 e A5 (oppure SDA/SCL se hai una UNO R3) e su internet trovi tanti esempi di codice e librerie. Io uso quella di Adafruit:
https://github.com/adafruit/RTClib

Una volta connesso, non devi fare altro che chiedere all'RTC l'ora e visualizzarlo sul display come già stai facendo.

maxidvd


Una volta connesso, non devi fare altro che chiedere all'RTC l'ora e visualizzarlo sul display come già stai facendo.

Mi mancava appunto questo passaggio... non riesco a prendere il valore hh.mm e darlo al display  :smiley-roll:

leo72

Hai cercato "ds1307 arduino" su internet? No, perché altrimenti non facevi la domanda: 172.000 risultati.
Devi dare alimentazione a quel modulo con VCC e GND presi dai pin di Arduino, poi collegare SDA e SCL ai pin che ti ho detto. Per usare la libreria non devi fare altro che leggere:
http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit
A questo punto interroghi l'RTC, prendi ora e minuti e poi li passi alla libreria SevSeg che stai usando.

Di più veramente non posso, mica posso farti io il codice, eh!  ;)

maxidvd

Ho già fatto tutto ciò, l'unico passaggio che mi manca è prendere il valore dall'RTC e darlo al display...
Non so come si fa! Non conosco abbastanza il codice... ho chiesto solo un aiuto eh :|

leo72

Maxidvd, hai letto il link che ti ho passato?
Lì c'è tutta la spiegazione di come collegare un RTC, c'è il codice da usare e c'è spiegato come usarlo.


maxidvd

Letta già prima, provati gli esempi e funziona tutto fino a che è nel monitor seriale... ma non so come prendere le ore e i minuti, farci un numero a 4 cifre e darlo al display.
Ripeto mi manca quella linea di codice per passare da uno all'altro

Michele Menniti

Hai detto che non ti funziona l'esempio che hai postato, cioè non riesci a visualizzare nulla sul display nemmeno con quell'esempio banale? prova a cambiare nome alla variabile "time", che non stia andando in conflitto software con il linguaggio o con la libreria dell'RTC
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

maxidvd

Nono, il display e il RTC funzionano da soli ma non so che valori prendere dal RTC e in che modo metterli nell'int "time" per farli andare assieme

Michele Menniti

nel link che ti ha passato leo è spiegato come prelevare le ore ed i minuti dall'RTC, una volta che hai questi valori li devi assegnare alla variabile time, facendo attenzione ai tipi, dov'è la difficoltà?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

maxidvd

#14
Jul 03, 2013, 10:36 am Last Edit: Jul 03, 2013, 03:25 pm by maxidvd Reason: 1
Ho provato a caricare questo prendendo da bildr e da quello postato ieri ma non va.. cioè si vedono delle cifre appena visibili e sbagliate
Code: [Select]
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#include "SevSeg.h"

SevSeg sevseg;

void setup(){
 Wire.begin();
 sevseg.Begin(0,1,2,3,4,5,6,7,8,9,10,11,12);
}


void loop() {
 printDate();
 
}

byte bcdToDec(byte val)  {
 // Convert binary coded decimal to normal decimal numbers
 return ( (val/16*10) + (val%16) );
}

void printDate(){

 // Reset the register pointer
 Wire.beginTransmission(DS1307_ADDRESS);

 byte zero = 0x00;
 Wire.write(zero);
 Wire.endTransmission();

 Wire.requestFrom(DS1307_ADDRESS, 7);

 int second = bcdToDec(Wire.read());
 int minute = bcdToDec(Wire.read());
 int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
 int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
 int monthDay = bcdToDec(Wire.read());
 int month = bcdToDec(Wire.read());
 int year = bcdToDec(Wire.read());
 int time = hour + minute;

 sevseg.PrintOutput();
 sevseg.NewNum(time,2);

}



Go Up