Aufteilen eines Integers in Verschiedene Bereiche

Hallo,

nach langem versuchen und überlegen, bin ich immer noch zu keiner Lösung gekommen deshalb wollte ich hier einfach mal nachfragen. Wie schafft man es einen Integer in verschiedene Blöcke/Zahlenbereiche einzuteilen und dann pro Block die Ausfüllung/Abdeckung in Prozent bzw. als Dezimalzahl zu bekommen?

Bsp:
Wert: 17
Bereiche:
[
-20 → -10,
-10 → 0,
0 → 10,
10 → 20,
20 → 30,
30 → 40
]
Gewünschtes Ergebnis: [1 | 1 | 1 | 0,7 | 0 | 0]

Danke im Vorfeld :slight_smile:

Hallo
zeige deinen Sketch, damit wir dir helfen können.
Dazu im IDE im Tab Bearbeiten/fürs Forum kopieren ausführen und dann hier einfügen.

Am einfachsten, in dem man das Problem analysiert, eine Lösung erarbeitet, und diese dann konsequent umsetzt.

z.B. kommt die 20 zwei mal vor!
Damit sind 2 Felder richtig.
Eins mit 0% und das andere mit 100%

Mein Code:

#include "MIDIUSB.h"
#include <stdlib.h>
#include <Encoder.h>
#include <FastLED.h>

CRGB leds[6];

Encoder myEnc(A2, A1);

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<WS2812B, 3, GRB>(leds, 6);
}

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

int cap(int input,  int minimum, int maximum) {
  if(input > maximum) {
    return maximum;
  }
  if(input < minimum) {
    return minimum;
  }
  return input;
}
long since_last_update = 0;

void processPeakMeter(int value) {
  //DISPLAY Decibel on 6 WS2812B Leds (with Brightness)
  //DB-Range: -20 to 40 (10 DB per Led)

  ???
}

long oldPosition  = -999;

/////////////////////

void loop() {
  outputHandling();
  inputHandling();
}

void inputHandling() {
  //PROCESSING OF MIDI INPUT
  midiEventPacket_t rx;
  do {
    rx = MidiUSB.read();
    if (rx.header != 0) {
      long channel = rx.byte1 - '0' - 127;
      long control = rx.byte2 - '0' + 46;
      long value = rx.byte3 - '0';
      Serial.print("Received: ");
      Serial.print(rx.header, HEX);
      Serial.print("-");
      Serial.print(channel);
      Serial.print("-");
      Serial.print(control);
      Serial.print("-");
      Serial.println(value);
      if(channel == 1) { //CHANNEL 1 FOR MIDI Decibel Meter Values VIA Midi Mixer (on Windows)
        processPeakMeter(value);
      }
    }
  } while (rx.header != 0);
}

void outputHandling() {
  //READ ROTARY ENCODER AN SEND OUTPUT VIA MIDI
  long newPosition = myEnc.read();
  newPosition = cap(newPosition, 0, 127);
  if (newPosition != oldPosition) {
    controlChange(1, 1, newPosition);
    Serial.println(newPosition); 
    oldPosition = newPosition;
  }
  myEnc.write(newPosition);
}

da brauchst ja nur eine mathematische Funktion ermitteln oder ein switch case anwenden

geht auch über einen Bereich mit

case -20..-10 :

noiasca:
da brauchst ja nur eine mathematische Funktion ermitteln oder ein switch case anwenden

switch...case - Arduino-Referenz

geht auch über einen Bereich mit

case -20..-10 :

Das Problem ist, dass ich wie gesagt auch noch die Ausfüllung bräuchte. Also wenn jetzt z.B. -17 als Wert wäre, dann wie viel Prozent vom diesem Bereich (-20 bis -10) ausgefüllt ist (in dem Fall 30 %). Ich möchte also alles von -20 bis 40 in 6 Blöcke aufteilen, von denen ich jeweils die Abdeckung sehen kann (für ein VU-Meter mit verschiedenen Helligkeiten für die 6 verschiedenen WS2812B LEDs.)

LG

Was hindert dich?

Tipp:
Es bringt wenig, das Problem mehrfach zu wiederholen, wenn da keine neuen Infos mit kommen.

Was gefällt dir hieran nicht:

da brauchst ja nur eine mathematische Funktion ermitteln
oder ein switch case anwenden

schau ich kenn nur:

du hast einen Input Wert i und du willst einen Output Wert o.

im Bereich von -20 .. -10 ... was soll da bei i = -17 für o rauskommen? 30?

Außerdem (wie dir schon gesagt wurde) musst du deine Entscheidungstabelle verbessern, denn aktuell überschneiden sich Anfang und Ende und das wird nicht gut gehen.
was soll bei -10 rauskommen?

Weiters kannst bei der map Funktion abschreiben:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

also sowas wie
o= (i - -20)*100/(-10 - -20)+0

noiasca:
schau ich kenn nur:

du hast einen Input Wert i und du willst einen Output Wert o.

im Bereich von -20 .. -10 ... was soll da bei i = -17 für o rauskommen? 30?

Außerdem (wie dir schon gesagt wurde) musst du deine Entscheidungstabelle verbessern, denn aktuell überschneiden sich Anfang und Ende und das wird nicht gut gehen.
was soll bei -10 rauskommen?

Weiters kannst bei der map Funktion abschreiben:

