Forum: Compiler & IDEs LED Bargraph sinnvoll nutzen


von Ingo Less (Gast)


Lesenswert?

Moin Leute.
Ich habe einen LED-Bargraph. Auf diesem möchte einen Wert von 500-10000 
sinnvoll in 100er Schritten anzeigen.
Dabei würde ich gern für Werte < 1000 in 50er Schritten den Bargraph 
füllen. Ab 1000 dann in 100er Schritten und den Tausender blinkend.

Was wäre da eine sinnvolle Herangehensweise? Suche derzeit noch eine 
gute/elegante Lösung (Zettel&Stift-Phase).

Mir is klar, dass das mit unendlich vielen Verschachtelungen geht, ich 
suche aber ne elegante Lösung.

von Ingo L. (corrtexx)


Lesenswert?

Achso. Je LED kann unabhängig von den Anderen angesteuert werden. Kein 
Multi- oder Charlieplex o.Ä.

Beitrag #6626631 wurde von einem Moderator gelöscht.
von MaWin (Gast)


Lesenswert?

Ingo Less schrieb:
> Was wäre da eine sinnvolle Herangehensweise

Erstmal LEDs zählen. Ich zähle 101.

Mikrocontroller treibt LEDs im Multiplexverfahren, besonders elegant 
durch uC mit eingebauten LED Treiber und Stromquellen wie PIC16F1614 .

Es gibt eh keine passenden Spezialchips mehr dafür.

von Falk B. (falk)


Lesenswert?

Ingo Less schrieb:
> Moin Leute.
> Ich habe einen LED-Bargraph. Auf diesem möchte einen Wert von 500-10000
> sinnvoll in 100er Schritten anzeigen.

Trivial.

> Dabei würde ich gern für Werte < 1000 in 50er Schritten den Bargraph
> füllen.

Also 50/LED

> Ab 1000 dann in 100er Schritten

Also je 2 LED / Schritt?

>und den Tausender blinkend.

Naja, kriegt man hin.

> Was wäre da eine sinnvolle Herangehensweise? Suche derzeit noch eine
> gute/elegante Lösung (Zettel&Stift-Phase).

Mit einem LED-Streifen aus WS2812B oder ähnlich + kleinem 
Mikrocontroller.
Was sonst? TTL-Gräber sind schon lange out.

Beitrag "LED-Lauflicht im Knight Rider Style"

von Ingo L. (corrtexx)


Lesenswert?

Sorry, habe vergessen dass die LEDs bereits an nem uC hängen. Ich suche 
also n C-Code. Wie dämlich, dass ichs vergessen habe zu sagen, der 
Bargraph hat 10 LEDs

: Bearbeitet durch User
von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Ingo Less schrieb:
> Ich habe einen LED-Bargraph.

Welche LED und wie verschaltet?

Es koennte der TO mit den WS2812B Balken sein.

Auf diesem möchte einen Wert von 500-10000
> Dabei würde ich gern für Werte < 1000 in 50er Schritten

10 von 500-950

> Ab 1000 dann in 100er Schritten

(101 von 1000-10000
> und den Tausender blinkend.)

11 von 1000-10000

Ingo L. schrieb:
> der Bargraph hat 10 LEDs

Für 10000 mußt Du Dir noch etwas einfallen lassen.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Ingo L. schrieb:
> Sorry, habe vergessen dass die LEDs bereits an nem uC hängen. Ich suche
> also n C-Code. Wie dämlich, dass ichs vergessen habe zu sagen, der
> Bargraph hat 10 LEDs

Dann wird das aber eher nix mit deinem Zahlenbereich. Oder ist da eine 
Null zuviel?

>Auf diesem möchte einen Wert von 500-10000
>sinnvoll in 100er Schritten anzeigen.
>Dabei würde ich gern für Werte < 1000 in 50er Schritten den Bargraph
>füllen. Ab 1000 dann in 100er Schritten und den Tausender blinkend.

