Digispark Timer ohne Delay

Hallo in die Runde,

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);
  }
}
unsigned long currentmillis;

Gruß Tommy

Hi

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

MfG

Mir ist das zu tief geschachtelt.
Ohne Programmablaufplan und Zustandsdiagramm verstehe ich das nicht.

Nebenbei:
Beim malen der beiden, fällt der Fehler sicherlich auf.

Menaluxi:
Warum schaltet die LED1 in dem Beispiel nicht nach 5 Sekunden ab?

...............

void loop()
{
...............

currentMillis = millis();
      }
    }
    My_Receiver.resume();
  }
  if (millis() - currentMillis > PAUSE)
................

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?

Franz

Du darfst nicht in jedem LOOP Durchgang "currentMillis = millis();"

Ich finde das schon.

Wenn man das nicht dürfen sollte, dann ist der Name falsch gewählt.
Ein Bock in der Semantik und damit wohl auch in der Logik.

stimmt. Variablennamen, die in die Irre führen, sollte man vermeiden.

Gruß Tommy

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 :confused:

Sach ich ja, Name falsch gewählt.

Hi

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?

MfG

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

Schau mal nach welchen Timer die IR Bibliothek verwendet

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

Wenn es diese Lib ist, die benutzt bei einem ATTiny den Timer 0. Ist das ein ATTiny, den Du da benutzt?

Dann muss man sich nicht wundern dass millis() nicht mehr richtig geht

Das kann man aber in IRLibTimer.h ändern:

#elif defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
// #define IR_USE_TIMER1_TINY	// tx = pin 4 (OC1B)
  #define IR_USE_TIMER0			// tx = pin 1 (OC0B)

Ja es ist ein Board mit Attiny85
wie hier: Digispark ATTiny85, for starters as well as advanced. - PCF Electronics

Wo kann/muss ich jetzt was korrekt einstellen?

Ich habe doch die Datei angegeben. Einfach die Kommentare rumdrehen so dass die andere Zeile aktiviert ist

@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 :frowning: 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.