LED Dimmen mit Serial Port! Bitte :/

@J-M-L

char serialData;
const byte ledPin1 = 3;
const byte ledPin2 = 5;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop()
{
  int r, m;
  switch (r = Serial.read()) {
    case '0' ... '4': analogWrite(ledPin1, (255 * (r - '0')) / 4);
    Serial.println(r - 48);
    break;      // (r - '0') ist in der Zwischenzeit [0, 4]
    default: break; // ignorieren
  }
  switch (m = Serial.read()) {
    case '5' ... '9': analogWrite(ledPin2, (255 * (m - '5')) / 4);
    Serial.println(m - 48);
    break;      // (m - '5') ist in der Zwischenzeit [5, 9]
    default: break; // ignorieren
  }
}

hier ist mein Text. Ich wollte damit 2 LED steuern..
es hat funktioniert. Nur das problem, wenn ich 1 eingeb, manchmal liest das nicht... ich muss das 2 oer 3 mal eingeben, dann liest es :smiley:

was ich mich wundert, nur das lesen Verzögerung!!

Die Code von @my_xy_projekt hat funktioniet, aber ich habe die Werte, die ich brauche, einfach vertippt :see_no_evil: (Sorry und vielen Dank) :smiley:

115200 wären im Allgemeinen besser als 9600, aber deshalb verpassen Sie nicht einige Eingaben.

➜ du liest die serielle input zweimal... warum hast du 2 switch/case?

const byte ledPin1 = 3;
const byte ledPin2 = 5;

void setup()
{
  Serial.begin(115200);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop()
{
  int r;
  switch (r = Serial.read()) {
    case '0' ... '4':
      analogWrite(ledPin1, (255 * (r - '0')) / 4);
      Serial.println(r - '0');
      break;      // (r - '0') ist in der Zwischenzeit [0, 4]
    case '5' ... '9':
      analogWrite(ledPin2, (255 * (r - '0')) / 4);
      Serial.println(r - '0');
      break;      // (r - '0') ist in der Zwischenzeit [5, 9]
    default: break; // ignorieren
  }
}

deine Mathe war auch falsch... (r - '0') ist in der Zwischenzeit [5, 9], nicht (r - '5')

Ja, weil Du zweimal liest.
Wenn Du nur einmal liest, sollte das gehen.
Loop() neu:


void loop()
{
  int m = Serial.read();
  switch (m)
  {
    case '0' ... '4': analogWrite(ledPin1, (255 * (m - '0')) / 4);
      Serial.println(m - 48);
      break;      // (m - '0') ist in der Zwischenzeit [0, 4]
    case '5' ... '9': analogWrite(ledPin2, (255 * (m - '5')) / 4);
      Serial.println(m - 48);
      break;      // (m - '5') ist in der Zwischenzeit [5, 9]
    default: break; // ignorieren
  }
}

(@J-M-L war wieder mal schneller ... :wink: )

1 Like

ich hab 2 cases gemacht, weil ich 2 LED mit verschiedene Buttons mit Python steure!!

Ach so, meinst du, ich sollte alles in einem Case machen
und unter neue (analogWrite) für die zweite LED steuern!!
Ich würde das probieren :slight_smile:

meinst du, für jede Case ein Loop machn ?! :smiley:

Du hast EINE schnittstelle.
Du brauchst daher einen switch
in den cases machst du unsterschiedliche Sachen.

1 Like

Du müsst den Serial input einmal lesen und dann entscheiden, was damit zu tun ist. Ein switch+case reicht also aus

1 Like

Nein.
ein loop, einmal lesen, das gelesene in einem switch, und mehreren cases auswerten.
Das ist das schöne an dem switch/case - Konstrukt. Du hast einen Wert (switch) und anhand des cases bekommst Du den richtigen "Ausgang".
Wenn Du Dich vertust und sich Bereiche überlappen, merkt der Compiler das und meckert. Kannste probieren: mach aus der 5 von case '5' eine 4 :wink: im Code von J-M-L oder mir....

1 Like

Aha, die gute alte Salami Taktik...
Eine neue Scheibe.

Wie wäre es mit einer Library, welche einen Parser beinhaltet?
z.B. der CMDMessenger

1 Like

Das ist ja cool für mich als Anfänger :sweat_smile: :rofl:

Hier mal ein einfaches Beispiel für 2 Leds.

Das Programm erwartet Kommandos über die Serielle.
Verstanden wird, z.B.

1,47;

Das erste Feld sagt, welche LED, hier die 1.
Das Komma trennt die Felder.
Das zweite Feld, sagt die Helligkeit, hier 47.
Das Semikolon schließt das Kommando ab.

1,0;
Led 1 aus

1,255;
Led 1 voll an

Das geht auch für die 2te LED
2,122;

#include <CmdMessenger.h> 

constexpr byte led1 {3};
constexpr byte led2 {9};

CmdMessenger messenger{Serial};


void setLed1()
{
  byte value = messenger.readInt16Arg();
  analogWrite(led1,value);
}

void setLed2()
{
  byte value = messenger.readInt16Arg();
  analogWrite(led2,value);
}



void setup() 
{
  Serial.begin(9600);
  messenger.attach(1, setLed1);
  messenger.attach(2, setLed2);
}

void loop() 
{
  messenger.feedinSerialData();
}

@J-M-L
Nein, irgendwelche Sicherheitsmaßnahmen habe ich da nicht eingebaut.
Werte über 255 können unerwartete Leuchtstärken zeigen.

1 Like

Ah, die gute alte Combie Methode...

CmdMessenger.h: No such file or directory

Ich habe nichts gesagt :innocent: :speak_no_evil:
(aber ich dachte darüber nach :slight_smile: )

➜ siehe den anderen Post

Ist dein Google kaputt?

Hier mal der Link zur Library: GitHub - thijse/Arduino-CmdMessenger: CmdMessenger Communication library for Arduino & .NET
Falls noch mehr Unklarheiten bestehen, einfach fragen, ja nicht selber suchen!

Tipp:
in der CmdMessenger.h kann man auch die Buffergrößen anpassen.