Hilfe bei Variablen

Hallo liebes Forum,

ich sitze momentan an einer Projektarbeit für meine Technikerausbildung und benötige dabei Hilfe im Umgang mit Arduino.

Ich möchte den Wert zwischen zwei Sensoren auslesen und über 5 LED´s wiedergeben

sind beide werte gleich soll die mittlere grüne LED leuchten
schweift der wert nach links soll erst eine gelbe, bei weiterem einseitigem erhöhen eine rote LED leuchten
schweift der wert nach rechts soll wieder eine gelbe, bei weiterem einseitigem erhöhen eine rote LED leuchten.

nun frage ich mich ob bei meiner Anwendung/Sketch eine if abfrage sinnvoll ist?

gruß

k1ff

Sieh dir mal die Beispiele einer if-Abfrage in der IDE an, das sollte schon passen.

Verdammt ... zu langsam.

Wobei ich 'Vielleicht' geschrieben hätte :wink:

Was hast Du denn schon an Sketch zusammen?
Wo hakt Es im Detail?
Und: Bitte jetzt Nicht 'Nichts' liefern.

MfG

nun frage ich mich ob bei meiner Anwendung/Sketch eine if abfrage sinnvoll ist?

Möglich ja, aber nicht unbedingt sinnvoll!

Denn offensichtlich hast du mehrere Schwellwerte.
Also wenn, dann mehrere If Anweisungen.
Mehrere If Anweisungen, verkettet, sind "unschön".

Also lautet meine Antwort: Eher Nein!
Es gibt sicherlich elegantere Möglichkeiten.
Auch welche ganz ohne If.

noiasca:
(und kommt mir jetzt nicht mit select ...)

Da mir "select" unbekannt ist, switch/case vermutlich nicht einfach zum Ziel führt, komme ich mit else als sinnvolle Ergänzung zu if.

hab den sketch mal angehangen.

projekt.ino (1.62 KB)

Da fehlt noch die zweite Schaltschwelle, und evtl. noch eine Hysterese.

sensorwertlinks = analogRead(einganglinks);

// Und danach

analogRead(sensorwertlinks)

Das MUSS doch falsch sein.

k1ff:
hab den sketch mal angehangen.

Besser wenn du den Sketch in Code-Tags (Schaltfläche </>) oben links im Editorfenster, postest. Dann können auch alle Mobilisten den Sketch lesen.

Switch case mit ... - Operator wäre mein Ansatz

Ich würde auch einfach die Differrenz der 2 Analogwerte bilden und mit mod() die resultierende Zahl auf Werte zwischen 0 und 4 ummappen.
Dann einfach das LED mithilfe eines Arrays einschalten.

Diff = analogRead(A0) - analogRead(A1) // Werte zwischen -1023 und +1023
index = map( Diff, -1023, 1023, 0, 4)
digitalwrite(ledpin[index], High);

Grüße Uwe

Dann einfach das LED mithilfe eines Arrays einschalten.

Da kann man noch einen drauf setzen....

Diff = analogRead(A0) - analogRead(A1); // Werte zwischen -1023 und +1023

index = map( Diff, -1023, 1023, 0, 4);

Genau sowas schwebte mir vor!

digitalwrite(ledpin[index], High);

So müsste man in einer Schleife 4 LEDs aus machen und eine entzünden.

Wenn man die LEDs geschickt auf einem Port verteilt...
z.B. von PB0 bis PB4

Dann:

byte pinMaske =  0b011111;

DDRB |=  pinMaske; // alle LED Pins zum Ausgang machen


// und später dann
// wenn der index berechnet ist

PORTB = (PORTB & ~pinMaske) | (1<<index);

Dann wird aus 5 mal digitalWrite(), mit jeweils über 100 Takte, ein Ausdruck, welcher nur etwas über 1 Dutzend Takte braucht.

Und damit ist die Nummer kurz, knapp und ohne jedes if erledigt.

Das sind alles gute Lösungen, aber ihr habt schon gelesen, dass der TE Anfänger und Auszubildender ist?
Da wäre m.M. nach ein „menschenlesbarer“ Code, klar und einfach, besser.
Ob der nun ein paar Zyklen mehr braucht oder nicht, ist bei der Aufgabenstellung wahrscheinlich egal.

In seiner Abschlussarbeit kann er dann solche optimierten Lösungen bringen.

ElEspanol:
Das sind alles gute Lösungen, aber ihr habt schon gelesen, dass der TE Anfänger und Auszubildender ist?
.....

Genau, Anfänger, der sich nicht um die Dinge kümmert, die hier geschrieben werden.

Da wäre m.M. nach ein „menschenlesbarer" Code, klar und einfach, besser.

Ich werde keinem Anfänger Wissen, Mittel oder Wege, vorenthalten, mit der Begründung, dass er noch zu **** dafür ist.
Ich teile mit, was ich weiß, und ob es genutzt, oder ausgeblendet wird, ist mir dabei egal.

