Piezo Buzzer am ESP32 – „tone was not declared in this scope“

Wenn du an einem ESP32 in der Arduino IDE einen Piezo Buzzer programmieren möchtest und du dieses genauso programmierst wie an einem „normalen“ Mikrocontroller der Arduino Familie, dann wirst du auf den Fehler „‚tone‘ was not declared in this scope“ stoßen.

ESP32 - Arduino IDE, Fehlermeldung bei tone / noTone
ESP32 – Arduino IDE, Fehlermeldung bei tone / noTone

Dieser Fehler liegt daran, dass der ESP32 diese Funktion nicht unterstützt. ABER das heißt nicht, dass du keinen Piezo Buzzer betreiben kannst, sondern du musst lediglich auf eine andere Funktion zurückgreifen.

sketch_nov12a:16:24: error: 'tone' was not declared in this scope
   tone(buzzer, 800, 250);
                        ^
exit status 1
'tone' was not declared in this scope

Die nachfolgende Lösung habe ich von der Seite https://lifesaver.codes/answer/tone-was-not-declared-in-this-scope-1720 entnommen und möchte ich gerne zuvor als Quelle verlinken.

Die Lösung für den ESP32 ist recht einfach, jedoch bedarf es ein paar mehr Zeilen Code.
Zunächst musst du den mit der Funktion „ledcSetup“ einen Pin für ein PWM Signal definieren

ledcSetup(channel, frequenz, resolution_bits);

Danach muss ein Pin mit dem erzeugten Channel „verbunden“ werden:

  ledcAttachPin(buzzerPin,channel);

Und dann können wir auf dem Channel eine Frequenz ausgeben:

  ledcWriteTone(channel,toneFrequenz);

Alternativ können wir sogar Konstanten für Noten verwenden:

ledcWriteNote(channel, note, octave)

Mögliche Werte für den Parameter „note“ können aus der Datei arduino-esp32/cores/esp32/esp32-hal-ledc.h entnommen werden.

typedef enum {
    NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_E, 
    NOTE_F, NOTE_Fs, NOTE_G, NOTE_Gs, NOTE_A, 
    NOTE_Bb, NOTE_B, NOTE_MAX
} note_t;

In meinem Beispiel verwende ich:

  int buzzerPin = 25;
  int channel = 0;
  int frequenz = 2000;
  int resolutionBits = 12;
  int toneFrequenz = 600;

  ledcSetup(channel, frequenz, resolutionBits);
  ledcAttachPin(buzzerPin,channel);
  ledcWriteTone(channel,toneFrequenz);

Wenn man das ganze nun mit zwei LEDs und etwas Code ausschmückt, hat man eine kleine Sirene und den Fehler gelöst.

Quellcode

#define ledRot 32
#define ledGruen 33

#define buzzer 25

const int PAUSE = 1500;

const int channel = 0;
const int frequenz = 2000;
const int resolutionBits = 12;
const int toneFrequenz1 = 600;
const int toneFrequenz2 = 800;

void setup() {
  pinMode(ledRot, OUTPUT);
  pinMode(ledGruen, OUTPUT);
  pinMode(buzzer, OUTPUT);

  ledcSetup(channel, frequenz, resolutionBits);
  ledcAttachPin(buzzer, channel);
}

void loop() {
  digitalWrite(ledRot, HIGH);
  digitalWrite(ledGruen, LOW);
  ledcWriteTone(channel, toneFrequenz1);
  delay(PAUSE);
  digitalWrite(ledRot, LOW);
  digitalWrite(ledGruen, HIGH);
  ledcWriteTone(channel, toneFrequenz2);
  delay(PAUSE);
}

Auf der Seite LED Control (LEDC) von Espressif findest du weitere Informationen zu den zuvor genannten Funktionen.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.