Arduino IDE, mehre Funktionen verbinden wie mache ich das?
Hallo zusammen,
bin noch Anfänger.
Ich habe also einen Sketch mit einer Tonausgabe auf einen Buzzer.
Nun möchte ich aber auch noch eine LED dazu blinken lassen.
Wie gehe ich da vor und programmiere das?
Wenn ich die Anweisung für die Blinkfunktion nach der Anweisung für das Piepen des Summer schreibe, dann piept zwar der Summer und danach fängt die LED an zu blinken, dies wiederholt sich naturgemäß, da ja Zeile für Zeile abgearbeitet wird.
Wenn ich aber zeitgleich mit dem Piepen des Summer auch die LED blinken lassen möchte, was bzw. wie muss ich das der Arduino IDE mitteilen?
Hier mal der Piep-Sketch:
int buzzer = 7;
void setup() {}
void loop() {
tone(buzzer, 1800);
delay(55);
noTone(buzzer);
delay(55);
}
3 Antworten
Wenn Du das zeitlich auch unabhängig haben möchtest, dann musst Du Dir mit millis() oder mikros() entsprechende Timer bauen und mit if-Abfragen arbeiten...
An sonsten wie Du es im anderen Kommentar schon geschrieben hast...
Dann ist aber zu beachten, dass die Pausezeiten für Summer und LED immer die gleichen sind. Bzw du müsstest mit so vielen Delay arbeiten, dass Du den Summer immer zwischendrin an und ausschaltest, und die LED nur gelegentlich zwischendurch...
int buzzer = 7;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
tone(buzzer, 1800); //Ton ein
digitalWrite(LED_BUILTIN, HIGH); // LED ein
delay(250); // Pause
noTone(buzzer); //Ton aus
delay(250); //Pause
tone(buzzer, 1800); // Ton ein
digitalWrite(LED_BUILTIN, LOW); //LED aus
delay(250); //Pause
noTone(buzzer); //Ton aus
delay(250);
}
Jetzt würde die LED alle 500ms das Signal wechseln, der Ton aber nur 250ms ein und 250ms aus. Also entweder zwischen den Schritten die Pausen anpassen und die Befehle so setzen, dass nach ddition der ganzen Zwischenpausen erst der nächste Schritt passiert, oder eben wie erwähnt mit millis(). Dazu bietet "blink without delay" ein erster Ansatz. Der vorteil ist, dass mit selbstgebauten Timern der Arduino weiter Code ausführt und auch noch auf Tastereingänge reagiert und unabhängig von Wartezeiten auch andere Befehle weiter ausführt. Wenn man delay verwendet, stoppt der Arduino den kompletten Zyklus an der Stelle, bis das Delay abgelaufen ist. In der Zeit passiert einfach nichts mehr. Das kann bei komplexen Steuerungen ehr schnell Probleme mit sich bringen... Delay ist einfach, dafür ein Timer aber sehr flexibel... Und bitte nutze künftig "Quellcode"-Boxen (neben zittieren) um den Code zu posten. Das macht es viel einfacher für die Leser 😉 Noch ein Tipp, wenn Du Code schreibst, mach Dir Kommentare hinter die Zeilen, oder Blockkommentare um Dich in komplexen Codes später noch mal zurecht zu finden und zu beschreiben, warum bzw was dieser Code oder folgende Codeblock macht...
delay(250); //Zeilenkommentar
/*Blockkommentar
*über mehrere Zeilen
*sind auch kein Problem
*/
Moin,
mein erster Rat hier ist:
delay() ist so gut wie nie ein probates Mittel um Zeit in einem Progrmm vergehen zu lassen. Während eines delay() macht der Mikrocontroller nichts, wirklich nichts und ist auch nicht dazu zu überreden, etwas zu machen.
Google mal nach 'Blinken ohne delay'. Wenn du das Prinzip verstanden hast, dann beschäftige dich mit Interrupts und welche du am Arduino (also den ATMega328p) du zur Verfügung hast.
Dann wirst du leicht Dinge quasi 'gleichzeitig' damit hinbekommen.
Schau dann mal bei https://github.com/PheliBerlin/Schneeflocken-mit-ws2812b vorbei, ich habe mir eine Weihnachtsdeko gebaut, die nur mit einem Attiny84 angetrieben wird.
Zwischen tone und delay fügst du den Code zur Aktivierung der LED ein.
Das sollte so funktionieren. Die LED geht parallel mit dem Summer an und hört eben ca. 1 Sekunde vor dem Enden des summens auf zu leuchten (ich schätze, das ist von dir so gewollt).
Bin mir nicht ganz sicher, ob das so richtig ist?
int buzzer = 7;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
tone(buzzer, 1800);
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
delay(55);
noTone(buzzer);
delay(55);
}