Mit allgemeineren Begriffen und längerem Suchen hättest du was gefunden
Du möchtest ganz schön viel. Deshalb ist das auch ein mittellanges Programm
Einmal (fast) der ganze Code in function loop() reingeklatscht:
// Du hast alles in allem 5 Timer
// 20 Sekunden alles von vorne
// 10 Sekunden LED blinken
// 5 Sekunden Sirene an
// LED An / Aus 0,5 Sekunden
// Sirene An / Aus 1,0 Sekunden
const byte LED_pin = 4;
const byte Buzzer_pin = 5;
// 20 Sekunden-Timer
unsigned long Timer20Sec = 0;
unsigned long MainInterval = 20000;
// 10 Sekunden Timer = wie lange die LED blinken soll
unsigned long Led_BlinkTimer = 0;
unsigned long LedBlinkInterval = 10000;
// 0,5 Sekunden Timer für LED an/aus
unsigned long Led_OnOffTimer = 0;
unsigned long Led_OnOffInterval = 500;
// 5 Sekunden-Timer wie lange die Sirene eingeschaltet sein soll
unsigned long Buzzer_Timer = 0;
unsigned long BuzzerOnInterval = 5000;
// 1 Sekunden Timer Sirene An/Aus
unsigned long Buzzer_OnOffTimer = 0;
unsigned long Buzzer_OnOffInterval = 1000;
boolean buzzerOn = false; // "Schalter" Blinken an/aus
boolean blink_LED = false; // "Schalter" Sirene an/aus
void setup() {
Serial.begin(115200);
Serial.println("Setup-Start");
digitalWrite(LED_pin, LOW);
digitalWrite(Buzzer_pin, LOW);
pinMode(LED_pin, OUTPUT);
pinMode(Buzzer_pin, OUTPUT);
Timer20Sec = millis();
}
void loop() { // loop macht unendlich loopings
// loop START START START START START START START
// prüfe ob ein 20-Sekunden-Intervall vorbei ist
if ( TimePeriodIsOver(Timer20Sec, MainInterval) ) {
// wenn WIRKLICH 20 Sekunden vorbei sind
Led_BlinkTimer = millis(); // Timer auf aktuelle Zeit setzen
Buzzer_Timer = millis();
blink_LED = true; // LED blinken einschalten
buzzerOn = true; // Sirene einschalten
}
// prüfe ob LED blinken eingeschaltet ist
if (blink_LED == true) {
// prüfe ob 0,5 Sekunden vorbei sind
if ( TimePeriodIsOver(Led_OnOffTimer, Led_OnOffInterval) ) {
// wenn WIRKLICH 0,5 Sekunden vorbei sind
// invertiere den Schaltzustand des LED_pins
digitalWrite(LED_pin, !digitalRead(LED_pin) ) ;
}
}
// prüfe ob LED-Blinkzeit vorbei ist
if ( TimePeriodIsOver(Led_BlinkTimer, LedBlinkInterval) ) {
// wenn WIRKLICH LED-Blinkzeit vorbei ist
blink_LED = false; // blinken ausschalten
digitalWrite(LED_pin,LOW); // LED ausschalten
}
// prüfe ob Sirene eingeschaltet ist
if (buzzerOn == true) {
// prüfe ob Sirenen ein/aus-Intervall vorbei ist
if ( TimePeriodIsOver(Buzzer_OnOffTimer, Buzzer_OnOffInterval) ) {
// wenn WIRKLICH Sirenen ein/aus-Intervall vorbei ist
// invertieren den Schaltzustand von Buzzer_pin
digitalWrite(Buzzer_pin, !digitalRead(Buzzer_pin) ) ;
}
}
// prüfe ob Sirenen-Einschaltzeit vorbei ist
if ( TimePeriodIsOver(Buzzer_Timer, BuzzerOnInterval) ) {
// wenn WIRKLCIH Sireneneinschaltzeit vorbei ist
buzzerOn = false; // Sirene aus ausschalten
digitalWrite(Buzzer_pin,LOW); // Sirenen-IO-pin ausschalten
}
// springe hoch zu loop START START START START START START START
}
// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
unsigned long currentMillis = millis();
if ( currentMillis - startOfPeriod >= TimePeriod ) {
// more time than TimePeriod has elapsed since last time if-condition was true
startOfPeriod = currentMillis; // a new period starts right here so set new starttime
return true;
}
else return false; // actual TimePeriod is NOT yet over
}
.
.
einmal in sinnvolle Teilabschnitte unterteilt strukturiert in functions
// Du hast alles in allem 5 Timer
// 20 Sekunden alles von vorne
// 10 Sekunden LED blinken
// 5 Sekunden Sirene an
// LED An / Aus 0,5 Sekunden
// Sirene An / Aus 1,0 Sekunden
const byte LED_pin = 4;
const byte Buzzer_pin = 5;
// 20 Sekunden-Timer
unsigned long Timer20Sec = 0;
unsigned long MainInterval = 20000;
// 10 Sekunden Timer = wie lange die LED blinken soll
unsigned long Led_BlinkTimer = 0;
unsigned long LedBlinkInterval = 10000;
// 0,5 Sekunden Timer für LED an/aus
unsigned long Led_OnOffTimer = 0;
unsigned long Led_OnOffInterval = 500;
// 5 Sekunden-Timer wie lange die Sirene eingeschaltet sein soll
unsigned long Buzzer_Timer = 0;
unsigned long BuzzerOnInterval = 5000;
// 1 Sekunden Timer Sirene An/Aus
unsigned long Buzzer_OnOffTimer = 0;
unsigned long Buzzer_OnOffInterval = 1000;
boolean buzzerOn = false; // "Schalter" Blinken an/aus
boolean blink_LED = false; // "Schalter" Sirene an/aus
void setup() {
Serial.begin(115200);
Serial.println("Setup-Start");
digitalWrite(LED_pin, LOW);
digitalWrite(Buzzer_pin, LOW);
pinMode(LED_pin, OUTPUT);
pinMode(Buzzer_pin, OUTPUT);
Timer20Sec = millis();
}
void loop() { // loop macht unendlich loopings
// loop START START START START START START START
// prüfe ob ein 20-Sekunden-Intervall vorbei ist
if ( TimePeriodIsOver(Timer20Sec, MainInterval) ) {
// wenn WIRKLICH 20 Sekunden vorbei sind
Led_BlinkTimer = millis(); // Timer auf aktuelle Zeit setzen
Buzzer_Timer = millis();
blink_LED = true; // LED blinken einschalten
buzzerOn = true; // Sirene einschalten
}
LED_Blinken_Managen();
Sirene_Managen();
// springe hoch zu loop START START START START START START START
}
void LED_Blinken_Managen() {
// prüfe ob LED blinken eingeschaltet ist
if (blink_LED == true) {
Blinke_die_LED();
}
// prüfe ob LED-Blinkzeit vorbei ist
if ( TimePeriodIsOver(Led_BlinkTimer, LedBlinkInterval) ) {
// wenn WIRKLICH LED-Blinkzeit vorbei ist
blink_LED = false; // blinken ausschalten
digitalWrite(LED_pin, LOW); // LED ausschalten
}
}
void Blinke_die_LED() {
// prüfe ob 0,5 Sekunden vorbei sind
if ( TimePeriodIsOver(Led_OnOffTimer, Led_OnOffInterval) ) {
// wenn WIRKLICH 0,5 Sekunden vorbei sind
// invertiere den Schaltzustand des LED_pins
digitalWrite(LED_pin, !digitalRead(LED_pin) ) ;
}
}
void Sirene_Managen() {
// prüfe ob Sirene eingeschaltet ist
if (buzzerOn == true) {
SireneAnAus();
}
// prüfe ob Sirenen-Einschaltzeit vorbei ist
if ( TimePeriodIsOver(Buzzer_Timer, BuzzerOnInterval) ) {
// wenn WIRKLCIH Sireneneinschaltzeit vorbei ist
buzzerOn = false; // Sirene aus ausschalten
digitalWrite(Buzzer_pin, LOW); // Sirenen-IO-pin ausschalten
}
}
void SireneAnAus() {
// prüfe ob Sirenen ein/aus-Intervall vorbei ist
if ( TimePeriodIsOver(Buzzer_OnOffTimer, Buzzer_OnOffInterval) ) {
// wenn WIRKLICH Sirenen ein/aus-Intervall vorbei ist
// invertiere den Schaltzustand von Buzzer_pin
digitalWrite(Buzzer_pin, !digitalRead(Buzzer_pin) ) ;
}
}
// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long & startOfPeriod, unsigned long TimePeriod) {
unsigned long currentMillis = millis();
if ( currentMillis - startOfPeriod >= TimePeriod ) {
// more time than TimePeriod has elapsed since last time if-condition was true
startOfPeriod = currentMillis; // a new period starts right here so set new starttime
return true;
}
else return false; // actual TimePeriod is NOT yet over
}
vgs