Aber was ich nicht machen werde:
Mich dem Trend unterzuordnen, Anfänger dumm zu halten.

No!
Da habe ich mich ganz bewusst gegen entschieden.


Bitte nehmt euch ein Beispiel am Lernverhalten von Kindern!
Das ist der Weg, den jede(r) von uns gegangen ist.
Der Weg ist erfolgreich! Nicht ohne Hürden, aber meist erfolgreich.
Warum sollte das in der Arduino Welt anders sein?

Wenn nötig würde ich da gerne eine Küchenpsychologische Abhandlung drüber verfassen!

Da kann man noch einen drauf setzen....

Combie, deine Lösung beruht auf avr-gcc für einen atmega328, davon hat aber klff nichts gesagt.

Hat da nicht ein von mir sehr geschätztes Forumsmitglied, vor kurzem noch als Mantra was mit ungeprüften Voraussetzungen und falschen Annahmen oder so ähnlich erzählt? :wink:

Wenn es um 5 LED geht, muss man nicht unbedingt den schnellstmöglichen Sketch schreiben.
Dass uwefed vergessen hat, 4 LED auszuschalten, spricht nicht generell gegen eine Lösung auf Arduino-Sprach-Ebene.

Aber wie breit die Bereiche für grün, gelb und rot sein sollen, hat klff offen gelassen, das spricht gegen euren map - Vorschlag (oder eine einfache Division).

Da ist eine Schleife mit if, oder ElEspanol's case - Range deutlich flexibler.

Mein Vorschlag:

//                          ROT  GELB  GRÜN GELB  ROT
const byte leds[] =  {      10,    12,  13,  11,   9      };
const int limits[] = { -1024, -800, -200, 200, 700 , 1024 };


void setup() {
	for (byte pin : leds) pinMode(pin, OUTPUT);
}

void loop() {
	int wert1 = analogRead(A0);
	int wert2 = analogRead(A1);
	int diff = wert1 - wert2; // -1023 ... + 1023

	for (byte i = 0; i < sizeof(leds); i++) {
		if (limits[i] < diff && diff <= limits[i + 1]) 
			digitalWrite(leds[i], HIGH);
		else  
			digitalWrite(leds[i], LOW);
	}
}

warum kein if ?

Diff = analogRead(A0) - analogRead(A1); // Werte zwischen -1023 und +1023
index = map( Diff, -1023, 1023, 0, 4);

a) was wollt ihr dem TO empfehlen, wenn das Kriterium für gelb nicht genau auf der Hälfte für Rot liegen soll?
b) Außerdem ist der Bereich der Mitte (2) doch ziemlich groß - da linear - verteilt. D.h. selbst wenn die A0 und A1 zwischen etwa -255 bis 255 liegt ... wird immer noch Mitte angezeigt werden. Ob das im Sinne des TO ist?

Daher finde ich Michaels Vorschlag wesentlich besser, da flexibel genug und Anfängertauglich.

Hallo Leute,

Erstmal danke für die recht langen und schnellen Antworten.
Ich habe jetzt viele Ansätze gelesen und versucht zu verstehen. Allerdings bin ich kein Fan davon einen Sketch zu übernehmen der über meinen Kenntnissen liegt und den ich nicht verstehe/wiedergeben kann.
zu den Parametern : die grüne Lechtet bei einem parallelen Anstieg beider sensorwerte. Die gelben sind für eine abweichung bei 10 % ab 20% geht dann die rote an. Ist der maximalwert erreicht blinken beide roten LEDs. Der maximal Wert liegt bei 1000.
Hab das jetzt mit dem if /Else Funktionen gemacht. Allerdings ist mir nicht klar wie ich die abweichung in die Funktion schreibe

Gruß k1ff

Die gelben sind für eine abweichung bei 10 %

Wie groß ist die Differenz zwischen 0 und 1 ? (ca. 100 % würde ich sagen)
Und die Differenz zwischen 0 und 2 ?

Wenn du dir da im klaren bist, könntest du, wenn du wirklich willst,
statt der absoluten Differenz ( wert1 - wert2 ) // -1023 ... + 1023
eine relative nehmen: (wert1 - wert2) * 100 / (wert1+wert2+1) // - 100 ... + 100

Zu beachten ist, dass bei int-Division abgeschnitten wird und dass man nicht durch 0 dividieren sollte. :wink:

Hi ,

bin ja kein Ausbilder, aber wenn ein Anfänger mit so einer Lösung kommt , .... was soll der Ausbilder da denken.

Du solltest es mit If machen das kannst Du verstehen , und wenn der Ausbilder nachfragt auch erklären.

Differenz bilden und die Hyterese für die Mitte mit in die If Abfrage reinnehmen.

Nachtrag

ich war zu spät Michael_x das bezug sich nicht auf Deine Lösung

blinken beide roten LED

Interessant, noch eine Anforderung.....