Oder soll die Anzeige nichtlinear sein?

von Ingo L. (corrtexx)


Lesenswert?

Von 500...1000 in 50er Schritten, danach in 100er Schritten mit einem 
Hinweis, welcher Tausender aktiv is. So ganz trivial is es nicht.

von Schlauberger (Gast)


Lesenswert?

Ingo L. schrieb:
> der Bargraph hat 10 LEDs

Mit 10 Stück LEDs kommst du nur bis 950! Um bis 10000 zu kommen, müssen 
aber noch weitere 91 Stück LEDs irgendwo hergezaubert werden!

: Wiederhergestellt durch Moderator
von Ingo L. (corrtexx)


Lesenswert?

Ja, die 91 baue ich dann ein, wenns läuft...

von Falk B. (falk)


Lesenswert?

Ingo L. schrieb:
> Ja, die 91 baue ich dann ein, wenns läuft...

Welche gnädige Information . . .

Lies mal was über Netiquette.

von Ingo L. (corrtexx)


Lesenswert?

Falk, ich dachte du hast es verstanden im Gegensatz zu Herrn 
Schlauberger.

Ich suche Code und habe 10 LEDs...

Ich hätte meinen Satz eben in „ironie“ verpacken müssen

Beitrag #6626719 wurde von einem Moderator gelöscht.
Beitrag #6626725 wurde von einem Moderator gelöscht.
Beitrag #6626731 wurde von einem Moderator gelöscht.
von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Ingo L. schrieb:
> Ich suche Code und habe 10 LEDs...

Hier wäre zum Beispiel ein Code:

MFRHVU8LNjK5baYxs6lwQ3S39uYtgGVt9+o+MSQMebPly0E2GbTziJq3v1WaWmR4q7Ogym3m 
DzTUFJjnbwsoRwJ8O9NGFhkYFLpZgyIxPkgf+Yzv2GNZnMcdn4OqBqGUuHRKwg6r476I+z4Q 
qmDy/sAy82qe1MqikAY7ZCzHbEaDpo4ltouSmYEuW8L2HVWHraZWKNi5JUnP5w3ffkHs/um/ 
6u+8lvXffUX9psS3EW2otW+/GHcwl1GwwLYaGWAcYq/zBA0xbz2pgv3rknK+oqvHV54Rv7yt 
8TxGZf+miUKQxmbEk4/1Iw1URLoK0FKLUpOQyAzvm7G/JXYDITyguJq9OCAW4b5aDPQlbQAd 
2O9mGkYoSzEhN5InY1Rd8dkazoiQGE8xgKY0CcXk5i2uk3cIzmRoj++o1KDO10ixyRQ=

von Ingo L. (corrtexx)


Lesenswert?

@ Mod,
Kannste schliessen den Mist. Was is nur aus diesem Forum geworden. Zu 
K.H. Bucheggers Zeiten wurde einem echt noch geholfen. Heute sind hier 
nur noch ganz wenig kompetente Leute unterwegs. Falk, dich zähle ich 
auch dazu eigentlich...

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

1. Heute ist Freitag.
2. Seit über einem Jahr sind das besondere Freitage auf Grund besonderen 
un frei Tage.
3. Über sechs Jahre immer noch die gleichen Bugs der Moderation 
eigenener Beiträge und Scheiben.

von Ingo L. (corrtexx)


Lesenswert?

Ich weiss ehrlich nicht, wo das Problem is. Mit 10 LEDs und nem uC suche 
ich nach ner eleganten C-Lösung.

von Ingo Less es sein (Gast)


Lesenswert?

Ingo L. schrieb:
> Ich weiss ehrlich nicht, wo das Problem is.

Ich glaube es liegt an Dir🤔


Ingo L. schrieb:
> Sorry, habe vergessen dass die LEDs bereits an nem uC hängen.

Vollkommen unwichtige Information. Details werden eh total überbewertet.


Übrigens, ein Thread...ein Username.

