ich bin am Verzweifeln...
Mittels IR-Fernbedienung schalte ich eine LED an bzw. aus. Das funktioniert.
Nach einer bestimmtem Zeit; hier PAUSE, soll die LED aber von allein abgeschalten werden.
Mit jedem LOOP müssten doch die millis() mehr werden und der festgebrannte Zeitwert currentmillis konstant bleiben. Und irgendwann müsste doch die "Aktuelle Zeit" minus "Zeitstempel" den Zeitintervall "PAUSE" überschritten haben.
Warum schaltet die LED1 in dem Beispiel nicht nach 5 Sekunden ab?
//diese sind für den Digispark konzipiert
#include <IRLib.h>
#include <IRLibMatch.h>
#include <IRLibTimer.h>
const long PAUSE = 5000; //Konstante für die Pause, hier 5 sek.
#define IR_RX_PIN 0 //Infrarotsensor an P0
#define LED1 1 //LED 1 an P1
#define BUTTON1 1086271695 //den bereits ausgelsenen FB-Code von Taste 1
long currentMillis = millis();
IRrecv My_Receiver(IR_RX_PIN);
IRdecode My_Decoder;
void setup()
{
My_Receiver.enableIRIn(); // Start IR-Empfänger
pinMode(LED1, OUTPUT);
digitalWrite(LED1, LOW); //LED1 definitiv aus
}
void loop()
{
if (My_Receiver.GetResults(&My_Decoder))
{
My_Decoder.decode();
if (My_Decoder.value == BUTTON1)
{
digitalWrite(LED1, !digitalRead(LED1)); //mit der Taste 1 wird die LED1 an- und ausgeschalten
if (digitalRead(LED1) == HIGH)
{
currentMillis = millis();
}
}
My_Receiver.resume();
}
if (millis() - currentMillis > PAUSE)
{
digitalWrite(LED1, LOW);
}
}
Das sollte aber trotzdem die nächsten 23 Tage klappen, oder?
Danach wird currentmillis als negative Zahl interpretiert und auf millis() aufaddiert (negative Zahl abziehen).
Wie soll das gehen? In jedem LOOP Durchgang stellst du "currentMillis" wieder auf den aktuellen "millis()" Wert. Zwei Zeilen später schaust du in der if Zeile ob zwischen millis() und currentMillis schon 5000 millis Abstand ist. Der Abstand ist selbstverständlich immer "0". Du darfst nicht in jedem LOOP Durchgang "currentMillis = millis();" machen. Wie sollen sich da die Werte zueinander verändern?
Ich habe da gerade was übersehen. Er führt ja "currentMillis = millis();" nur aus, wenn die Taste gedrückt wurde. Und dann laufen die 5000 millis ab. Da war ich etwas voreilig
Deshalb heißt Das bei mir auch lastmillis ... oder ähnlich ...
Ändert aber Nichts daran, daß Das eigentlich bis zum Setzen des MSB klappen sollte, oder?
@Tommy56
unsigned long currentmillis; war es leider nicht
Ich befürchte fast, dass die LIB's des Digiparks da reinfuschen.
Ein Aufbau und Ablauf mit Arduino funktioniert tadellos....
Ablauf:
FB-taste drücken und LED geht an
LED geht nach 5 Sekunden von allein aus
Bei leuchtender LED:FB-Taste innerhalb von 5 Sek. drücken und LED geht aus
//hier Arduino
#include <IRremote.h>
const long PAUSE = 5000; //Konstante für die Pause, hier 5 sek.
#define IR_RX_PIN 9 //Infrarotsensor
#define LED1 10
#define BUTTON1 1086271695 //den bereits ausgelsenen FB-Code von Taste 1
unsigned long currentMillis = millis();
IRrecv My_Receiver(IR_RX_PIN);
decode_results My_Decoder;
void setup()
{
Serial.begin(9600);
My_Receiver.enableIRIn(); // Start IR-Empfänger
pinMode(LED1, OUTPUT);
digitalWrite(LED1, LOW); //LED1 definitiv aus
}
void loop() {
if (My_Receiver.decode(&My_Decoder)) {
if (My_Decoder.value == BUTTON1)
{
digitalWrite(LED1, !digitalRead(LED1)); //mit der Taste 1 wird die LED1 an- und ausgeschalten
if (digitalRead(LED1) == HIGH)
{
currentMillis = millis();
}
}
My_Receiver.resume();
}
if (millis() - currentMillis > PAUSE)
{
digitalWrite(LED1, LOW);
}
}
Nun habe ich mal das "Problem" hoffentlich eingegrenzt....
Mit dem nachfolgenden Sketch sollte die LED einfach nur im 5-Sekunden-Abstand blinken
Das macht sie aber nur, wenn wenn die Zeile im Setup:
My_Receiver.enableIRIn();
raus ist; Ansonsten blinkt die LED wie "wild". Das Hochsetzen der PAUSE auf 50000 bewirkt, dass die LED dann ca. 8 Sekunden an bzw. aus ist.
//diese sind für den Digispark konzipiert
#include <IRLib.h>
#include <IRLibMatch.h>
#include <IRLibTimer.h>
const long PAUSE = 5000; //Konstante für die Pause, hier 5 sek.
#define IR_RX_PIN 0 //Infrarotsensor an P0
#define LED1 1 //LED 1 an P1
#define BUTTON1 1086271695 //den bereits ausgelsenen FB-Code von Taste 1
unsigned long currentMillis = millis();
IRrecv My_Receiver(IR_RX_PIN);
IRdecode My_Decoder;
void setup()
{
My_Receiver.enableIRIn(); // DAS HIER IST DER UEBELTAETER :) die LED blinkt wie ein Stroboskop
//My_Receiver.enableIRIn(); // DAS HIER IST DER UEBELTAETER :) so blinkt die LED wie gewünscht
pinMode(LED1, OUTPUT);
digitalWrite(LED1, LOW); //LED1 definitiv aus
}
void loop()
{
digitalWrite(LED1, HIGH);
delay(PAUSE);
digitalWrite(LED1, LOW);
delay(PAUSE);
}
IR Bibliothek
Ich such mir einen Wolf und kann die Datei nirgends finden
C:\Program Files (x86)\Arduino\libraries
C:\Users\MeinPC\Documents\Arduino\libraries
Wie muss denn die heißen?
Ich habe gesucht nach:
DigisparkIRLib (so wie der Name beim Bibliothekeinbinden)
IRLib.h
IRLibMatch.h
IRLibTimer.h
@serenifly
Leider finde ich keine Datei mit dem Namen "IRLibTimer.h".
Oder muss ich die von irgendwo neu importieren?
Ich steh voll auf'm Schlauch Bin grad total blind.....
Hast du es schonmal versucht deinen PC die Datei suchen zu lassen (Explorer oder mit Totalkommander Dateimanager) in Post 1 stehen doch die Dateinamen unter #include. Die müssen auf deinem Rechner vorhanden sein, sonst kommt eine Fehlermeldung im kompiler.