Infrarotfernbedienung

OP #4681290
Lesenswert?

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
Gast #4681343
Lesenswert?

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.
Gast #4682364
Lesenswert?

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.
Gast #4683877
Lesenswert?

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
OP #4683950
Lesenswert?

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);
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren