Arduino am Charlieplexing-Display

                      Elektronik-Labor  Bastelecke  Projekte  Mikrocontoller                        



Video: https://www.youtube.com/watch?v=VvY9Pa5idqo


Eigentlich wollte ich nur einen gebrauchten Akku aus einer alten E-Zigarette ausbauen. aber dann fand ich darin ein besonderes Charlieplexing-Display mit nur sechs Anschlüssen. Es wurde für die Ladekontrolle einegsetzt. Aber für eine Zigarette ist es viel zu schade. Deshalb habe ich es ausgebaut und auf einen Arduono Nano gelötet.



Mit 6 Anschlüssen kann man im Charlieplexing bis zu 30 LEDs ansteuern. Dieses Display hat etwas weniger. Mit Batterie,Vorwiderstand und zwei Messspitzen konnte ich rausbekommen, wie die Segmente angeschlossen sind. Das Beispielprogramm enthält alle Segmente mit den Anoden im Array dd und den Kathoden im Array ee. Die jeweils ersten 16 Positionen betreffen die beiden Siebensegmentziffern. Der Rest steht für die weißen Symbole und die farbigen Balken. Im Arduino muss man für alle sechs Ports jeweils die Datenrichtung (DDRD) und den Portzustand (PORDD) einschalten. das geschieht in einem Timer-Interrupt mit 4 kHz.

//Charlieplexing-Display am Pin 2...7

int d,e,n,i,z,c,w,s;
int dd[]={64,32,16,16,8,8,8,0,128,64,128,32,128,16,8,0 ,0,16,32,64,128,48,112,240,0,8,16,32,64,128,248,0,0,32,64,96};
int ee[]={32,64,32,64,64,32,16,0,64,128,32,128,16,128,128,0,8,8,8,8,8,8,8,8,0,4,4,4,4,4,4,0,0,16,16,16};
int seg[]={0xfc,0x60,0xda, 0xf2,0x66,0xb6,0xbe,0xe4,0xfe,0xf6};

void setup() {
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS11);
  TCNT1  = 0;
  OCR1A = 499;// 4000 Hz
  TIMSK1 |= (1 << OCIE1A);
  sei();//allow interrupts
}

ISR(TIMER1_COMPA_vect) {//Interrupt 4kHz
  if(n>35){n=0;}
    DDRD=0; PORTD==0;
    if(n<8 && seg[z]&(128>>n)){
    DDRD=(dd[n]+ee[n]) & 254;
    PORTD=ee[n];
    }
    if(n>7 && n<16 && seg[e]&(128>>(n-8))){
    DDRD=(dd[n]+ee[n]) & 254;
    PORTD=ee[n];
    }
    if(n>15 && n<24){
    DDRD=(dd[c+16]+ee[c+16]) & 254;
    PORTD=ee[c+16];
    }
    if(n>23 && n<30){
    DDRD=(dd[w+24]+ee[w+24]) & 254;
    PORTD=ee[w+24];
    }   
    if(n>31 && n<35){
    DDRD=(dd[s+32]+ee[s+32]) & 254;
    PORTD=ee[s+32];
    }   
    n++;
  }

void loop(){
  for (z=0;z<10;z++){   //Zehner  
    for (e=0;e<10;e++){ //Einer
      c=e/2+1;                //Colour
      if (c>1) {c+=3;}
      for(w=7;w>0;w--){ //White
        delay(100);}
      s=e/2;                      //Symbole
    }
  }
}

Die Software steuert das Display in der Haupt-Loop. Zehner, Einer, Farbbalken, weiße Umrandung und weiße Symbole werden jeweils durch eigene Variablen gesteuert.



Im Internet konnte ich nichts zu diesem Display finden, kein Datenblatt, keinen Hersteller, nichts. Ich verdanke es meinem Bruder, der achtlos weggeworfene E-Zigaretten im Interesse des Umweltschutzes und der Bastelfreude aufsammelt.





Elektronik-Labor  Bastelecke  Projekte  Mikrocontoller