ESP, IoT Бизер постоянно пищит при подключении к I/O

Darlanar

✩✩✩✩✩✩✩
28 Апр 2024
3
0
у меня есть ESP32, есть бизер, есть читалка RFID-RC522
проект устройства учёта рабочего времени
изображение_2024-04-28_121506341.png

Характеристики излучателя звука:
  • Напряжение питания: 1.5 В - 9 В
  • Диапазон воспроизводимых частот: 500 .. 5000 Гц
  • Размер модуля: 30 мм x 13 мм
ESP отдаёт 3.3 вольта, все проводочки подключены
но при подключении к D4, даже если мультиметр показывает на нём околонулевое напряжение, он издаёт постоянный писк, полностью игнорируя напряжение на I/O пине
Как это починить?


Вот код прошивки:

C++:
#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>

#define SDA_PIN     21    // Пин для SDA
#define RST_PIN     22    // Пин для сброса
#define BUZZER_PIN  4     // Пин для подключения пьезоизлучателя

MFRC522 mfrc522(SDA_PIN, RST_PIN);  // Создаем объект MFRC522

const char* ssid = "";     // Название вашей Wi-Fi сети
const char* password = ""; // Пароль от вашей Wi-Fi сети
const char* server = "192.168.1.200"; // Адрес сервера

bool isFirstSuccess = true; // Флаг для отслеживания первого успешного запроса

// Мелодия в виде последовательности частот
int melody[] = { 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000 };
// Длительность каждой ноты в миллисекундах
int noteDuration = 500; // 500 мс между каждой нотой

void setup() {
  Serial.begin(115200);
  SPI.begin();      // Инициализация SPI
  mfrc522.PCD_Init();   // Инициализация MFRC522
  Serial.println("RFID-RC522 initialized.");
 
  pinMode(BUZZER_PIN, OUTPUT); // Устанавливаем пин пьезоизлучателя на вывод
 
  // Подключаемся к Wi-Fi сети
  Serial.println("Connecting to WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting...");
  }
  Serial.println("Connected to WiFi");
}

void loop() {
  // Проверяем наличие новой метки
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    // Считываем UID метки
    String uid = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      uid += String(mfrc522.uid.uidByte[i], HEX);
    }
    Serial.println("UID tag: " + uid);

    // Отправляем GET-запрос на сервер
    if (sendGetRequest(uid)) {
      Serial.println("GET request sent successfully");
      // Воспроизводим мелодию при первом успешном запросе
      if (isFirstSuccess) {
        playMelody();
        isFirstSuccess = false; // Устанавливаем флаг в false
      }
    } else {
      Serial.println("Failed to send GET request");
    }

    // Пауза между считываниями
    delay(3000);
  }
}

bool sendGetRequest(String uid) {
  // Создаем объект WiFiClient для соединения с сервером
  WiFiClient client;
 
  // Пытаемся подключиться к серверу
  if (!client.connect(server, 80)) {
    return false;
  }

  // Формируем GET-запрос
  String url = "/handler.php?key=" + uid;
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + server + "\r\n" +
               "Connection: close\r\n\r\n");

  // Ждем ответа от сервера
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      Serial.print(c);
    }
  }

  // Закрываем соединение с сервером
  client.stop();
  return true;
}

void playMelody() {
  // Воспроизведение мелодии
  for (int i = 0; i < sizeof(melody) / sizeof(melody[0]); i++) {
    tone(BUZZER_PIN, melody[i]);
    delay(noteDuration);
    noTone(BUZZER_PIN);
    delay(50); // Пауза между нотами
  }
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
Проверить модуль. Отключить провод от I/O , подать на него сначала 5в, что будет ? 3.3 в, что будет ? gnd , что будет ?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
Т.е. пищалка должна работать от шим сигнала, а не генерит его сама. Откройте примеры--digital - toneMelody, проверьте как оно будет работать.


5в есть на почти на любой плате:
1714297361550.png
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
340
105
если подкинуть к GND то пищание
Т.е. пищалка должна работать от шим сигнала, а не генерит его сама.
Я так понял ТС, что пищалка пищит, если подать на управляющий вход постоянный уровень 0 В.
Значит она генерирует его сама? Или я что то не так понял?
 

Darlanar

✩✩✩✩✩✩✩
28 Апр 2024
3
0
@Старик Похабыч, на прошивке из примера такое же бесконечное монотоное пищание
Чутка переделал под 4 пин его только:

C++:
#include "pitches.h"

// notes in the melody:
int melody[] = {
  NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
  4, 8, 8, 4, 4, 4, 4, 4
};

void setup() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(4, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(4);
  }
}

