LED Bargraph sinnvoll nutzen

Gast #6626619
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.
Beitrag #6626631 wurde von einem Moderator gelöscht.
#6626648
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"
(Firma: Hobbytheoretiker) #6626660
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.
#6626681
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?
Beitrag #6626719 wurde von einem Moderator gelöscht.
Beitrag #6626725 wurde von einem Moderator gelöscht.
Beitrag #6626731 wurde von einem Moderator gelöscht.
(Firma: Hobbytheoretiker) #6626742
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=
Beitrag #6626849 wurde von einem Moderator gelöscht.
#6626862
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.
Beitrag #6626881 wurde von einem Moderator gelöscht.
Beitrag #6626919 wurde von einem Moderator gelöscht.
#6626922
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
}
(Firma: Hobbytheoretiker) #6626969
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.
Gast #6627231
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.
Gast #6627232
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
..
Beitrag #6627429 wurde von einem Moderator gelöscht.
Beitrag #6627519 wurde von einem Moderator gelöscht.
Beitrag #6627916 wurde von einem Moderator gelöscht.
Gast #6629525
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren