[ AvramKovacevic @ 17.08.2016. 12:28 ] @
Pozdrav!
U želji da naučim više izbegao sam MAX7219 i LedControl biblioteku napisanu za taj integralac i rešio da sam isprogramiram kontrolisanje dvocifrenog(po istom principu i sa više cifara) 7 segmentnog displeja sa zajedničkom katodom. :)
Ranije sam uspešno napisao program za direktno kontrolisanje jednocifrenog, a sada se pojavila potreba za više cifara..

Direktno sam povezao segmente sa otpornicima na Arduino pinove 6-12, spojio sam segmente 1. i 2. displeja, a GND 1 i 2 na tranzistore koji bi vršili ulogu prekidača, baze tranzistora na pinove 4 i 5 na Arduinu, (slika 1 u prilogu);
Poznat mi je termin multipleksiranje, ali mi nije najjasnije kako bi trebalo da izgleda napisan kod za to.. palo mi je na pamet, a kasnije sam nasao na netu da je to ispravan način da se, ukoliko je željeni broj dvocifren, broj razlaže na 2 cifre(deseticu i jedinicu) i program ukljucuje zeljene pinove prve i uz kratki delay() "prebacuje" na programiranje druge cifre.. tako da je za ljudsko oko neprimetno da je postojala pauza izmedju ispisa obe cifre.

Evo mog koda:
Code:

int gnd1=5;
int gnd2=4;

int segmenti=[7]={12,11,10,9,8,7,6};
byte kombinacije[10][7]= {
  {1,1,1,1,1,1,0},
  {0,1,1,0,0,0,0},
  {1,1,0,1,1,0,1},
  {1,1,1,1,0,0,1},
  {0,1,1,0,0,1,1},
  {1,0,1,1,0,1,1},
  {1,0,1,1,1,1,1},
  {1,1,1,0,0,0,0},
  {1,1,1,1,1,1,1},
  {1,1,1,1,0,1,1}
};

void setup() {
  for(int i=4;i<13;i++)
    pinMode(1,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  while(Serial.available()==0){};
  int broj=Serial.parseInt();

  if(broj<10){
    digitalWrite(gnd1,LOW);
    digitalWrite(gnd2,HIGH);
    
    for(int c=0;c<7;c++)
      digitalWrite(segmenti[c],kombinacije[broj][c]);
  }

}


Sada mi je nejasno ako je broj dvocifren kako da se program prebaci na uredjivanje 2 cifre a da pri tom prva cifra ostane uključena, jer ako izvršim: digitalWrite(gnd1,HIGH); digitalWrite(gnd2,LOW); prva cifra se totalno isključuje.
Nadam se da sam jasno izlošio svoj problem. Ispravite me ako negde grešim. Veliko hvala unapred!

[Ovu poruku je menjao AvramKovacevic dana 17.08.2016. u 13:41 GMT+1]
[ bogdan.kecman @ 17.08.2016. 15:17 ] @
Citat:
AvramKovacevic: Pozdrav!
Sada mi je nejasno ako je broj dvocifren kako da se program prebaci na uredjivanje 2 cifre a da pri tom prva cifra ostane uključena, jer ako izvršim: digitalWrite(gnd1,HIGH); digitalWrite(gnd2,LOW); prva cifra se totalno isključuje.


i treba da bude iskljucena, to je poenta multipleksiranja

petlja:
ugasene obe cifre
postavis 8 bita za cifru1
upalis cifru1
cekas neko vreme
ugasis cifru1
postavis 8 bita za cifru2
upalis cifru 2
cekas neko vreme
goto petlja

neko vreme je 10-50ms zavisno od toga koliko imas cifara..
[ AvramKovacevic @ 17.08.2016. 17:21 ] @
Hvala ti prijatelju, uspeo sam.
Ja nisam uzeo u obzir da je sve pod petljom te da se vrti u krug(loop) i samim tim se neće zauvek katoda isključiti jer će se uključiti več u sledećem krugu a taj razmak je neprimetan i ukoliko bi promenljiva *broj dobila vrednost ne iz unosa korisnika već na neki drugi način svakako bi cifre pokazivale zeljenu vrednost. Dobar posao!

Postaviću svoj kod ovde ukoliko nekom zatreba:
Code:

int gnd1=5;
int gnd2=4;

int segmenti[7]={12,11,10,9,8,7,6};
byte kombinacije[10][7]= 
 {
  {1,1,1,1,1,1,0},
  {0,1,1,0,0,0,0},
  {1,1,0,1,1,0,1},
  {1,1,1,1,0,0,1},
  {0,1,1,0,0,1,1},
  {1,0,1,1,0,1,1},
  {1,0,1,1,1,1,1},
  {1,1,1,0,0,0,0},
  {1,1,1,1,1,1,1},
  {1,1,1,1,0,1,1}
 };

void setup() {
  for(int i=4;i<13;i++)
    pinMode(i,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  while(Serial.available()==0) {};
  int broj=Serial.parseInt();


  if(broj<10){
    digitalWrite(gnd1,LOW);
    digitalWrite(gnd2,HIGH);
    
    for(int c=0;c<7;c++)
      digitalWrite(segmenti[c],kombinacije[broj][c]);
  } 

  for(int i=0;i<10;i++) {
  if(broj>10&&broj<100) {
    int jedinica=broj%10;
    int desetica=broj/10;
    
    digitalWrite(gnd1,LOW);
    digitalWrite(gnd2,LOW);

    for(int c=0;c<7;c++)
      digitalWrite(segmenti[c],kombinacije[desetica][c]);
    digitalWrite(gnd1,HIGH);
    delay(10);
    digitalWrite(gnd1,LOW);
    for(int c=0;c<7;c++)
      digitalWrite(segmenti[c],kombinacije[jedinica][c]);
    digitalWrite(gnd2,HIGH);    
    delay(10); 
 // }
  }
}


Ukoliko budem imao još neko pitanje u vezi ovoga postaviću ovde.

[Ovu poruku je menjao AvramKovacevic dana 17.08.2016. u 18:35 GMT+1]