Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [hier] und treten Sie heute bei!

5.4 Intervall

Manchmal müssen Sie zwei Dinge gleichzeitig tun. Zum Beispiel möchten Sie vielleicht eine LED blinken lassen, während Sie einen Tastendruck lesen. In diesem Fall können Sie nicht delay() verwenden, weil Arduino Ihr Programm während des delay() pausiert. Wenn der Knopf gedrückt wird, während Arduino pausiert und auf das Ende von delay() wartet, wird Ihr Programm den Tastendruck verpassen.

Ein passendes Beispiel wäre, eine Pizza in Ihrer Mikrowelle aufzuwärmen und gleichzeitig auf eine wichtige E-Mail zu warten. Sie legen die Pizza in die Mikrowelle und stellen sie auf 10 Minuten ein. Das Äquivalent zur Verwendung von delay() wäre, vor der Mikrowelle zu sitzen und dem Timer zuzusehen, wie er von 10 Minuten auf Null herunterzählt. Wenn die wichtige E-Mail in dieser Zeit ankommt, werden Sie sie verpassen.

Was Sie im wirklichen Leben tun würden, wäre, die Pizza einzuschalten und dann Ihre E-Mails zu überprüfen und vielleicht etwas anderes zu tun (was nicht allzu lange dauert!) und ab und zu würden Sie zur Mikrowelle zurückkehren, um zu sehen, ob der Timer Null erreicht hat und somit Ihre Pizza fertig ist.

Diese Skizze zeigt, wie man einen Buzzer ohne die Verwendung von delay() tönen kann. Sie schaltet den Buzzer ein und notiert dann die Zeit. Danach überprüft sie bei jedem Durchlauf von loop(), ob das gewünschte Intervall abgelaufen ist. Ist dies der Fall, wird der Buzzer getönt und die neue Zeit notiert. Auf diese Weise tönt der Buzzer kontinuierlich, während die Sketch-Ausführung nie bei einer einzigen Anweisung ins Stocken gerät.

Basierend auf dieser Bedingung können wir den Code des Knopfes hinzufügen, um die LED zu steuern, sie wird nicht durch den Buzzer, der Musik spielt, gestört.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist definitiv praktisch, ein ganzes Set zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

Sie können sie auch einzeln über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

Arduino Uno R4 Minima

-

Breadboard

KAUFEN

Jumper-Kabel

KAUFEN

Widerstand

KAUFEN

LED

KAUFEN

Knopf

KAUFEN

Summer

KAUFEN

Schaltplan

../_images/circuit_8.5_interval.png

Verdrahtung

../_images/5.4_interval_bb.png

Bemerkung

  • Öffnen Sie die Datei 5.4.interval.ino im Verzeichnis 3in1-kit\learning_project\5.4.interval.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

Nach erfolgreichem Hochladen des Codes wird der Summer Musik spielen; immer wenn Sie den Knopf drücken, leuchtet die LED auf. Die Arbeit von LED und Summer beeinflusst sich nicht gegenseitig.

Wie funktioniert das?

Initialisieren Sie eine Variable namens previousMillis, um die vorherige Betriebszeit des Mikrocontrollers zu speichern.

unsigned long previousMillis = 0;

Markieren Sie, welche Note gespielt wird.

int thisNote=0;

Die Intervallzeit jeder Note.

long interval = 1000;

In loop() deklarieren Sie currentMillis, um die aktuelle Zeit zu speichern.

unsigned long currentMillis = millis();

Wenn das Intervall zwischen der aktuellen Betriebszeit und der letzten Aktualisierungszeit größer als 1000ms ist, werden bestimmte Funktionen ausgelöst. Gleichzeitig wird previousMillis auf die aktuelle Zeit aktualisiert, um das nächste Auslösen, das 1 Sekunde später stattfinden soll, vorzubereiten.

if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;// save the last time of the last tone
    //...
}

Spielen Sie die Noten in der Melodie nacheinander ab.

tone(buzzerPin,melody[thisNote],100);
interval=1000/noteDurations[thisNote]; // interval at which to tone
thisNote=(thisNote+1)%(sizeof(melody)/2); //iterate over the notes of the melody

Der Knopf steuert die LED.

// play button & led
digitalWrite(ledPin,digitalRead(buttonPin));