mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Infrarotfernbedienung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Xob T. (milirp)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ein paar Ideen dazu -

decode_results results;
int newresult;


    void loop () {
     if (newresult = irrecv.decode(&results)) 
     {
       Serial.println(results.value);
       irrecv.resume(); // Receive the next value
       delay (300);
     }

     if ( newresult && results.value == a1)
     {
         ...... 
         // TEIL A
         digitalWrite (LEDB, HIGH);
         delay (5000);                      // Delay ist schlechet
                                            // Das Programm kann in 
                                            // diesen 9 Sekunden auf
                                            // nichts reagieren.
         digitalWrite (LEDG, HIGH);
         delay (4000);
         ....
     }
     if (newresult && results.value == a2)  // Wenn Taste 2 kommt
     {
        digitalWrite (LEDG, LOW);           // LEDG auschalten ( Warum ? ) 
        digitalWrite (LEDR, LOW);
        digitalWrite (LEDB, LOW);
       // TEIL B
        digitalWrite (LEDG, HIGH);          // LEDG Einschalten
     }


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. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Das Zauberwort dazu heisst: Zustandautomat oder Endlicher Automat oder 
State Machine.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
wie ist das gemeint?

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Emilio R. schrieb:
> wie ist das gemeint?

Soetwas wie
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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Xob T. (milirp)


Bewertung
0 lesenswert
nicht lesenswert
und wie ist das bei der for() Funktion.
Das selbe wie bei Delay() ?

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
https://www.arduino.cc/en/Tutorial/DimmingLEDs

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.