Arduino IDE, mehre Funktionen verbinden wie mache ich das?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:eigene Erfahrung

Zwischen tone und delay fügst du den Code zur Aktivierung der LED ein.

ThomasM1982X 
Fragesteller
 31.03.2022, 02:12

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);

}

0
HubertGibtHilfe  31.03.2022, 03:27
@ThomasM1982X

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).

1