Code:
#include <TimerOne.h>
const byte BUZZER_PIN = 5; // den aktiven Buzzer mit Plus an den Pin D5 vom Arduino Nano und Minus an GND
// Struktur fuer den Buzzer
struct tBuzzer {
bool state = 0; // Status des Buzzers (1 = ein, 0 = aus)
uint8_t tones = 0; // Anzahl der abzuspielenden Toene
uint16_t times[2] = {0, 0}; // Array mit [0] = Pausenzeit, [1] = Pulszeit
uint32_t ticks = 0; // zum merken der Millisekunden
};
volatile struct tBuzzer buzzer; // Buzzer-Struktur als volatile, weil sie in einer Interrupt-Funktion verwendet wird
// Interrupt-Routine zum reagieren auf die Anzahl und die Puls-/Pausenzeit des Buzzers
void BeepISR() {
// wenn noch Toene abgespielt werden muessen und die Puls- bzw. Pausenzeit abgelaufen ist, dann...
if (buzzer.tones && (millis() - buzzer.ticks > buzzer.times[buzzer.state])) {
buzzer.state ^= 1; // den Status mit "XOR 1" invertieren
if (!buzzer.state) buzzer.tones--; // wenn Status = 0, dann die Anzahl um eins verringern
digitalWrite(BUZZER_PIN, buzzer.state); // den Buzzer ein-/ausschalten (je nach Status)
buzzer.ticks = millis(); // die Millisekunden merken
}
}
// Funktion, um die Ausgabe der Toene zu starten
// Parameter: Anzahl der Toene 0...255, Pulsdauer in ms 0...65535 [, Pausendauer in ms 0...65535]
void Beep(const uint8_t tones, const uint16_t pulse, const uint16_t pause = 0) {
uint8_t oldSREG = SREG; // Interrupt-Register merken
cli(); // Interrupts verhindern
if (!buzzer.tones) { // wenn die bisherigen Toene abgespielt wurden
buzzer.tones = tones; // die Parameter in die Struktur uebernehmen
buzzer.times[0] = pause;
buzzer.times[1] = pulse;
buzzer.ticks = millis(); // die Millisekunden merken
}
SREG = oldSREG; // Interrupt-Register wieder herstellen
}
void setup() {
digitalWrite(BUZZER_PIN, LOW); // sicherstellen, dass der Pin auf LOW liegt
pinMode(BUZZER_PIN, OUTPUT); // den Pin fuer den Buzzer als Ausgang schalten
Timer1.initialize(1000); // Timer-Interrupt (alle 1000us = 1ms) initialisieren
Timer1.attachInterrupt(BeepISR); // zum steuern der Buzzerausgabe
// Beispiele:
Beep(5, 25, 500); // fuenf Toene ausgeben (Puls: 25ms, Pause: 500ms)
delay(4000); // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)
Beep(2, 300, 150); // zwei Toene ausgeben (Puls: 300ms, Pause: 150ms)
delay(4000); // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)
Beep(1, 1000); // ein Ton ausgeben (Puls: 1000ms, Pause: 0ms, kann weggelassen werden)
delay(4000); // als Beispiel, dass der Nano gerade etwas anderes tut (die Beeps sind interruptgesteuert)
}
void loop() {
}