Pages: [1]   Go Down
Author Topic: Simulazione 7 segment  (Read 327 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vorrei simulare con 7 led il display a 7 segmenti, aiutatemi a finire il codice e amodificarlo se c'è ne bisogno(sicuramente smiley)
il codice è il seguente:
Code:
int top = 13;
int topl= 12;
int topr = 11;
int cent = 10;
int lowl = 9;
int lowr = 8;
int low = 7;

int num_1[] = {1, 0, 0, 1, 0, 0, 1};
void setup()
{
  pinMode(top, OUTPUT);
  pinMode(topl, OUTPUT);
  pinMode(topr, OUTPUT);
  pinMode(cent, OUTPUT);
  pinMode(lowl, OUTPUT);
  pinMode(lowr, OUTPUT);
  pinMode(low, OUTPUT);
 
}

void loop()
{
  digitalWrite(num_1[], HIGH);
}

top equivale al led più alto
topl equivale al led alto a sinistra
topr equivale al led alto a destra
cent equivale al led centrale
lowl equivale al led basso a sinistra
lowr equivale al led basso a destra
low equivale al led piu basso

num_1 crea il numero 1 utilizzando solo i led centrali
num_2 crea il numero 2 utilizzando il led più alto quello alto-destra quello centrale quello in basso a sinistra e quello più in basso...
...e così via...

 _    -->led piu alto  (top)
|_|  -->led alto sinistra, centrale, alto a destra (topl , center , topr)
|_|  -->led basso sinistra, basso, basso destra (lowl , lowr , low)

spero che sia esauriente, grazie anticipatamente... smiley-cool
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ti consiglio di adeguarti alla disposizione tradizionale dei segmenti in un display, altrimenti poi ti potresti incasinare se volessi convertire del codice scritto per un vero display a 7 segmenti.

Il primo led è quello in alto (A), a seguire non c'è quello in alto a sinistra ma quello in alto a destra, e così via. Attento anche al consumo: ricordati che da ogni porta non possono uscire più di un centinaio di mA, se fai scorrere troppa corrente potresti danneggiare l'Arduino. Siccome stai usando 6 pin della porta B (da D13 a D8), potresti avere problemi.


* 7_segment_display_labeled.svg.png (9.83 KB, 300x300 - viewed 2 times.)
Logged


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

si è solo una mia convenzione, ma si puo cambiare facilmente, sto cercando qualcuno che mi aiuti a finire il codice!!!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I segmenti sono 7, puoi benissimo memorizzarli in una variabile di tipo byte sotto forma di singoli bit. La posizione del bit nel byte corrisponde così al segmento/led da accendere: 1° bit (posizione 0)=1° led, ecc..
Lo stato di acceso/spento corrisponde quindi al valore del bit: 1=acceso, 0=spento.

Per gestire i bit puoi usare le funzioni di Arduino che manipolano i singoli bit:
http://arduino.cc/en/Reference/Bit
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2747
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Magari è superfluo dirtelo, ma lo sai che un display a 1 o più cifre lo puoi gestire con 4 pin (invece di 7) + n display con i driver BCD serie SN o 40
ciao
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

Ecco il codice finito: (ci sono pure le convenzioni che mi avete consigliato nel forum) ho messo pure la possibilità di un punto che un vero schermo!!!  smiley-cool smiley-cool smiley-cool
Code:
byte seven_seg_digits[10][7] = {
//Arduino pin: 2,3,4,5,6,7,8
             { 1,1,1,1,1,1,0 },  // = 0
             { 0,1,1,0,0,0,0 },  // = 1
             { 1,1,0,1,1,0,1 },  // = 2
             { 1,1,1,1,0,0,1 },  // = 3
             { 0,1,1,0,0,1,1 },  // = 4
             { 1,0,1,1,0,1,1 },  // = 5
             { 1,0,1,1,1,1,1 },  // = 6
             { 1,1,1,0,0,0,0 },  // = 7
             { 1,1,1,1,1,1,1 },  // = 8
             { 1,1,1,0,0,1,1 }   // = 9
                               };

void setup() {               
  pinMode(2, OUTPUT);   
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  writeDot(0);  // start with the "dot" off
}

void writeDot(byte dot) {
  digitalWrite(9, dot);
}
   
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() {
  for (byte count = 10; count > 0; --count) {
   delay(1000);
   sevenSegWrite(count - 1);
  }
  delay(5000);
}
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


il vero "problema"   dei display a 7 segmenti non e farli accendere ma il "protocollo"    per farli accendere

es se ho un ternometro che butta FUORI 25,7 GRADI     e tenemdo a mente che puo segnare da -10 a piu 40
far visualizzare quel numero in automatico diventa un impresa
ho provato con numeri interi e numeri negativi fino a 7-9 cifre  sembra che ci sono riusciuto

invece con numeri a virgola mobile per il momento ho abbandonato

ci sono tanti particolari da risolvere es se un numero occupa 2 cifre e hai 8 display devi spegnere in automatico   i display che non usi   etc
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Pages: [1]   Go Up
Jump to: