Пьезопищалка: подключение к ESP32 и Arduino

Зуммер (активный и пассивный)

Звук для сигнализаций, будильников и простых мелодий. Главное — понять, активный у вас зуммер или пассивный.

Как работает

Активный зуммер содержит генератор: подайте постоянное напряжение — и он пищит на своей частоте. Управление — digitalWrite(HIGH/LOW).

Пассивный — просто пьезоэлемент: ему нужен сигнал нужной частоты. На Arduino это tone(вывод, частота, длительность) и noTone(); на ESP32 tone() есть в ядре 2.x и 3.x (через ШИМ-канал LEDC). Нота «ля» первой октавы — 440 Гц, из частот нот собирают мелодии.

Отличить просто: активный пищит от батарейки, пассивный от неё только щёлкает.

Выводы

ВыводНазначение
1плюс (у полярных зуммеров помечен «+»)
2минус — к GND

Подключение к ESP32

ПьезопищалкаESP32
1GPIO25
2GND

Схема из примера «Звук: одна нота».

Звук: одна нота

Открыть пример целиком
Код скетча
const int BUZZER = 25;
const int CHANNEL = 0;

void setup() {
  ledcSetup(CHANNEL, 1000, 8);
  ledcAttachPin(BUZZER, CHANNEL);
}

void loop() {
  ledcWriteTone(CHANNEL, 440);   // ля первой октавы
  delay(400);
  ledcWriteTone(CHANNEL, 0);     // тишина
  delay(600);
}

Подключение к Arduino Uno

ПьезопищалкаArduino Uno
1D10
2GND

Схема из примера «Arduino Uno: синтезатор на клавиатуре 4×4».

Arduino Uno: синтезатор на клавиатуре 4×4

Открыть пример целиком
Код скетча
// Синтезатор на клавиатуре 4×4.
//
// Шестнадцать клавиш — шестнадцать нот, от до первой октавы до ре
// третьей. Держите клавишу — нота звучит, отпустите — тишина. Опрос
// клавиатуры сделан вручную, без библиотеки: строки по очереди
// опускаются в ноль, а столбцы читаются с подтяжкой.

const byte ROWS[4] = {2, 3, 4, 5};
const byte COLS[4] = {6, 7, 8, 9};
const int BUZZER = 10;
const char KEYS[16] = {'1', '2', '3', 'A', '4', '5', '6', 'B', '7', '8', '9', 'C', '*', '0', '#', 'D'};
const int NOTES[16] = {262, 294, 330, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880, 988, 1047, 1175};
const char *NAMES[16] = {"C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5", "D5", "E5", "F5", "G5", "A5", "B5", "C6", "D6"};

int scan() {
  for (int r = 0; r < 4; r++) {
    for (int i = 0; i < 4; i++) pinMode(ROWS[i], INPUT_PULLUP);
    pinMode(ROWS[r], OUTPUT);
    digitalWrite(ROWS[r], LOW);
    delayMicroseconds(10);
    for (int c = 0; c < 4; c++) if (digitalRead(COLS[c]) == LOW) return r * 4 + c;
  }
  return -1;
}

int playing = -1;

void setup() {
  Serial.begin(9600);
  for (byte c : COLS) pinMode(c, INPUT_PULLUP);
  Serial.println(F("Играйте на клавиатуре: 16 нот"));
}

void loop() {
  int k = scan();
  if (k != playing) {
    playing = k;
    if (k < 0) noTone(BUZZER);
    else {
      tone(BUZZER, NOTES[k]);
      Serial.print(F("клавиша "));
      Serial.print(KEYS[k]);
      Serial.print(F(": нота "));
      Serial.print(NAMES[k]);
      Serial.print(' ');
      Serial.print(NOTES[k]);
      Serial.println(F(" Гц"));
    }
  }
  delay(10);
}

В железе

Зуммер на 30 мА и больше — через транзистор: вывод контроллера рассчитан примерно на 20 мА (ESP32 выдаёт до 40 мА, но на пределе).

Частые ошибки

Другие детали