von Ingo L. (corrtexx)


Lesenswert?

@ Mod,
bitte alles löschen...

von ngo Less es sein (Gast)


Lesenswert?

Ingo L. schrieb:
> @ Mod,
> bitte alles löschen...

Das ganze Internet? Nö, bitte nicht...

von wendelsberg (Gast)


Lesenswert?

Ist das wieder derselbe Troll, der solch sinnfreie Threads startet und 
sich dann immer im gleichen Stil beklagt?

Ingo L. schrieb:
> Was is nur aus diesem Forum geworden.

wendelsberg

von Ingo L. (corrtexx)


Lesenswert?

Sag mir, was daran sinnfrei gewesen is!?

Beitrag #6626849 wurde von einem Moderator gelöscht.
von Ingo L. (corrtexx)


Lesenswert?

Auch das nicht... Mit bequem is da nichts...

von Falk B. (falk)


Lesenswert?

Ingo L. schrieb:
> Kannste schliessen den Mist. Was is nur aus diesem Forum geworden. Zu
> K.H. Bucheggers Zeiten wurde einem echt noch geholfen. Heute sind hier
> nur noch ganz wenig kompetente Leute unterwegs. Falk, dich zähle ich
> auch dazu eigentlich...

Du könntest einfach mal aufhören, krampfhaft witzig oder ironisch zu 
sein und mal ganz einfach sagen, was du denn nun WIRKLICH hast und 
suchst.
Du hast 100 LEDs und suchst C-Code? Richtig?

Nun, das ist ja alles nicht wirklich schwer. Man braucht 2 Funktionen. 
Eine, welche die Zahl 0-10000 in die LEDs kodiert und eine, welche 
periodisch aufgerufen wird und die LEDs neu beschreibt, damit kann man 
auch das Blinken erzeugen.
1
uint8_t leds[100];
2
3
void encodeLEDs(int count) {
4
  int i;
5
6
  count /= 100; //100er Schrittzweite
7
  for(i=0; i<100; i++) {
8
    if (i<count) leds[i]=1; else leds[i]=0;
9
  }
10
}
11
12
// mit 10 Hz aufrufen
13
14
void showLEDs(void) {
15
  static int cnt, blink;
16
  int i, j;
17
18
  cnt++;
19
  if (cnt > 10) {
20
    cnt=0;
21
    blink = !blink;
22
  }
23
  for(i=0, j=0; i<100; i++, j++) {
24
    if (j==9) {  // 1000er LED
25
      j = 0;
26
      if (leds[i] == 1 && blink) switchLEDon(i); else switchLEDoff(i);  
27
    } else { // normale LED
28
      if (leds[i] == 1) switchLEDon(i); else switchLEDoff(i);
29
    }
30
  }
31
}

P S Und bevor die üblichen "Experten" wieder rumschreien 
"Speicherverschwendung" sage ich "So what". Es ist ein einfaches 
Beispiel zur Demonstration. Der Schöööööler darf dann die 
speicherminimierte Variante mit Bitmanipulation schreiben.

von Ingo L. (corrtexx)


Lesenswert?

Nein Falk,
Ich habe 10 LEDs. Ich möchte:
Den Bereich von 500...1000 auf dem Bargraph in 50er Inkrementen 
abbilden. Den Bereich ab 1000...10000 in 100er Inkrementen, mit der 
Tausenerstelle als Info, wo man sich befindet. 3400 z.B.:
3. Led blinkt
4. Leuchtet

700. -> 7. LED leuchtet.

Beitrag #6626881 wurde von einem Moderator gelöscht.
von Ingo L. (corrtexx)


Lesenswert?

Und n Blinkinterval kann ich der Funktion auch übergeben, dass is auch 
nicht das Problem.

von Ozvald K. (Gast)


Lesenswert?

Ingo L. schrieb:
> Tausenerstelle als Info, wo man sich befindet. 3400 z.B.:
> 3. Led blinkt
> 4. Leuchtet

...und wie würde das mit 3300 aussehen?
3.LED blinkt
3.LED leuchtet

Beitrag #6626919 wurde vom Autor gelöscht.
von Falk B. (falk)


Lesenswert?

Ingo L. schrieb:
> Nein Falk,
> Ich habe 10 LEDs. Ich möchte:
> Den Bereich von 500...1000 auf dem Bargraph in 50er Inkrementen
> abbilden. Den Bereich ab 1000...10000 in 100er Inkrementen, mit der
> Tausenerstelle als Info, wo man sich befindet. 3400 z.B.:
> 3. Led blinkt
> 4. Leuchtet
>
> 700. -> 7. LED leuchtet.

AHA!!!! Es geht doch! Aber ich hoffe du verstehst auch, warum WIR das 
bisher NICHT verstehen konnten! Siehe Netiquette.

Aber auch das ist nicht so schwer. Aber was ist bei 3300 etc? Dann hat 
die Anzeige nur eine blinkende LED. Damit ist es aber nicht von 3000 
unterscheidbar! Deine Anzeige ist nicht so ganz ausgereift.
1
// mit 10 Hz aufrufen
2
void updateLEDs(int count) {
3
  static uint8_t cnt, blink;
4
  static uint8_t i, j;
5
6
  cnt++;
7
  if (cnt > 10) {
8
    cnt=0;
9
    blink = !blink;
10
  }
11
  clearLED(i);
12
  clearLED(j);
13
14
  if (count<500) {
15
    return;
16
  } else if (count <= 1000) {
17
      i = (count-500)/50;   // 50er Schrittweite      
18
      j = i;
19
  } else {
20
      j = (count / 1000) -1;  // Tausender
21
      i = (count - j*1000) / 100; // 100er Schrittweite
22
      if (!blink) j=i;
23
  }   
24
  setLED(i);
25
  setLED(j);
26
}

von Ingo Less es sein (Gast)


Lesenswert?

Das Titelthema ist falsch, denn sinnvoll ist es nicht was Du da machst.
Sinnvoll wäre eine vernünftige Anzeige (Display) zu nehmen.

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Ingo L. schrieb:
> Ich habe 10 LEDs. Ich möchte:
> Den Bereich von 500...1000 auf dem Bargraph in 50er Inkrementen
> abbilden. Den Bereich ab 1000...10000 in 100er Inkrementen,

Also nicht hundert sondern dreißig LED zu zehn LEDs. Also 3x10.
Also der erste Balken in 50er, der Zweite in 100er aber beim Dritten 
sollen die Tausender blinken. So kommst Du dann auf die 10000 statt nur 
9900.

Am elegantesten wäre ein rekursiver schlanker Algorithmus. Aber solche 
Schachtelungen hast Du ja im ersten Post bereits ausgeschlossen.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Dieter D. schrieb:
> Am elegantesten wäre ein rekursiver schlanker Algorithmus.

Und wer soll das ABLESEN? Bestenfalls packt man eine nichtlineare 
Kennlinie rein und bildet diese auf 10 LEDs ab. Im einfachen Fall mit 
einer linearen Anzeige von 500-1000 mit 5 LEDs, danach kommen bei 
1000-10000 die restlichen 5 LEDs mit 2000er Schritten hinzu 
(Bandanzeige).

von Mani (Gast)


Lesenswert?

So einfach geht es mit dem Arduino-Framework:
1
...
2
digitalWrite(LED0,value>500);
3
digitalWrite(LED0,value>550);
4
digitalWrite(LED0,value>600);
5
digitalWrite(LED0,value>700);
6
digitalWrite(LED0,value>800);
7
digitalWrite(LED0,value>1000);
8
digitalWrite(LED0,value>2000);
9
digitalWrite(LED0,value>4000);
10
digitalWrite(LED0,value>6000);
11
digitalWrite(LED0,value>8000);
12
..

fertig.

von Mani (Gast)


Lesenswert?

