Forum: Mikrocontroller und Digitale Elektronik Infrarotfernbedienung


von Xob T. (milirp)


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

von NurEinGast (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Das Zauberwort dazu heisst: Zustandautomat oder Endlicher Automat oder 
State Machine.

von Wolfgang (Gast)


Lesenswert?

Emilio R. schrieb:
> Jemand eine Idee?

Aufrufe von delay(), gar noch mit langen Zeiten, blockiert den µC und 
sind Gift für die Bedienbarkeit.

von Xob T. (milirp)


Lesenswert?

wie ist das gemeint?

von Wolfgang (Gast)


Lesenswert?

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.

von c-hater (Gast)


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.

von NurEinGast (Gast)


Lesenswert?

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.

von Xob T. (milirp)


Lesenswert?

Ok vielen Dank erstmal.
Bin noch Anfänger, beschäftige mich damit noch nicht so lange.

von Xob T. (milirp)


Lesenswert?

und wie ist das bei der for() Funktion.
Das selbe wie bei Delay() ?

von Wolfgang (Gast)


Lesenswert?

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.

von NurEinGast (Gast)


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

von Xob T. (milirp)


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

von NurEinGast (Gast)


Lesenswert?

https://www.arduino.cc/en/Tutorial/DimmingLEDs

Für den Fade effekt würde ich mir mal PWM anschauen.

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
Noch kein Account? Hier anmelden.