Hallo. Ich habe diesen Sketch geschreiben aber ich habe das Problem 1. das, wenn ich bei Teil A (in void loop) , den Ich mit der Taste a1 auf der Fernbedienung in gang gesetzt habe, nicht wärend des Vorgangs (also wenn zuerst die eine LED eingeschaltet wird und dann die andere LED) auf Teil B schalten kann. Ich muss immer erst noch warten bis dieser Vorgang wieder neu beginnt, dann muss ich schnell die Taste a2 drücken. Wie kann ich jeder Zeit, also auch wärend des Vorganges einen anderen Vorgang starten? Jemand eine Idee? Und 2. Wenn ich den A -Teil weg lasse und teil B starte, dann leuchtet die LED, wenn ich die Taste betätige heller (in ihrem Normalzustand ) und dimmt dann etwas die Helligkeit runter. Sie soll aber immer, wie im Normalzustand leuchten. #include <IRremote.h> #define a1 1286856990 #define a2 1286803950 const int LEDB = 6; const int LEDG = 5; const int LEDR = 3; int RECV_PIN = 8; IRrecv irrecv(RECV_PIN); decode_results results; void setup(){ pinMode (LEDB, OUTPUT); pinMode (LEDG, OUTPUT); pinMode (LEDR, OUTPUT); Serial.begin(9600); irrecv.enableIRIn(); } void loop () { if (irrecv.decode(&results)) { Serial.println(results.value); irrecv.resume(); // Receive the next value delay (300); } if ( results.value== a1){ digitalWrite (LEDG, LOW); digitalWrite (LEDR, LOW); digitalWrite (LEDB, LOW); // TEIL A digitalWrite (LEDB, HIGH); delay (5000); digitalWrite (LEDG, HIGH); delay (4000); } if (results.value== a2){ digitalWrite (LEDG, LOW); digitalWrite (LEDR, LOW); digitalWrite (LEDB, LOW); // TEIL B digitalWrite (LEDG, HIGH);} Mit freundlichen Grüßen Emilio
Ein paar Ideen dazu -
1 | decode_results results; |
2 | int newresult; |
3 | |
4 | |
5 | void loop () { |
6 | if (newresult = irrecv.decode(&results)) |
7 | {
|
8 | Serial.println(results.value); |
9 | irrecv.resume(); // Receive the next value |
10 | delay (300); |
11 | }
|
12 | |
13 | if ( newresult && results.value == a1) |
14 | {
|
15 | ......
|
16 | // TEIL A
|
17 | digitalWrite (LEDB, HIGH); |
18 | delay (5000); // Delay ist schlechet |
19 | // Das Programm kann in
|
20 | // diesen 9 Sekunden auf
|
21 | // nichts reagieren.
|
22 | digitalWrite (LEDG, HIGH); |
23 | delay (4000); |
24 | ....
|
25 | }
|
26 | if (newresult && results.value == a2) // Wenn Taste 2 kommt |
27 | {
|
28 | digitalWrite (LEDG, LOW); // LEDG auschalten ( Warum ? ) |
29 | digitalWrite (LEDR, LOW); |
30 | digitalWrite (LEDB, LOW); |
31 | // TEIL B
|
32 | digitalWrite (LEDG, HIGH); // LEDG Einschalten |
33 | }
|
Ich würde im TEIL-A nicht die LED direkt schalten, sondern einen Timer starten. In der Hautschaleife den Timer abfragen. Wenn Timer abgelaufen LED schalten.
Das Zauberwort dazu heisst: Zustandautomat oder Endlicher Automat oder State Machine.
Emilio R. schrieb: > Jemand eine Idee? Aufrufe von delay(), gar noch mit langen Zeiten, blockiert den µC und sind Gift für die Bedienbarkeit.
Emilio R. schrieb: > wie ist das gemeint? Soetwas wie
1 | delay (4000); |
beschäftigt den µC für geschlagene 4 Sekunden mit Däumchendrehen und er kann auf nichts anderes reagieren, sofern man nicht mit Interrupts arbeitet.
Emilio R. schrieb: > wie ist das gemeint? Genau so. Delay() ist selten nützlich und wenn, dann nur im Bereich von maximal wenigen zehn µs oder weniger. Alles andere zeigt nur, dass der Benutzer (also in diesem Falle du) nicht programmieren kann. Fazit: Lerne es einfach (das Programmieren). Das magische Stichwort wurde bereits genannt: state machine.
ilio R. schrieb: > wie ist das gemeint? Magst du mal schauen was ich oben in deinem Quelltext editiert hatte ? Da stand schon warum der delay hier schlecht ist.
Ok vielen Dank erstmal. Bin noch Anfänger, beschäftige mich damit noch nicht so lange.
Emilio R. schrieb: > und wie ist das bei der for() Funktion. Eine for()-Funktion gibt es nicht. "For" ist in C u.a. Sprachen ein reserviertes Schlüsselwort, das eine Schleife einleitet.
Kommt drauf an was du in der Schleife tust. Delay legt einfach den Rechner lahm. In der Zeit reagiert er auf nichts. bei for i=0; i < 10000; i++ { delay (1); } wirds nicht besser. Aber ansonsten kann die Schleife sehr sinnvoll sein. Zeig mal was du vor hast
ja genau diesen Fade Effekt das eine Farbe in die andere verläuft : for (int x = 0 ; x < 8; x++) { digitalWrite ( LEDB, HIGH); delay (250); digitalWrite (LEDB, LOW); delay (250); } for (int g = 0 ; g < 16; g++) { digitalWrite ( LEDG, HIGH); delay (150); digitalWrite (LEDG, LOW); delay (150); }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.