Moin,
ich probiere gerade mit dem Arduino Nano, dass wenn ich den Taster gedrückt halte, dass die RGB-LED langsam heller wird. Wenn ich den Taster loslasse, soll die LED nicht heller werden. Das Gleiche mit einem anderen Taster, um die LED wieder dunkler zu machen. Aber wie? Ich bekomm das irgendwie nicht hin.
int t = 25;
void setup()
{
DDRB = 63;
DDRC = 0;
Serial.begin(9600);
}
void heller_werden(void)
{
int taster = PINC & 0x0f;
int n = 0;
int m = 51;
if (taster == 1)
do
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
delay(t);
n = n + m;
Serial.println(n);
}
while (n <= 255);
}
void dunkler_werden(void)
{
int taster = PINC & 0x0f;
int n = 255;
int m = 51;
if (taster == 2)
do
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
delay(t);
n = n - m;
Serial.println(n);
}
while (n >= 0);
}
void loop()
{
int taster = PINC & 0x0f;
int n = 255;
int m = 51;
heller_werden();
dunkler_werden();
while (taster == 4)
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
delay(t);
n = n + 1;
}
while (taster == 8)
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
delay(t);
n = n - 1;
}
}
So verfällt der in einer Endlosschleife und wird heller und heller, dann plötzlich aus und dann wieder von vorne.
Kann mir jemand helfen?
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.
Gib uns bitte den vollständigen, kompilierfähigen Sketch.
Gruß Tommy
@Tommy56
Sorry, habs erst nicht herausgefunden wie es geht, hab es jetzt korrigiert.
Das ist eine endlos-Schleife, weil taster innerhalb der while Schleife nicht verändert wird.
Außerdem ist loop eine wunderbare Schleife, while
brauchst du nicht.
const byte TASTERUP = 3;
const byte TASTERDN = 4;
const byte LED = 9; // PWM - Pin
byte brightness=255; // Start mit voller Helligkeit
void setup() {
}
void loop() {
if (digitalRead(TASTERUP) && brightness < 255) { brightness++; delay(50); }
if (digitalRead(TASTERDN) && brightness > 0) { brightness--; delay(50); }
analogWrite(LED, brightness);
}
Bei INPUT_PULLUP Tastern andersrum
ChrisW10021999:
ich probiere gerade mit dem Arduino Nano, dass wenn ich den Taster gedrückt halte, dass die RGB-LED langsam heller wird. Wenn ich den Taster loslasse, soll die LED nicht heller werden. Das Gleiche mit einem anderen Taster, um die LED wieder dunkler zu machen. Aber wie? Ich bekomm das irgendwie nicht hin.
...
Kann mir jemand helfen?
Ich habe mir Deinen Code nicht angesehen.
Im Grunde möchtest Du mehrere Sachen gleichzeitig machen - z. B. prüfen, ob ein Taster gedrückt ist und gleichzeitig die LED dimmen. So etwas machst Du am besten mit einem „endlichen Automaten“. Evtl. hilft mein Geschreibsel dazu.
Gruß
Gregor
Ne, tut mir leid. Keine von Euch beiden habt mir irgendwie helfen können. Ich habe den Code jetzt etwas verändert:
int t = 25;
void setup()
{
DDRB = 63;
DDRC = 0;
Serial.begin(9600);
}
void heller_werden(void)
{
int taster = PINC & 0x0f;
int n = 0;
int m = 51;
if (taster == 1) //Taster 1
do
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
//delay(t);
n = n + m;
Serial.println(n);
}
while (n <= 255);
}
void dunkler_werden(void)
{
int taster = PINC & 0x0f;
int n = 255;
int m = 51;
if (taster == 2) //Taster 2
do
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
//delay(t);
n = n - m;
Serial.println(n);
}
while (n >= 0);
}
void loop()
{
int taster = PINC & 0x0f;
int n = 255;
int m = 51;
heller_werden();
dunkler_werden();
if (taster == 4 && n < 255) //Taster 3
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
delay(t);
n = n + 1;
Serial.println(n);
}
if (taster == 8 && n > 0) //Taster 4
{
analogWrite(9, n);
analogWrite(10, n);
analogWrite(11, n);
delay(t);
n = n - 1;
Serial.println(n);
}
}
Jetzt ist es, wenn ich die LED heller machen will, passiert nix, und wenn ich auf den Taster zum dunkler machen drücke, geht die LED an. Ich sitz hier seit 5 Stunden dran und check es einfach nicht.
ChrisW10021999:
Ne, tut mir leid. Keine von Euch beiden habt mir irgendwie helfen können. ... Ich sitz hier seit 5 Stunden dran und check es einfach nicht.
Versuche, den „Mechanismus“ eines endlichen Automaten zu verstehen. Außerdem ist es sehr hilfreich, „schönen“ Code zu schreiben.
Um das Zweite kommst Du evtl. herum, um das Erste garantiert nicht.
Gruß
Gregor
Ich habe den Code jetzt etwas verändert
while () {}
kannst du natürlich durch do {} while();
ersetzen. Aber ich bin dann draußen.
michael_x:
while () {}
kannst du natürlich durch do {} while();
ersetzen. Aber ich bin dann draußen.
Hab ich auch schon versucht, macht aber keinen Sinn, da das eine fußgesteuerte Schleife ist, d.h. er führt die Anweisungen erst einmal aus, bevor die Bedingung geprüft wird.
Hi
Warum machst Du direkte Port-Zugriffe?
Das lässt sich sehr schwer lesen.
Auch hast Du jede Menge 'magic numbers' in Deinem Code verstreut, so sind weder Anpassungen einfach, noch ist selbst Dir in zwei Wochen nicht mehr klar, was Du Wo wolltest.
Sprechende Variablen verändern Einiges zum Besseren - x/a/i benutze ich nur in for-Schleifen, in Denen ich eine Reihe durchzähle, die Variablen, Die einen bestimmten Wert enthalten, heißen pin_button, pin_led, var_helligkeit - da ist mir auch in einem Jahr noch klar, daß Das wohl zwei Pins sind, 1x Taster, 1x LED und der Inhalt der anderen Variable hat wohl direkt was mit der Helligkeit zu tun.
Deine Funktionen heller/dunklerwerden() fragen selber NICHT den entsprechenden Button ab - wie soll die WHILE-Schleife (wieso while??) da abgebrochen werden?
Der Sketch macht genau, was Du schreibst.
Zähle so lange hoch, bis wir bei 255 sind - darin ist kein Taster enthalten, der das Hochdimmen beim Loslassen abbrechen könnte.
MfG
Und was ist an dem Tip "mach es ohne Schleife" so schwer?
Ich dachte du willst, dass die Leds langsam heller oder dunkler werden, während du einen Taster gedrückt hältst, und so bleiben wie sie sind, wenn du die Taster los lässt?
Ein Loop-Durchlauf fragt also einfach ab, ob einer der beiden Taster gedrückt ist, und verändert gegebenenfalls die Soll-Helligkeit um einen kleinstmöglichen Schritt. Die loop wird dann soweit verzögert, dass die gewünschte Geschwindigkeit erreicht wird.
Das ist ein einfacher Kompromiss zwischen "loop darf überhaupt keine Zeit brauchen um schnell auf Ereignisse reagieren zu können" und einer Pseudo - Loop die ewig in inneren Schleifen voller delay() hängt und dadurch fürchterlich kompliziert ist.
Kannst natürlich auch das kleine
delay(50); // ergibt 250 Schritte in 12,5 Sec
durch eine gar nicht blockierende Lösung ersetzen.
Wenn du unbedingt non-Arduino-style programmieren willst, kannst du meinetwegen auch PINC verwenden.
(Pins A0 ... A5 beim Uno)