Super Teil, auch wenn ich aktuell noch keine direkte Anwendung dafür habe, mir fällt bestimmt bald was ein.
Das einfache "blinken" wird dadurch noch einfacher.
Und es funktioniert (4fach Blinken) bei mir sehr gut, gleich getestet.
Vielleicht kannste noch den Blinker einbauen der damals mit deiner Hilfe entstanden ist.
#ifndef LedFolgeBlinker_H
#define LedFolgeBlinker_H
#include <Arduino.h>
class LedFolgeBlinker
{
private:
unsigned long lastTimeLED;
unsigned int on_time;
unsigned int off_time;
unsigned int PulseAnzahl; // Pulse Anzahl
unsigned int PulsePause; // Pause zwischen Pulse Sequence [ms]
byte pinLED;
boolean state_LED;
unsigned int Counter_Pulse; // Zähler der durchgelaufenden Pulse
boolean state_Pause; // Zustandspeicher ob Pause zwischen der Pulsefolgen oder nicht
unsigned long lastTimePause;
public:
LedFolgeBlinker(byte pin, unsigned int on, unsigned int off, unsigned int Anzahl, unsigned int Pause);
void update();
};
#endif
#include <LedFolgeBlinker.h>
LedFolgeBlinker::LedFolgeBlinker(byte pin, unsigned int on, unsigned int off, unsigned int Anzahl, unsigned int Pause)
{
pinMode(pin, OUTPUT);
state_LED = false;
digitalWrite(pin, state_LED);
Counter_Pulse = 0; // Zähler der durchgelaufenden Pulse
state_Pause= false; // Zustandspeicher ob Pause aktiv oder nicht
lastTimeLED = millis();
lastTimePause = millis();
pinLED = pin;
on_time = on;
off_time = off;
PulseAnzahl = Anzahl; // Pulse Anzahl
PulsePause = Pause; // Pause zwischen Pulse Sequence [ms]
}
void LedFolgeBlinker::update()
{
if (state_LED == LOW && millis() - lastTimeLED > off_time && state_Pause == false ) {
digitalWrite(pinLED, HIGH); // LED einschalten für x ms
lastTimeLED = millis();
state_LED = HIGH;
}
if (state_LED == HIGH && millis() - lastTimeLED > on_time ) {
digitalWrite(pinLED, LOW); // LED ausschalten für x ms
lastTimeLED = millis();
state_LED = LOW;
Counter_Pulse++; // ein Pulsetakt fertig, Zähler erhöhen
}
if (Counter_Pulse >= PulseAnzahl) {
state_Pause = true; // Pause aktivieren
Counter_Pulse = 0; // Zähler zurücksetzen
lastTimePause = millis();
}
if (state_Pause == true && millis() - lastTimePause > PulsePause) {
state_Pause = false;
}
}
Sehr hübsch, schöne Macro-Programmierung.
Geschickt, wie du beliebig viele unabhängige static lastHit Variable auf eine globale bool DoINTERVAL umsetzt, und das Makro sich syntaktisch wie ein if(DoINTERVAL) verhält, so dass danach alles von
;
bis { /* ... */ } zulässig ist.
C++ oder gar templates werden deutlich überbewertet.
Aber eine class Interval wäre natürlich immer eine Alternative, wenn man Erweiterbarkeit auf sowas wie eine class LedFolgeBlinker im Sinne hätte
Einen erheblichen Teil der Blumen muss ich an https://www.mikrocontroller.net weiter geben. Denn da habe ich ein Macro dieser Art entdeckt. Nach dem das erst mal verstanden war, war die Umsetzung auf unser "BlinkWithoutDelay" Umfeld kein ganz großes Problem.
Vielleicht solltest du in die Beispiele noch das mit aufnehmen, wo man unterschiedliche Hell-/Dunkelfasen hat. Das bereitet Anfängern auch gerne Probleme, wenn die von delay auf nicht blockierend umsteigen
ElEspanol:
Vielleicht solltest du in die Beispiele noch das mit aufnehmen, wo man unterschiedliche Hell-/Dunkelfasen hat. Das bereitet Anfängern auch gerne Probleme, wenn die von delay auf nicht blockierend umsteigen