Pages: 1 [2] 3   Go Down
Author Topic: Orologio RTC 7 segment 4 digit  (Read 2627 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato a caricare questo prendendo da bildr
Scusa se sono diretto, ma se continui a copia-e-incollare codice scritto da altri non imparerai mai.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa ma sto cercando di imparare e non vedo altri metodi visto che nessuno è tanto gentile da spiegarmi le cose...
Proposte?
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 568
Posts: 12550
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sì, muoversi con pazienza per piccoli passi, riparti dal display perfettamente funzionante che visualizza correttamente un qualsiasi valore numerico da te impostato. Al secondo step ricavati dalle istruzioni il comando per ricevere le ore o i minuti dall'RTC, a questp punto prova ad assegnare alla tua variabile di visualizzazione il valore ricevuto dall'RTC, una volta che riesci a vedere le ore procedi col resto.
Non avendo idea di come fare se cerchi di fare tutto non fai niente.
Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa ma sto cercando di imparare e non vedo altri metodi visto che nessuno è tanto gentile da spiegarmi le cose...
Proposte?
Questo non me lo dovevi dire.
Sono 2 pagine che ti sto mettendo link a tutto spiano, facendo quello che dovevi fare tu, ossia prendere Google e metterti a cercarti le cose che ti interessano. Dopo 2 pagine in cui ti ho dato tutti i link per poter fare la cosa con un MINIMO di impegno da parte tua, te ne esci che qui nessuno è tanto gentile da spiegarti le cose?

Facciamo così, mi PAGHi, io vengo a casa tua e ti faccio un corso dalla A alla Z.

Ora, se vuoi continuare a chiedere aiuto per favore impegnati a produrre qualcosa di TUO, altrimenti chiudiamo qui la discussione e tanti saluti. Ho fatto più di mezzanotte ieri a cercarti le cose e questo è il tuo ringraziamento??
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Non per fare il puntiglioso, 1:42.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Infatti è quello che ho fatto: ricapitolando..
Qualsiasi valore a 4 cifre io dia a time in questo sketch funziona
Code:
//Simple number displayer

#include "SevSeg.h"

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

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,1,2,3,4,5,6,7,8,9,10,11,12);
 
}

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

Il modulo RCT è settato e mi da i valori corretti nel monitor seriale caricando questo o questo esempio.
Secondo step: ho provato in due modi ma entrambi fanno si che alcuni segmenti si accendano molto flebilmente senza corrispondenza con l'orario...
Code:
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include "SevSeg.h"

SevSeg sevseg;

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

void loop() {
  tmElements_t tm;
  RTC.read(tm);
  int time = tm.Hour + tm.Minute;
  sevseg.PrintOutput(); //Produce an output on the display
  sevseg.NewNum(time,2); //Number to be displayed, the second argument is the , place

}

Code:
#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);

}


Per cui immagino ci sia qualche errore anche se a me sembra tutto a posto

leo72 è da quando bartolini mi ha portato il display e il RTC alle 10.32 che cerco su google e provo a far andare la cosa se non mi credi ti mando la cronologia...
Detto ciò aiutare i nabbi nei forum non è obbligatorio, se la cosa non ti fa piacere non farlo
« Last Edit: July 03, 2013, 08:23:38 am by maxidvd » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
RTC.read(tm);
  int time = tm.Hour + tm.Minute;
  sevseg.PrintOutput(); //Produce an output on the display
  sevseg.NewNum(time,2); //Number to be displayed, the second argument is the , place
Devi passargli l'orario ma tu però fai una somma delle ore e dei minuti. Se l'orario fosse ad esempio le 14:50, per come hai scritto tu otterresti: time = 14 + 50. Time varrebbe 64.
Se vuoi fare in modo che appaia un orario come un numero di 4 cifre, devi moltiplicare Hour per 100, in modo da "spostarlo" di 2 posti verso sinistra.
Quindi:
int time = (th.Hour * 100) + tm.Minute;

A questo punto dovrebbe funzionare perché le 14:50 diventano 1450. Mettendo la virgola al 2° posto, avresti 14.50

