Hallo, ich habe ein Lauflicht Programmiert:
int pinArray[] = {2, 3, 4, 5, 6, 7, 8, 9};
int count = 0;
int timer = 30;
void setup() {
for (count=0;count<8;count++){
pinMode(pinArray[count], OUTPUT);
}
}
void loop() {
for (count=0;count<7;count++) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count + 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
for (count=7;count>0;count--) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count - 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
}
Jetzt ist meine Frage, was ich programmieren muss um dieses Lauflicht mit einem Taster ein und Ausschalten kann.
Danke im Vorraus
Wo ist dein Problem ?
Du fragst einfach den Zustand des Tasters in der Loop ab und wertest den aus.
Warum das mit einer if-Abfrage nicht gehen sollte, kann ich nicht sehen.
Du möchtest eine Ablaufsteuerung bauen.
Einen endlichen Automaten.
Und darum solltest du auf delay() und lang laufende Schleifen verzichten.
Das if sollte dir dabei nicht im Wege stehen, sondern ein Mittel der Wahl sein.
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,
Multitasking Macros
Intervall Macro
noiasca:
schönen Sonntag rundherum
Ist das nicht ein bissel derb ?
Ist das nicht ein bissel derb ?
evtl....
Auf meiner morgendlichen Kaffeetasse steht das übrigens auch drauf.
noiasca:
nein. Ich finde es ist wirksam. Zumindest gibts jetzt einen Code.
Sicher ?
Das ändert aber nichts an unseren Antworten.
agmue
May 13, 2019, 9:15am
8
dr_holzknecht:
Jetzt ist meine Frage, was ich programmieren muss um dieses Lauflicht mit einem Taster ein und Ausschalten kann.
combie:
Du möchtest eine Ablaufsteuerung bauen.
Einen endlichen Automaten.
Und darum solltest du auf delay() und lang laufende Schleifen verzichten.
Der passende Code mit einem verschwenderischen Automaten für einen UNO:
const byte taster = A0;
const byte pinArray[] = {2, 3, 4, 5, 6, 7, 8, 9};
const byte ANZAHLLEDS = sizeof(pinArray) / sizeof(pinArray[0]);
uint32_t jetzt, vorhin, entprellMillis;
const uint32_t entprellIntervall = 30, intervall = 30;
bool aktTasterZustand, altTasterZustand;
byte count, diff, schritt;
void setup() {
pinMode(taster, INPUT_PULLUP);
for (count = 0; count < ANZAHLLEDS; count++) {
pinMode(pinArray[count], OUTPUT);
}
aktTasterZustand = digitalRead(taster);
altTasterZustand = aktTasterZustand;
}
void loop() {
jetzt = millis();
altTasterZustand = aktTasterZustand;
if (jetzt - entprellMillis >= entprellIntervall) {
aktTasterZustand = digitalRead(taster);
if (altTasterZustand != aktTasterZustand) {
entprellMillis = jetzt;
if (!aktTasterZustand) {
schritt++;
}
}
}
switch (schritt) {
case 0:
count = 3;
diff = 1;
schritt++;
break;
case 1:
if (jetzt - vorhin >= intervall) {
vorhin = jetzt;
digitalWrite(pinArray[count], LOW);
if (count == 0 || count == ANZAHLLEDS - 1) {
diff *= -1;
}
count += diff;
digitalWrite(pinArray[count], HIGH);
}
break;
case 2:
for (count = 0; count < ANZAHLLEDS; count++) {
digitalWrite(pinArray[count], LOW);
}
schritt++;
break;
case 3:
// Warten auf den nächsten Tastendruck
break;
case 4:
schritt = 0;
break;
}
}
Wenn Du nach "knight rider" suchst, stößt Du nicht nur auf die gleichnamige US Serie mit K.I.T.T., sondern auch auf entsprechende Animationen.