int und string (char) in array mixen möglich??

Hallo Leute,

ich möchte eine einzelne 7-Segment-Anzeige über den Arduino via I2C (mittels PCF8574) ansteuern. Die Schaltung zum Ansteuern funktioniert auch soweit.

Ich möchte mir den jeweiligen I2C-code über ein Array (Eingangsvariable soll entsprechende Binärzahl für die Ansteuerung des PCF8574 über I2C liefern) generieren.

Mein Problem hierbei:

Möchte nicht nur die Ziffern 0...9 sondern auch die Buchstaben A...F darstellen.
Code dazu sieht bis jetzt folgendermaßen aus:

int I2C_7Segment [2][10]={ 
  {0,1,2,3,4,5,6,7,8,9}, //,A,B,C,D,E,F}
  {B1000000,B1111001,B0100100,B0110000,B0011001,B0010010,B0000010,B1111000,B0000000,B0010000} //,B0001000,B0000011,B1000110,B0100001,B0000110,B0001110}
  };

Nur liegt hier das Problem, dass ich die Buchstaben nicht im Array deklarieren kann, da es sich ja nicht um integer handelt.

Kennt ihr eine elegante Lösung, wie ich das trotzdem umsetzen kann?

Wie immer schonmal vielen Dank im Voraus und
Freundliche Grüße
Marius

Hallo Marius,
wenn Du in Deiner Frage auf das "elegant" verzichtest: Definiere ein Array mit den Zeichen "char", eins mit den Binärwerten "unsigned int". Die logische Verbindung hast Du über den Index.

"Elegant" wäre möglicherweise, aus dem ASCII-Wert ("0" == 48, "A" == 65) den Index für das Array mit den Binärwerten zu errechnen.

Elegant wäre, wenn du auf
{0,1,2,3,4,5,6,7,8,9} komplett verzichtest, und statt dessen einfach von 0 bis 0x0F durchzählst.
int I2C_7Segment [16] = {
B1000000, B1111001,B0100100, ... };

ok, also müsste ich noch eine weitere funktion schreiben, die alle (auch die Zahlen A bis F in ASCI umrechnet und sich den entsprechenden Binärwert aus dem Array dann rausschreibt?

Gibts da eine standardfunktion in C (Arduino) für die Umwandlung in ASCI? Sry für die blöden fragen aber ich glaube, ich bin grad etwas durch mit mir und der welt...

Vielen Dank und viele grüße
Marius

Edit: oder noch einfacher wie von michael_x geschrieben: einfach meine Eingangsvariable hexadezimal von 0...F hochzählen, oder? Welches format hat dann das array? hex anstatt int??

Was mir so im Kopf herumschwirrt:

//                            0         1         2         3         4         5         6         7         8         9         A         B         C         D         E         F
int I2C_7Segment [] = {B1000000, B1111001, B0100100, B0110000, B0011001, B0010010, B0000010, B1111000, B0000000, B0010000, B0001000, B0000011, B1000110, B0100001, B0000110, B0001110};

void setup() {
  Serial.begin(9600);
  wandle('0');
  wandle('1');
  wandle('2');
  wandle('3');
  wandle('4');
  wandle('5');
  wandle('6');
  wandle('7');
  wandle('8');
  wandle('9');
  wandle('A');
  wandle('B');
  wandle('C');
  wandle('D');
  wandle('E');
  wandle('F');
}

void loop() {
}

void wandle (byte zeichen) {
 byte index = zeichen - 48;
  if (index > 9) index -= 7;
  int binWert = I2C_7Segment[index];
  Serial.print(index);
  Serial.print(" ");
  Serial.println(binWert, HEX);
}

comp_controller:
ich bin grad etwas durch mit mir und der welt...

Da kann ich leider nicht helfen. :slight_smile:

Warum hast du denn das, was du in deinem 7-Segment-Ding anzeigen willst, als Buchstaben vorliegen
'0' ... 'F' und was machst du, wenn es statt dessen ein 'a' ist, oder gar ein 'z' oder ein ' ' (Leerzeichen)?

Eine Zahl 0 .. 0x0F wäre doch eigentlich viel passender.
Du könntest dann auch ein beliebiges byte mit 2 solcher 7-Segment-Dinger darstellen.

Hallo,

mehr als 0...9 und A...F möchte ich nicht darstellen. Manche Zeichen können auf der 7 Segment ohnehin nur als kleinbuchstaben (z.B. "B" dargestellt werden, würde sonst als großbuchstaben ja mit der "8" verwechselt werden ;)).

Werde meine Zählvariable dann wohl von 0...F hexadezimal zählen lassen, da habe ich dann alles drinn, was ich brauche.

Kann man das Array dann trotzdem als int definieren und dort hexzahlen bzw. binärzahlen angeben?

Vielen Dank und viele Grüße
Marius

Edit: Brauche auch nur eine einzelne 7-Segmentanzeige. Soll eine Ganganzeige fürs Kart werden. Von 0...6 sind die gänge, über die verbleibenden Zeichen sollen dann Stati der Gesamtsteuerung wie bspw. "Versorgungsspannung zu niedrig" angezeigt werden.

Edit 2: Leider bin ich gerade bei meinen Recherchen nicht so richtig fündig geworden (habe wohl einfach nicht die richtigen Suchbegriffe eingegeben):

Wie kann ich anhand einer Eingangsvariable den Index im (2-Dim) Array ermitteln und dann die entsprechende Variable der 2. Dimension übergeben??

Kann man das Array dann trotzdem als int definieren und dort hexzahlen bzw. binärzahlen angeben?

Kann man, wobei byte nur halb so viel Speicher braucht und auch reicht.

Egal ob man es dezimal, Binär oder hex schreibt, es ist die gleiche Zahl, und wenn die maximal 255 = B11111111 = 0xFF groß ist, passt sie in ein Byte.

michael_x:
Kann man, wobei byte nur halb so viel Speicher braucht und auch reicht.

Das hatte ich in meinem Beispiel übersehen, also:

byte I2C_7Segment [] = {B1000000, ...

Hallo,

und mit welcher funktion kann ich nun aus dem array über die entsprechende hexzahl als eingangsvariable die entsprechende binärzahl laut array ausgeben??

Viele Grüße
Marius

Ob Dezimal, Binär oder Hex ist doch vollkommen egal. Das sind nur unterschiedliche Schreibweisen für dich. Für den Prozessor ist das genau das gleiche.

Hallo,

ich glaube ich weis wo Dein Gedankenproblem ist. In Deinem eindimensionalen Array, definierst Du die einzelnen LED's für die 7 Segmentanzeige. Und zwar Binär für alle 15 Zahlen. 0 bis F.
Und dann mußt Du nur den Index für Dein Array von 0 bis 15 wählen um die gewünschte Segmentkombination auszugeben. Und wenn Du bei der Zahl 10 den Buchstaben A ausgeben möchtest, dann legst nur Du das fest wie das aussehen soll auf der Segmentanzeige mittels Deinem Binärcode. Du greifst also nur noch über den Index auf den gewünschten Binärcode zu und übergibts diesen Deiner Segmentanzeige.

comp_controller:
ich möchte eine einzelne 7-Segment-Anzeige über den Arduino via I2C (mittels PCF8574) ansteuern.

Daher sollte die Segmentkombination aus dem Array mittels "Wire.write(I2C_7Segment[index]);" über I2C zum PCF8574 übertragen werden.

hmm,

werde mich mal ranmachen und in dieser richtung (1 dim Array, Zugriff über Index) basteln.

Aber gibts denn wirklich keine Möglichkeit in C, in einem 2 dim array den Wert in einer Spalte zu suchen und den zugehörigen wert der zweiten Spalte auszugeben (also: "Suche x in Spalte 1 und gib zugehöriges y aus Spalte 2 aus)?

Diese Lösung gefällt mir nämlich eigentlich besser.

Freundliche Grüße
Marius

Hallo,

ganz ehrlich. Ich verstehe dein Problem nicht. Was willst du denn suchen was schon bekannt ist?
Du möchtest hexadezimal ein A ausgeben, was dezimal 10 entspricht, also gibts Du mit dem Index 10 den zugehörigen Binärcode aus was dann letztlich das A auf dem Segmenten darstellt.

Hallo,
wenn Du es denn unbedingt willst, geht das schon. Ich habe beispielsweise eine IR-Fernbedienung, deren Code ich decodiere und dann einer Taste zuordne:

unsigned int carmp3[] = {0xA25D, 0x629D, 0xE21D, 0x22DD, 0x02FD, 0xC23D, 0xE01F, 0xA857, 0x906F, 0x6897, 0x9867, 0xB04F, 0x30CF, 0x18E7, 0x7A85, 0x10EF, 0x38C7, 0x5AA5, 0x42BD, 0x4AB5, 0x52AD};
byte taste[] = {0x11, 0x21, 0x31, 0x12, 0x22, 0x32, 0x13, 0x23, 0x33, 0x14, 0x24, 0x34, 0x15, 0x25, 0x35, 0x16, 0x26, 0x36, 0x17, 0x27, 0x37};

Das könnte ich auch als zweidimensionales unsigned int Array definieren:

 unsigned int carmp3[2][21] = {
  {0xA25D, 0x629D, 0xE21D, 0x22DD, 0x02FD, 0xC23D, 0xE01F, 0xA857, 0x906F, 0x6897, 0x9867, 0xB04F, 0x30CF, 0x18E7, 0x7A85, 0x10EF, 0x38C7, 0x5AA5, 0x42BD, 0x4AB5, 0x52AD},
  {0x11, 0x21, 0x31, 0x12, 0x22, 0x32, 0x13, 0x23, 0x33, 0x14, 0x24, 0x34, 0x15, 0x25, 0x35, 0x16, 0x26, 0x36, 0x17, 0x27, 0x37}
 };