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.
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.
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"
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
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
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 500...1000 in 50er Schritten, danach in 100er Schritten mit einem Hinweis, welcher Tausender aktiv is. So ganz trivial is es nicht.
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
Ingo L. schrieb: > Ja, die 91 baue ich dann ein, wenns läuft... Welche gnädige Information . . . Lies mal was über Netiquette.
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.
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=
@ 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...
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.
Ich weiss ehrlich nicht, wo das Problem is. Mit 10 LEDs und nem uC suche ich nach ner eleganten C-Lösung.
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.
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
Beitrag #6626849 wurde von einem Moderator gelöscht.
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.
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.
Und n Blinkinterval kann ich der Funktion auch übergeben, dass is auch nicht das Problem.
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.
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 | }
|
Das Titelthema ist falsch, denn sinnvoll ist es nicht was Du da machst. Sinnvoll wäre eine vernünftige Anzeige (Display) zu nehmen.
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
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).
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.