long map(long x, long in_min, long in_max, long out_min, long out_max)

{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}




also sowas wie
o= (i - -20)*100/(-10 - -20)+0

Danke für den Lösungsansatz, werde mir das später mal anschauen und überlegen habe es aber jetzt vorerst mit einem Switch..Case gelöst.

habe es aber jetzt vorerst mit einem Switch..Case gelöst.

Schön, dass du deine Lösung geheim halten musst.
Dann hat wenigstens auch niemand anderes was davon.

void processPeakMeter(int value, int rleds[]) {  // int rleds[] --> Integer Array mit den FastLED LED Ids
  byte green_hue = 98;
  byte yellow_hue = 53;
  byte red_hue = 0;
  int max_brightness = 255;
  leds[rleds[0]] = CRGB::Black;
  leds[rleds[1]] = CRGB::Black;
  leds[rleds[2]] = CRGB::Black;
  leds[rleds[3]] = CRGB::Black;
  leds[rleds[4]] = CRGB::Black;
  leds[rleds[5]] = CRGB::Black;
  leds[rleds[6]] = CRGB::Black;
  if(value > -11) {
    leds[rleds[0]] = CHSV(green_hue, 255, max_brightness);
  }
  if(value > 0) {
    leds[rleds[1]] = CHSV(green_hue, 255, max_brightness);
  }
  if(value > 9) {
    leds[rleds[2]] = CHSV(green_hue, 255, max_brightness);
  }
  if(value > 19) {
    leds[rleds[3]] = CHSV(yellow_hue, 255, max_brightness);
  }
  if(value > 29) {
    leds[rleds[4]] = CHSV(yellow_hue, 255, max_brightness);
  }
  if(value > 39) {
    leds[rleds[5]] = CHSV(red_hue, 255, max_brightness);
  }
  if(value > 49) {
    leds[rleds[6]] = CHSV(red_hue, 255, max_brightness);
  }
  switch(value) {
    case -20:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*1);
      break;
    case -19:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*2);
      break;
    case -18:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*3);
      break;
    case -17:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*4);
      break;
    case -16:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*5);
      break;
    case -15:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*6);
      break;
    case -14:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*7);
      break;
    case -13:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*8);
      break;
    case -12:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*9);
      break;
    case -11:
      leds[rleds[0]] = CHSV(green_hue, 255, (max_brightness/10)*10);
      break;
    case -10:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*1);
      break;
    case -9:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*2);
      break;
    case -8:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*3);
      break;
    case -7:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*4);
      break;
    case -6:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*5);
      break;
    case -5:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*6);
      break;
    case -4:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*7);
      break;
    case -3:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*8);
      break;
    case -2:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*9);
      break;
    case -1:
      leds[rleds[1]] = CHSV(green_hue, 255, (max_brightness/10)*10);
      break;
    case 0:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*1);
      break;
    case 1:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*2);
      break;
    case 2:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*3);
      break;
    case 3:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*4);
      break;
    case 4:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*5);
      break;
    case 5:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*6);
      break;
    case 6:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*7);
      break;
    case 7:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*8);
      break;
    case 8:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*9);
      break;
    case 9:
      leds[rleds[2]] = CHSV(green_hue, 255, (max_brightness/10)*10);
      break;
    case 10:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*1);
      break;
    case 11:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*2);
      break;
    case 12:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*3);
      break;
    case 13:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*4);
      break;
    case 14:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*5);
      break;
    case 15:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*6);
      break;
    case 16:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*7);
      break;
    case 17:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*8);
      break;
    case 18:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*9);
      break;
    case 19:
      leds[rleds[3]] = CHSV(yellow_hue, 255, (max_brightness/10)*10);
      break;
    case 20:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*1);
      break;
    case 21:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*2);
      break;
    case 22:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*3);
      break;
    case 23:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*4);
      break;
    case 24:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*5);
      break;
    case 25:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*6);
      break;
    case 26:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*7);
      break;
    case 27:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*8);
      break;
    case 28:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*9);
      break;
    case 29:
      leds[rleds[4]] = CHSV(yellow_hue, 255, (max_brightness/10)*10);
      break;
    case 30:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*1);
      break;
    case 31:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*2);
      break;
    case 32:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*3);
      break;
    case 33:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*4);
      break;
    case 34:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*5);
      break;
    case 35:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*6);
      break;
    case 36:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*7);
      break;
    case 37:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*8);
      break;
    case 38:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*9);
      break;
    case 39:
      leds[rleds[5]] = CHSV(red_hue, 255, (max_brightness/10)*10);
      break;
    case 40:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*1);
      break;
    case 41:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*2);
      break;
    case 42:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*3);
      break;
    case 43:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*4);
      break;
    case 44:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*5);
      break;
    case 45:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*6);
      break;
    case 46:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*7);
      break;
    case 47:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*8);
      break;
    case 48:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*9);
      break;
    case 49:
      leds[rleds[6]] = CHSV(red_hue, 255, (max_brightness/10)*10);
      break;
  }
  FastLED.show();
}

@combie Keine Sorge, war aber eben nicht am PC, sondern nur am Handy. Der Switch Case soll eigentlich nur temporär so bleiben, da er sehr lang ist. Ist auch kein Hexenwerk :slight_smile:

P.S.: Der ganze Code war zu lang, deshalb nur die betroffene Funktion.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.