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?
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);
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.
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!
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?
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);
}
}
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.
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
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.