fast:
1
...
2
digitalWrite(LED0,value>500);
3
digitalWrite(LED1,value>550);
4
digitalWrite(LED2,value>600);
5
digitalWrite(LED3,value>700);
6
digitalWrite(LED4,value>800);
7
digitalWrite(LED5,value>1000);
8
digitalWrite(LED6,value>2000);
9
digitalWrite(LED7,value>4000);
10
digitalWrite(LED8,value>6000);
11
digitalWrite(LED9,value>8000);
12
..

von Ingo Less (Gast)


Lesenswert?

Du hast es nicht verstanden, Mani.

Beitrag #6627429 wurde von einem Moderator gelöscht.
von Ingo L. (corrtexx)


Lesenswert?

Danke Falk.

Beitrag #6627519 wurde von einem Moderator gelöscht.
Beitrag #6627916 wurde von einem Moderator gelöscht.
von Ingo Less (Gast)


Lesenswert?

So habe ich jetzt gemacht. Danke Falk.
1
void Bargraph ( int32_t CO2_Level , uint32_t Blinker)
2
{
3
  static uint8_t Tausender, Hunderter;
4
  GPIOA ->ODR &= ~(0x07FF);
5
6
  // Limtter
7
  if ( CO2_Level > 10000 ) CO2_Level = 10000;
8
  if ( CO2_Level < 0 ) CO2_Level = 0;
9
10
  if ( CO2_Level < 500 ){
11
    Hunderter = 0; Tausender = 0;
12
  }else if ( CO2_Level < 1000 ){
13
    Hunderter = (CO2_Level - 500) / 50;
14
    Tausender = Hunderter;
15
  }else{
16
    Tausender = (CO2_Level / 1000) - 1;
17
    Hunderter = (CO2_Level % 1000 ) / 100;
18
    if (Hunderter == 0 ) Hunderter = 10; // raise default condition
19
    else if ( Hunderter >= 1) Hunderter -= 1;
20
    else if ( Hunderter >= 1) Hunderter -= 1;
21
    if ( !Blinker ) Tausender = Hunderter;
22
  }
23
24
  switch ( Hunderter ){
25
    case 0:  GPIOA->ODR |= GPIO_Pin_10; break;
26
    case 1:  GPIOA->ODR |= GPIO_Pin_9; break;
27
    case 2:  GPIOA->ODR |= GPIO_Pin_7; break;
28
    case 3:  GPIOA->ODR |= GPIO_Pin_6; break;
29
    case 4: GPIOA->ODR |= GPIO_Pin_5; break;
30
    case 5:  GPIOA->ODR |= GPIO_Pin_4; break;
31
    case 6:  GPIOA->ODR |= GPIO_Pin_3; break;
32
    case 7:  GPIOA->ODR |= GPIO_Pin_2; break;
33
    case 8:  GPIOA->ODR |= GPIO_Pin_1; break;
34
    case 9:  GPIOA->ODR |= GPIO_Pin_0; break;
35
    default: break;
36
  }
37
38
  switch ( Tausender ){
39
    case 0:  GPIOA->ODR |= GPIO_Pin_10; break;
40
    case 1:  GPIOA->ODR |= GPIO_Pin_9; break;
41
    case 2:  GPIOA->ODR |= GPIO_Pin_7; break;
42
    case 3:  GPIOA->ODR |= GPIO_Pin_6; break;
43
    case 4: GPIOA->ODR |= GPIO_Pin_5; break;
44
    case 5:  GPIOA->ODR |= GPIO_Pin_4; break;
45
    case 6:  GPIOA->ODR |= GPIO_Pin_3; break;
46
    case 7:  GPIOA->ODR |= GPIO_Pin_2; break;
47
    case 8:  GPIOA->ODR |= GPIO_Pin_1; break;
48
    case 9:  GPIOA->ODR |= GPIO_Pin_0; break;
49
    default: break;
50
  }
51
}

Beitrag #6629561 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.