LED Anzeige Siemens DLR2016 (DLG2016)

Hallo,

Beim Durchsuchen von Modulen; Platinen etc. ist mir ein älteres Conrad Modul (Umwelt Messmodul für Temperatur, Luftfeuchte etc.) in die Hände gefallen. Da nur wirres Zeug auf der Anzeige erscheint gehe ich davon aus das der µC defekt ist. Ich möchte die 2 Anzeigemodule; es sind je 4 Anzeigefelder mit einer 5x7 Matrix; weiter nutzen. Im konkreten möchte ich eine Frequenzanzeige ( 8 stellig ) damit realisieren. Die Baugrösse passt exakt zum vorhandenem Frequenzgenerator.

Eine Frequenzanzeige via normaler LCD Module (HD 44780...) habe ich fertig, ich möchte jedoch diese 2 LED-Module nutzen.

Mein Problem ist wie kann ich eine Zahl z.B. 4,4336187 auf die 2 Led-Displays übertragen? Wie kann ich diese Zahl quasi aufsplitten, damit ich jede einzelne Zahl an die richtige Position im Display übertragen kann? Das Displaymodul hat 2 Adresseingänge A0 und A1 damit wird die Position des zu übertragendes Zeichen gewählt.

A0=0 Pos1 A1=0

A0=1 Pos2 A1=0

A0=0 Pos3 A1=1

A0=1 Pos4 A1=1

Hier das Datenblatt dazu: http://www.hanshehl.de/g55amg2006/auspuff/SLR2016.pdf

Ich möchte eine Zahl oder ein Wort auf die Module übertragen. Wie realisiere ist das? Beispiele mit einer Laufschrift dazu habe ich schon, nutzt mir aber nicht viel. Hier der Link zu den Laufschriften.... http://forum.arduino.cc/index.php?topic=282001.0

Kann mir jemand weiterhelfen?

Gruss Bajazzo

Du mußt die Daten und und Adressen an das Display anlegen, die dann mit einen Write-Puls in die adressierte Stelle übernommen werden. Mehrere Displays können mit separaten Write Leitungen angesteuert werden, die übrigen Anschlüsse können von allen gemeinsam benutzt werden.

Hallo,

Ja das ist mir schon klar. Nur ich weis nicht wie man eine Zahl, z.B 10700 auftrennt, also so das Zahl "1" , "0" ,"7" , "0" , "0" jeweils einzeln übertragen werden können.

Beispiel:

WR1 gehört zum Display 1 / WR2 zum Display 2 [ Dis2 ][ Dis1 ]

Befehlsfolge:

Zeichen "1" WR2=1 A0=0 A1=0 Daten

Zeichen "0" WR1=1 A0=1 A1=1 Daten

Zeichen "7" WR1=1 A0=1 A1=0 Daten

Zeichen "0" A0=0 A1=1 Daten

Zeichen "0" A0=0 A1=0 Daten

Also wie trenne ich die Zahl 10700 zu einzelnen Zeichen auf?

Bei dem Test mit der Laufschrift habe ich einfach mal die "Laufstellen" auf 8 gestellt und eine 8-stellige Zahl übertragen. Das Ergebnis auf den Display war eine nicht durchlaufende Zahlenfolge, das ist genau das was ich möchte.

Die Zeichenfolge wurde hiermit definiert:

char msg[] = "12345678";

Nun weis ich aber nicht wie ich das in eine dynamische Zahl; entsprechend der Anzahl von Impulsen an Pin X; in den "char" Befehl einbinden kann.

Die Zahl in einen String konvertieren (itoa, ltoa...), dann die Zeichen ausgeben.

Oder einzeln mit x%10 in Ziffern konvertieren, '0' addieren und ausgeben, dann x durch 10 dividieren.

Ja, das die Zahl in ein String konvertiert werden muss, habe ich inzwischen auch raus gefunden.

Hier mal das ganze Programm, ürsprünglich eine Laufschrift. Aber wenn man “for (byte p = 7; p <=7; p++)”
p<=7 auf 7 setzt habe ich eine stehende Zahl also kein Laufschrift.

Die Frequenz soll am Pin5 gezählt werden
int k=0,pin=5; // Pin für Frequenz

Wie binde ich diese Zahl genau ein, bzw, wie wandele ich diese in ein String um?
Der Wert (z.B 10700 Impulse an Pin5) müsste anstatt “12345678” im "char msg= “10700”; eingebunden werden.

Ich brauch ein genaues Beispiel um es mir klar zu machen.

// Programm für  2 Matrix Module  SL.. 2016  


const byte SLR2016_D[] = {5, 6, 7, 8, 9, 10, 11};

#define SLR2016_A0 4
#define SLR2016_A1 3
#define SLR2016_WR 2
#define SLR2016_WR2 12



char msg[]= "12345678";
void setup() {

  for (byte i = 0; i < 7; i++) {
    pinMode(SLR2016_D[i], OUTPUT);
  }

  pinMode(SLR2016_A0, OUTPUT);
  pinMode(SLR2016_A1, OUTPUT);
  pinMode(SLR2016_WR, OUTPUT);
  pinMode(SLR2016_WR2, OUTPUT);

}

void loop() {

  for (byte p = 7; p <=7; p++) {     // Zahl <=xx muss Anzahl der Buchstaben vom Text entsprechen ,Zeile 10
 
    for (byte c = 0; c <= 7; c++) {
   
      digitalWrite(SLR2016_A0, bitRead(c, 0));
      digitalWrite(SLR2016_A1, bitRead(c, 1));
 
     for (byte i = 0; i < 7; i++) {
        digitalWrite(SLR2016_D[i], bitRead(msg[p-c], i));
      }
     
      if (c >= 4) {   
  digitalWrite(SLR2016_WR, LOW);
  digitalWrite(SLR2016_WR, HIGH); }
else {
  digitalWrite(SLR2016_WR2, LOW);
  digitalWrite(SLR2016_WR2, HIGH);
}
 
   
    delay(15);
       }
  }
}

Wurde schon gesagt. ultoa() (= unsigned long to ascii) http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__stdlib_1ga34f41757388f40e340f31e370ac009b5.html http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga34f41757388f40e340f31e370ac009b5

Also einen Puffer anlegen der mindestens so groß wie der String + 1 ist (da gut aufpassen). Und dann übergibst du die Zahl, den Puffer und in diesem Fall 10 (für Dezimal) als Parameter.

Die Länge eines C Strings bekommst du übrigens mit strlen(): http://www.cplusplus.com/reference/cstring/strlen/ Idealerweise berechnet man das aber einmal vor der for-Schleife.

Bitte setze den Code in Code-Tags </>, Du kannst das mit Edit More nachholen.

Am einfachsten wird es mit der Laufschrift, wenn Du msg groß genug machst und mit Leerzeichen auffüllst. Dann den String zuerst ab Index 0 ausgeben, dann ab 1 usw. Genügend lange Pause dazwischen nicht vergessen!

Da fehlt noch der Index zu SLR2016_D:

        digitalWrite(SLR2016_D[i], bitRead(msg[p-c], i));