Quote
Detto ciò aiutare i nabbi nei forum non è obbligatorio, se la cosa non ti fa piacere non farlo
Aiuto chi si vuol fare aiutare. Se la persona è "sorda" ai miei suggerimenti non posso farci nulla.
Ad inizio thread ti avevo chiesto di controllare i link che li metti tutti errati... e continui a farlo.
Ti avevo detto di usare la libreria per l'RTC di Adafruit che è valida e funziona bene e ne stai usando un'altra. Non è che tu debba prendere per oro colato quel che ti dico ma se ti sto consigliando una cosa ci sarà un motivo, no?
Inoltre stai mettendo tutto insieme quando ora come ora bisognerebbe limitarsi al minimo indispensabile. A che ti serve, in questo momento, usare la libreria Time? Hai un RTC, togli la Time ed usa direttamente l'orario passato dall'RTC.

Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa per i link errati, ora li ho messi a posto.
Per la libreria RTClib di Adafruit l'ho provata come mi hai consigliato ma con l'esempio fornito nel monitor seriale mi venivano fuori caratteri casuali allora ho lasciato perdere...
Per la libreria time c'è perchè come hai visto parto da codici gia scritti e cerco di adattarli alle mie esigenze per iniziare con un nuovo componente e in quegli esempi c'era. Tuttivia siccome il progetto finale è una sveglia con una specie di wakelamp è probabile che mi servirà in futuro..

Intanto grazie infinite per il consiglio, appena ho la scheda sotto mano lo provo  smiley
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho letto la SevSeg. Ricordati anche che sevseg.PrintOutput() lo devi dare continuamente perché è quel comando che visualizza i numeri sul display. Devi spedirlo sempre, e più tempo passa fra un invio ed il successivo più i numeri sembrano lampeggiare.

Ti allego altri 2 link:
http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo
http://www.instructables.com/id/4-Digit-7-Segment-LED-Display-Arduino/

Spiegano il multiplexing di un display a 4 cifre, ossia accendere ogni cifra sequenzialmente, cosa che fa la SevSeg.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Funziona, grazie! smiley
Si ho visto che lampeggia se ci metto un delay ma per ora penso vada bene così..
Adesso il passo successivo è collegarlo al 74hc164 (fino a che non ordino il 74HC595) perchè sono a corto di pin...

Ho visto anche dal link di parallax.com che il collegamento che ho fatto io non è il massimo infatti è un po debole l'illuminazione (anodi direttamente ad Arduino, catodi con un 2.2k) mi sa che dovrò fare una cosa simile...
invece di quel codice ci ho capito ben poco e caricandolo mi da tutti 8 tremolanti smiley-roll

Per quello di instructables.com l'avevo visto però utilizza i casi facendoli uno per uno cosa che con SevSeg mi evito...

Grazie ancora!
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se potessi pubblicare anche uno schema dei collegamenti del tuo circuito non sarebbe male. Per capire quali e dove hai messo le resistenze di limitazione della corrente dei led dei segmenti.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ecco qui...
Le resistenze sono da 2.2k


* Arduino RTC LED clock_bb.jpg (838.96 KB, 2016x1263 - viewed 40 times.)
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

E' un metodo sbagliato perché così se accendi 1 solo segmento la sua luce sarà fioca. Devi usare una resistenza per ogni segmento, dimensionata opportunamente (in base al colore del led).
Negli schemi che ti ho linkato si vede l'uso di una R per segmento, non è uno sfizio ma un mustsmiley-razz
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Avevo seguito le istruzioni della libreria...
Code:
Connect the four digit pins with four limiting resistors in series to any digital or analog pins.
Connect the eight cathodes to any digital or analog pins.

Ho intenzione di collegarlo a un shift register e poi farò i collegamenti elettricamente corretti, al momento non so ancora che resistenze mettere per il display ne come usare uno shift register o quale prendere... ho uno 74hc164 ma mi sembra poco utilizzato rispetto al 74HC595...
Comunque non ho ancora fatto abbastanza ricerche.
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22755
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dipende dal tipo di led del display, poi con la formuletta classica:
R = (V - Vf) / I
calcoli la resistenza, dove V è la tensione di piltoaggio, Vf la tensione inversa del led (mediamente dipende dal colore, es.: led rosso = 1,8V) ed I la corrente di pilotaggio del led (mediamente 15/20 mA).
Prendi un led rosso con corrente di 15 mA:
R = (5 - 1,8) / 0,015 = 213 -> 220 ohm.

Ad ogni led devi quindi mettere una R da 220 ohm.
Logged


Pages: 1 [2] 3   Go Up
Jump to: