lvalue required as left operand of assignment SOLVED!

Hallo,

mein Code liest ein Analogsignal ein und dieses will ich umrechnen. (siehe unten)

double sensorPin = A0;   // select the input pin for the potentiometer
double sensorValue = 0;  // variable to store the value coming from the sensor
int dimled = 8;          // pin led dimmen
int a;                // hilfsvariable berechnung
int b;                // prozentualer wert von senorValue (100% = 50)
int Dauer;


void setup() 
{
  // declare the ledPin as an OUTPUT:
    pinMode(dimled, OUTPUT);
}

void loop() 
{
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);
  // turn the ledPin on

  sensorValue * 10 = a;
  (100/50) * a = b;         // prozent Helligkeit
  (b/100) * 2 = Dauer;

in der letzten Zeile bekomme ich den Error: lvalue required as left operand of assignment

Weis jemand was ich falsch mache, oder nicht beachtet hatte?

Viele Grüße

Entweder dein Sketch ist nicht vollständig oder es fehlt eine schließende "}" Klammer.

Also hier noch einmal der Vollständige Code. Hatte vorhin nur einen Teil eingefügt.

double sensorPin = A0;   // select the input pin for the potentiometer
double sensorValue = 0;  // variable to store the value coming from the sensor
int dimled = 8;          // pin led to dime
int a;                   // hilfsvariable berechnung
int b;                   // prozentualer wert von senorValue (100% = 50)
int Dauer;


void setup() 
{
  // declare the ledPin as an OUTPUT:
    pinMode(dimled, OUTPUT);
}

void loop() 
{
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);
  // turn the ledPin on

  sensorValue * 10 = a;
  (100/50) * a = b;         // prozent Helligkeit
  (b/100) * 2 = Dauer;

    
  digitalWrite(dimled, HIGH);
  // stop the program for <sensorValue> milliseconds:
  delay(Dauer);
  // turn the ledPin off:
  digitalWrite(dimled, LOW);
  // stop the program for for <sensorValue> milliseconds:
  delay(2-Dauer);
}

Alle Klammern sind eigentlich da..

Irgendwelche Ideen?

(b/100) * 2 = Dauer;

RValue und LValue vertauscht!

Du meinst sicherlich;

Dauer = (b/100) * 2;
  sensorValue * 10 = a;

Auch hier?!

Ja, die Übergabe der Daten in Variable ist falsch.
Z.b. "a=sensoValue*10"

Super. Danke.

Das war auch schon das Problem.

Jetzt wird alles super kompiliert.
Am Ende ist mein Ziel, dass eine LED in abhängigkeit vom Analogen Signal gedimmt wird. Das Signal wird über ein Potentiometer verändert. Also variiert das Signal von 0 V bis 5 V. Je nach Einstellung.

Leider leuchtet die LED beim Hochladen des Codes nur kurz auf und dann bleibt sie aus. Ist von der Code-Seite her alles korrekt?

double sensorPin = A0;   // select the input pin for the potentiometer
double sensorValue = 0;  // variable to store the value coming from the sensor
int dimled = 8;          // pin led to dime
double a;                   // hilfsvariable berechnung
double b;                   // prozentualer wert von senorValue (100% = 50)
double Dauer;


void setup() 
{
  // declare the ledPin as an OUTPUT:
    pinMode(dimled, OUTPUT);
}

void loop() 
{
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);
  // turn the ledPin on

  a = sensorValue * 10;
  b = (100/50) * a;         // prozent Anteil Einschaltdauer in Periode von 2 ms
  Dauer = (b/100) * 2;      // einschaltdauer in ms

    
  digitalWrite(dimled, HIGH);
  // stop the program for <sensorValue> milliseconds:
  delay(Dauer);
  // turn the ledPin off:
  digitalWrite(dimled, LOW);
  // stop the program for for <sensorValue> milliseconds:
  delay(2-Dauer);
}

Nimm einen der PWM Pins zum dimmen...

Die Möglichkeit kenne ich auch.. Wollte es aber gerne so probieren um einen Lerneffekt zu haben.
Verschiedene Wege führen nach Rom und so.

Danke schon einmal für Hilfen

delay(2-Dauer);

Was kommt bei der Berechnung (2-Dauer) raus?
Was macht delay() mit/wegen dem Wert?

Für den besten Lerneffekt, solltest du dir das Datenblatt des Prozessors anschauen, und ein gutes C++ Buch lesen.

titoardo:
Die Möglichkeit kenne ich auch.. Wollte es aber gerne so probieren um einen Lerneffekt zu haben.
Verschiedene Wege führen nach Rom und so.
.....

Und was hast du daraus gelernt ?
Das es so nicht geht ?

combie:

delay(2-Dauer);

Was kommt bei der Berechnung (2-Dauer) raus?
Was macht delay() mit/wegen dem Wert?

(2-Dauer) ist die Ausschaltdauer der LED.

delay hält das Programm für die jeweilig in der Klammer stehende Zahl an.

HotSystems:
Und was hast du daraus gelernt ?
Das es so nicht geht ?

Also ich habe aus der Variante mit PWM nicht sehen können, dass die andere Variante die ich gerade versuche nicht funktionieren sollte...

Hallo,

die Werte und Zwischenwerte Deiner Rechnerei hast Du Dir mal z.B. mit Serial.print ausgeben lassen?
Die passen zu Deinen Erwartungen?

Gruß aus Berlin
Michael

titoardo:
(2-Dauer) ist die Ausschaltdauer der LED.

delay hält das Programm für die jeweilig in der Klammer stehende Zahl an.

Soweit richtig!
Und dennoch befriedigt das Ergebnis nicht deine Erwartungshaltung.


Allerdings meinte ich das auch eher so:

die Werte und Zwischenwerte Deiner Rechnerei hast Du Dir mal z.B. mit Serial.print ausgeben lassen?
Die passen zu Deinen Erwartungen?

Bitte folge dem Tipp.


Also ich habe aus der Variante mit PWM nicht sehen können, dass die andere Variante die ich gerade versuche nicht funktionieren sollte...

Das kommt noch....
Versprochen.

Wenn man in Deinem Programm ein paar Dinge ändert, kommt tatsächlich PWM raus. Die Zeitspanne beträgt 408 ms, weshalb eine LED für uns Menschen eher als blinkend wahrgenommen wird, Dimmen müßte schneller sein.

Also PWM ist es, aber Dimmen eher nicht.

const byte sensorPin = A0;   // select the input pin for the potentiometer
unsigned int sensorValue;    // variable to store the value coming from the sensor
const byte dimled = 8;       // pin led to dime
unsigned int a;              // hilfsvariable berechnung
unsigned int b;              // prozentualer wert von senorValue (100% = 50)
unsigned int dauer;


void setup()
{
  Serial.begin(9600);
  // declare the ledPin as an OUTPUT:
  pinMode(dimled, OUTPUT);
}

void loop()
{
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);

  a = sensorValue * 10;
  b = (100 / 50) * a;     // prozent Helligkeit
  dauer = (b / 100) * 2;
  Serial.print("sensorValue: "); Serial.print(sensorValue);
  Serial.print("\ta: "); Serial.print(a);
  Serial.print("\tb: "); Serial.print(b);
  Serial.print("\tdauer: "); Serial.print(dauer);
  Serial.println();

  digitalWrite(dimled, HIGH);
  // stop the program for <sensorValue> milliseconds:
  delay(dauer);
  // turn the ledPin off:
  digitalWrite(dimled, LOW);
  // stop the program for for <sensorValue> milliseconds:
  delay(1023 * 2 / 10 * 2 - dauer);
}

Mit delayMicroseconds kommst Du näher an Dein Ziel, nur Serial geht dann nicht mehr, weil zu langsam:

const byte sensorPin = A0;   // select the input pin for the potentiometer
unsigned int sensorValue;    // variable to store the value coming from the sensor
const byte dimled = 8;       // pin led to dime
unsigned int a;              // hilfsvariable berechnung
unsigned int b;              // prozentualer wert von senorValue (100% = 50)
unsigned int dauer;


void setup()
{
  // declare the ledPin as an OUTPUT:
  pinMode(dimled, OUTPUT);
}

void loop()
{
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);

  a = sensorValue * 10;
  b = (100 / 50) * a;     // prozent Helligkeit
  dauer = (b / 100) * 2;
  digitalWrite(dimled, HIGH);
  // stop the program for <sensorValue> milliseconds:
  delayMicroseconds(dauer);
  // turn the ledPin off:
  digitalWrite(dimled, LOW);
  // stop the program for for <sensorValue> milliseconds:
  delayMicroseconds(1023 * 2 / 10 * 2 - dauer);
}

Ob Deine Berechnungen zum Kommentar passen, habe ich mir nicht angesehen :slight_smile:

Danke agume. Mit deiner Hilfe habe ich es geschafft, dass das Programm auch das tut was es soll.

Problem nur. Ein Dimmen ist so nicht möglich.. nur blinken. Es scheint mir, dass die benötigte Frequenz nicht erreicht werden kann.

Kann mir da wer etwas zu erklären?

Viele Grüße

titoardo:
Es scheint mir, dass die benötigte Frequenz nicht erreicht werden kann.

Richtig, der µC ist dafür zu langsam.

Weil die Entwickler das wußten, haben sie einigen Ausgängen im Zusammenspiel mit Timern die spezielle Möglichkeit für PWM mitgegeben. Mit analogWrite (analog ist irreführend) kannst Du an diesen Ausgängen ein PWM-Signal erzeugen.