Wie schaffe ich es, dass ich eine LED durch Knopfdruck blinken lassen kann und durch den Knopf die LED dann wieder ausschalten kann?
Hi, ich will mit einer LED ein Auge nachstellen. Um genauer zu werden, man soll per Knopfdruck die LED anschalten, diese soll dann 5 Sekunden an sein, dann für 1 Sekunde aus und dann wieder für 5 Sekunden an, und so weiter... Wenn man dann aber den Taster wieder betätigt, soll die LED ausgehen und die LED soll dann einfach aus bleiben.
Ich habe bereits ein Sketch geschrieben, in dem die LED blinkt und wenn man den Knopf drückt, die LED wieder ausgeht. Soweit so gut, aber ich hab leider keine Ahnung, wie ich es hinbekomme, dass die LED nicht einfach nur blinkt, sondern halt für 5s blinkt, dann für 1s und so weiter, und nicht einfach nur in einem Intervall von 1 Sekunde... Habt ihr eine Idee, was ich im Sketch falsch gemacht habe, oder eine IDee wie man das Problem lösen kann?
Sketch:
int ledState = LOW;
uint8_t TasterValue = 0;
uint8_t BlinkValue = 0;
uint8_t status = 0;
unsigned long previousMillis = 0;
const byte TasterPin = 12;
const long interval = 1000; // Blinkintervall in Millisekunden
void setup() {
pinMode(13, OUTPUT);
pinMode (TasterPin, INPUT_PULLUP);
}
void loop() {
unsigned long currentMillis = millis();
if (BlinkValue == HIGH) {
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(13, ledState);
}
}
else
digitalWrite(13, LOW);
TasterValue = digitalRead (TasterPin);
if (status != TasterValue) {
if (TasterValue) {
BlinkValue = !BlinkValue;
}
status = TasterValue;
delay (200);
}
}
Ich hoffe das dies einigermaßen übersichtlich ist und nur nochmal zum Verständnis. Mit diesem Sketch kann ich per Knopfdruck die LED aktivieren und diese blinkt dann im Intervall von 1s. Ich will aber das Gleiche, nur dass die LED nicht einfach nur im Intervall von 1s blinkt sondern dass die LED 5s an ist, dann 1s aus und dann wieder 5s an..., aber man soll das ganze per Knopfdruck komplett wieder ausschalten können.
~ArduinoGeek
1 Antwort
uint32_t previousMillis = 0;
const uint8_t tasterPin = 12;
const uint32_t intervalOff = 1000;
const uint32_t intervalOn = 5000;
bool blinkActive = false; //in diser Variable wird gescpeicher, ob die LED überhaupt blinken soll
bool ledState = 0;
bool tasterStateOld = HIGH;
bool tasterState = HIGH;
void setup() {
pinMode(13, OUTPUT);
pinMode (tasterPin, INPUT_PULLUP);
}
void loop() {
unsigned long currentMillis = millis();
if ((blinkActive == true) && (ledState == HIGH)) { //überprüfen, ob die LED überhaupt blinken soll und ob die LED gerade an ist
if (millis() - previousMillis >= intervalOn) { //Die Variable currentMillis hab ich gelöscht und durch die Funktion direkt ersetzt, spart dir ein bisschen Variablen-Speicher
previousMillis = millis();
ledState = LOW; //Die LED wird außgeschalten, wenn sie intervalOff an war
digitalWrite(13, ledState);
}
} else if ((blinkActive == true) && (ledState == LOW)) {//überprüfen, ob die LED überhaupt blinken soll und ob die LED gerade aus ist
if (millis() - previousMillis >= intervalOff) {
previousMillis = millis();
ledState = HIGH; //Die LED wird angeschalten, wenn sie intervalOn aus war
digitalWrite(13, ledState);
}
}
tasterState = digitalRead(tasterPin);
if (tasterState != tasterStateOld) {
if (tasterState) {
blinkActive = !blinkActive;
if (blinkActive == false) {
ledState = LOW;
digitalWrite(13, ledState);
}
}
tasterStateOld = tasterState;
delay(200); //Kann gegegebenfalls durch millis ersetzt werden
}
}
Ich glaub so sollte das funktionieren, also zumindest tut das bei mir so. Wenn Sachen unklar sind, kannst du gerne kommentieren oder du schickst mir eine Freundschaftsanfrage. Ich hoffe, dass ich dir weiterhelfen konnte und würde mich freuen wenn du meine Antwort dementsprechend markierst.
Ich hab außerdem etwas die Variablen verändert, vielleicht schaust du dir das mal an und lernst, wann du was benutzt: https://cdn-learn.adafruit.com/assets/assets/000/031/818/medium800/learn_arduino_DataTypes.jpg?1460932589
Außerdem: Variablen werden im sog. lower camel case geschrieben.
Danke ich probier es gleich Mal aus, ich schreib dir dann ob's geklappt hat :-).
Es hat super funktioniert, DANKESCHÖN!!!