void loop() {
  // no need to repeat the melody.
}
5в есть на почти на любой плате
Спасибо, я разобрался что у меня 5v отдаёт VIN пин при подключении по юсб.
Я ещё очень новичок, не успел разобраться что, где и как тут работает

Попробовал прошить следующий код:


C++:
#define BUZZER_PIN  4     // Пин для подключения пьезоизлучателя

void setup() {
  Serial.begin(115200);
  pinMode(BUZZER_PIN, OUTPUT); // Устанавливаем пин пьезоизлучателя на вывод
  Serial.println("Enter 'on' to turn on the buzzer and 'off' to turn it off.");
}

void loop() {
  if (Serial.available() > 0) {
    String input = Serial.readStringUntil('\n');
    input.trim(); // Удаляем лишние пробелы и символы новой строки
    if (input.equals("on")) {
      digitalWrite(BUZZER_PIN, HIGH);
      Serial.println("Buzzer turned on.");
    } else if (input.equals("off")) {
      digitalWrite(BUZZER_PIN, LOW);
      Serial.println("Buzzer turned off.");
    } else {
      Serial.println("Invalid command. Enter 'on' to turn on the buzzer and 'off' to turn it off.");
    }
  }
}
Как результат - пищалке без разницы что там - off или on. Она просто стабильно пищит.

я не очень понял что я сделал и как в итоге это заработало, но оно заработало так как должно.
Действительно, он молчит когда на питании и i/o 3.3в, и орёт когда на i/o 0

Вот рабочий код, если кому пригодится:

C++:
#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>

#define SDA_PIN     21    // Пин для SDA
#define RST_PIN     22    // Пин для сброса
#define BUZZER_PIN  4     // Пин для подключения пьезоизлучателя

MFRC522 mfrc522(SDA_PIN, RST_PIN);  // Создаем объект MFRC522

const char* ssid = "";     // Название вашей Wi-Fi сети
const char* password = ""; // Пароль от вашей Wi-Fi сети
const char* server = "192.168.1.200"; // Адрес сервера

void setup() {
  Serial.begin(115200);
  SPI.begin();      // Инициализация SPI
  mfrc522.PCD_Init();   // Инициализация MFRC522
  Serial.println("RFID-RC522 initialized.");
 
  pinMode(BUZZER_PIN, OUTPUT); // Устанавливаем пин пьезоизлучателя на вывод
  digitalWrite(BUZZER_PIN, HIGH); // Устанавливаем пьезоизлучатель в неактивное состояние
 
  // Подключаемся к Wi-Fi сети
  Serial.println("Connecting to WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting...");
  }
  Serial.println("Connected to WiFi");
}

void loop() {
  // Проверяем наличие новой метки
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    // Считываем UID метки
    String uid = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      uid += String(mfrc522.uid.uidByte[i], HEX);
    }
    Serial.println("UID tag: " + uid);

    // Отправляем GET-запрос на сервер
    if (sendGetRequest(uid)) {
      Serial.println("GET request sent successfully");
      // Включаем пьезоизлучатель только при успешном запросе
      digitalWrite(BUZZER_PIN, LOW); // Включаем пьезоизлучатель
      delay(100); // Даем время для воспроизведения звука
      digitalWrite(BUZZER_PIN, HIGH); // Выключаем пьезоизлучатель
      delay(1000); // Пауза после воспроизведения звука
    } else {
      Serial.println("Failed to send GET request");
    }

    // Пауза между считываниями
    delay(3000);
  }
}

bool sendGetRequest(String uid) {
  // Создаем объект WiFiClient для соединения с сервером
  WiFiClient client;
 
  // Пытаемся подключиться к серверу
  if (!client.connect(server, 80)) {
    return false;
  }

  // Формируем GET-запрос
  String url = "/handler.php?key=" + uid;
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + server + "\r\n" +
               "Connection: close\r\n\r\n");

  // Ждем ответа от сервера
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      Serial.print(c);
    }
  }

  // Закрываем соединение с сервером
  client.stop();
  return true;
}
 

Вложения