LED Dimmen mit Serial Port! Bitte :/

read liefert übrigens ein int zurück
Eine Binär-0 kriegt man auch nur sehr mühsam übertragen (mit dem SerialMonitor geht's z.B. nicht)

Hat bestimmt funktioniert.
Nur anders als du denkst.
Was macht die Ausgabe

Ändere die mal in
Serial.print((int)serialData);

1 Like

Ja, doch es hat funktioniert.... Ich sollte nur die ASCII code Tabelle benutzen, un die richtige Eingabe zu geben :smiley:

das heißt nun du schickst nicht mehr 0 bis 100 sonder a bis e?
Wenn das für dich akzeptabel ist, dann markiere die Lösung von xy als Lösung.
Dann kann hier zugemacht werden.

1 Like

Jetzt bin ich verwirrt...
https://www.arduino.cc/reference/de/language/functions/communication/stream/streamread/
Es kommt doch entweder ein Byte oder -1, wenn keine Daten vorhanden, oder klemmt es jetzt bei mir. (Um die -1 abzubilden bräuchte es einen signed int, aber doch nicht für die Nutzdaten.)

gleiche Idee, aber anders geschrieben.
'0' bis '9' und 'a' bis 'z' unterstützen, um 36 mögliche Schritte zu haben

char serialData;
const byte ledPin = 3;

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

void loop()
{
  int r;
  switch (r = Serial.read()) {
    case '0' ... '9': analogWrite(ledPin, (255 * (r - '0')) / 35); break;      // (r - '0') ist in der Zwischenzeit [0, 9]
    case 'a' ... 'z': analogWrite(ledPin, (255 * (r - 'a' + 10)) / 35); break; // (r - 'a' + 10) ist in der Zwischenzeit [10, 35]
    default: break; // ignorieren
  }
}
3 Likes

Es kommt ein Wert zwischen -1 (0xFFFF) und 255 (0x00FF) einschliesslich
255 passt locker gerade noch in ein Byte, aber -1 nicht.

1 Like

wenn da noch eifrig weiterdiskutiert wird.
Also ich hätte es ursprünglich so gelesen, als dass da Prozentwerte von 0 .. 100 über die Schnittstelle kommen.
Ein valider Weg ist dann wie in den Serial Input Basics beschrieben ist.

@mahmoud-alhmada : ich empfehle dir auf alle Fälle das Tutorial auch zu lesen, es erklärt einiges wie man mit der Seriellen umgeht.

Hier eine Umsetzung - man muss darauf achten, dass der Serial Monitor auch mit einem Linefeed abschließt:

// read: https://forum.arduino.cc/t/serial-input-basics-updated/382007/3
// Example 4 - Receive a number as text and convert it to an int

const byte numChars = 32;
char receivedChars[numChars];   // an array to store the received data

boolean newData = false;

int dataNumber = 0;             // new for this version

const int ledPin = 3;

void setup() {
  Serial.begin(9600);
  Serial.println("<Arduino is ready>");
  pinMode(ledPin, OUTPUT);
}

void loop() {
  recvWithEndMarker();
  showNewNumber();
}

void recvWithEndMarker() {
  static byte ndx = 0;
  char endMarker = '\n';
  char rc;

  if (Serial.available() > 0) {
    rc = Serial.read();

    if (rc != endMarker) {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars) {
        ndx = numChars - 1;
      }
    }
    else {
      receivedChars[ndx] = '\0'; // terminate the string
      ndx = 0;
      newData = true;
    }
  }
}

void showNewNumber() {
  if (newData == true) {
    dataNumber = 0;             // new for this version
    dataNumber = atoi(receivedChars);   // new for this version
    Serial.print("This just in ... ");
    Serial.println(receivedChars);
    Serial.print("Data as Number ... ");    // new for this version
    Serial.println(dataNumber);     // new for this version
    newData = false;
    // convertieren
    if (dataNumber > 100) dataNumber = 100;
    int pwm = dataNumber * 255 / 100;
    Serial.print("converted ... ");
    Serial.println(pwm);
    // ausgeben
    analogWrite(ledPin, pwm);
  }
}
1 Like

Sie behandeln den Fall, in dem die Eingabe > 100 ist, aber Sie prüfen nicht auf negative Zahlen.

atoi() ist nicht sicher zu verwenden, da es Ihnen nicht sagt, ob der Eintrag Müll war, zum Beispiel atoi ("Hallo") ➜ 0

es wäre besser, strtol() zu verwenden

1 Like

Hello
Guck mal hier:
https://www.arduino.cc/reference/en/language/functions/communication/serial/readstringuntil/

1 Like

Der Timeout kann dir üble Streiche spielen.

Das ist schon beherrschbar....

#include <Streaming.h> // die Lib findest du selber ;-)
Stream &cout = Serial; // cout Emulation für "Arme"

constexpr byte   ledPin     {3};
constexpr size_t bufferlen {10};
String buffer;

void serialEvent()
{
  
  if(buffer.length()>= bufferlen) // overflow unterbinden
  {
    buffer = "";
    return;
  }
  
 int zeichen = Serial.read();
 
  switch(zeichen)
  {
    case '0' ... '9': buffer += char(zeichen);
                      break;  

    case '\r': /* fall through */
    case '\n': if(buffer.length()) 
               {
                 long value = buffer.toInt();
                 buffer = "";
                 if(value >= 0 && value <= 0xff)
                 {
                   cout << value << endl;
                   analogWrite(ledPin,value);
                 }  
               }
               break;  
               
   default: buffer = ""; // Muellzeichen loeschen den Buffer
  }
}

void setup() 
{
  Serial.begin(9600);
  buffer.reserve(bufferlen+1);
  cout << F("Start: ") << F(__FILE__) << endl;
}

void loop() 
{

}
1 Like

also wenn ich "123Müll567" sende?

1 Like

Das 'M' löscht meinen Buffer
Auch die anderen Buchstaben.
"567" passt nicht in ein Byte, wird also auch von meinem Code ignoriert.

Wenn du "123Müll567" sendest, passiert rein gar nichts.
Wird vollständig ignoriert.

OK, ich habe den Byte-Test vergessen.

Betrachten Sie "123XXX120\n" (\n = new line)
Warum würden Sie dies als 120 akzeptieren und die 123 ignorieren?

oder betrachten Sie "0123456789120\n"

Warum würden Sie akzeptieren, dass dies 120 ist?

in beiden Fällen ist die Eingabe fehlerhaft und sollte abgelehnt werden.

Wenn dir das nicht gefällt, dann mache es doch besser.

Zudem sind das offensichtlich deine Anforderungen und nicht die des TO

Es war nur ein konstruktiver Kommentar.

Korrekt

ich hab mich gestern die ganze Zeit beschäftigt, mit dem (Case-Switch) Funktion und das war sehr Interssant....
Vielen Dank für den Tipp, der mich sehr geholfen hat :slight_smile:

Ich wollte euch berrichten, was ich gefunden habe, vielleicht wäre das für euch auch Interssant :slight_smile:
@J-M-L

diese Code hat funktioniert. Ich habe das für meinem Fal geändert. D.H:
Ich habe einfach nur 5 Cases von 0 bis 5.
Wenn ich 1 eingebe bekomme ich 0,5 volt (25%)
Wenn ich 2 eingebe bekomme ich 1 volt (50%) usw..
0 ist ausschalten
aber das Problem war, wenn ich 1 eingebe mancmal reagiert nicht ich muss 2 oder 3 mal eingeben!! als die Sync. stimmt nicht so gut!! Ich habe die Baud Rate auf 115200 gesteigert!! es hat nicht richtig geholfen :smiley:

@my_xy_projekt
diese Code hat auch funktioniert, aber
wenn ich b eingebe, bekomme ich 0,4 Volt
wenn ich c eingebe, bekomme ich 0,6 Volt
wenn ich d eingebe, bekomme ich 0,9 Volt
wenn ich e eingebe, bekomme ich 2 Volt!!!!!
a war auschalten.... das war für mich überhaupt unlogisch :smiley:
Aber diese Code hat kein Sync. Problem, D.H: die LED reagiert sehr schnell, wenn ich einen Befehl gebe.

kannst du deinen geänderten Code posten?

Naaa...
Das ist ein PWM-Signal. Da einfach mit nem Voltmeter ranzugehen macht keinen wirklichen Sinn... analogWrite() - Arduino-Referenz
Wennn Dir die Werte nicht passen, musst Du die ändern.
64 für 25%, 128 für 50% 192 für 75%, 255 für 100
Aus machste nicht mit 0 sondern mit digitalWrite(pin, LOW).

1 Like

Was aber das gleiche ist :wink: , analogWrite(pin,0) wird intern in digitalWrite(pin, LOW). umgesetzt,
Ebenso wird analogWrite(pin,255) zu digitalWrite(pin, HIGH).
Das muss man nicht selbst beachten.

3 Likes

Sachen gibts,
hab da auch schon ewig nicht mehr reingesehen (wiring_analog.c)

void analogWrite(uint8_t pin, int val)
{
	// We need to make sure the PWM output is enabled for those pins
	// that support it, as we turn it off when digitally reading or
	// writing with them.  Also, make sure the pin is in output mode
	// for consistenty with Wiring, which doesn't require a pinMode
	// call for the analog output pins.
	pinMode(pin, OUTPUT);
	if (val == 0)
	{
		digitalWrite(pin, LOW);
	}
	else if (val == 255)
	{
		digitalWrite(pin, HIGH);
	}
	else
	{

auch dass da ein pinMode gesetzt wird, hatte ich auch nicht mehr am Radar...

1 Like