В этом проекте мы построим высокоточный измеритель децибел с использованием WiFi-модуля ESP32 и специального модуля датчика уровня звука. Наш измеритель децибел будет способен определять уровень звука от 35 дБ до 115 дБ. Он очень точен и не требует калибровки, поскольку он уже предварительно откалиброван.
Мы можем соединить датчик уровня звука с ESP32 с помощью протокола I2C. Устройство может измерять, определять уровень звука и точно контролировать уровень звука в децибелах. Обнаруженный уровень звука может отображаться на 0,96-дюймовом OLED-дисплее. Помимо отображения уровня звука на OLED, мы можем отправлять данные на любую платформу IoT и использовать их для графической визуализации и дальнейшего анализа. В этом примере мы будем отправлять данные на платформу Ubidots.
Ранее на нашем сайте мы рассматривали и другие проекты измерителей уровня звука (но попроще по возможностям чем данный проект):
- измерение уровня звука (шума) в децибелах с помощью Arduino и микрофона;
- измерение уровня звука с помощью NodeMCU ESP8266 и датчика звука;
- как работает датчик звука KY-038 и как его подключить к ESP32.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Датчик уровня звука (SPL).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что такое децибеллометр?
Децибеллометр, также известный как измеритель уровня звукового давления (sound pressure level, SPL), — это устройство, предназначенное для измерения уровней звукового давления. Прибор использует микрофон для улавливания изменений звукового давления и преобразует их в электрический сигнал, который затем усиливается. Этот усиленный сигнал подвергается частотному и временному взвешиванию в соответствии с международными стандартами, обеспечивая стандартизированное измерение в децибелах (дБ).
Реакция децибелметра на звук сопоставима с реакцией человеческого уха, обеспечивая объективное измерение уровня шума в любой среде. Показания уровня шума, а также другие потенциальные акустические параметры, такие как эквивалентный непрерывный уровень звука (Leq), отображаются на экране устройства.
Модуль измерителя уровня звука в децибелах
Модуль децибел-метра, предлагаемый компанией PCB Artists, представляет собой компактный, энергоэффективный и точный прибор для измерения уровня звукового давления в дБ SPL. Этот модуль децибел-метра можно легко соединить с оборудованием, таким как Arduino, ESP32, Raspberry Pi или аналогичными устройствами.
Модуль децибелметра I2C можно подключить к любой системе с выходом питания 3,3 В и шиной I2C для связи с модулем звукового датчика. Он может определять уровень звука от 35 дБ до 115 дБ с точностью ±2 дБ SPL. Датчик также не требует калибровки, так как он откалиброван на заводе.
Подробнее о децибелметре PCB Artists читайте здесь: Руководство по программированию децибелметра I2C
Характеристики датчика
Модуль измерителя уровня звука от компании PCB Artists имеет следующие характеристики:
- Высокая точность ±2 дБ SPL.
- Диапазон измерений от 35 дБ до 115 дБ.
- Диапазон частот от 30 Гц до 8 кГц.
- Простота использования – стандартный интерфейс I2C (адрес I2C 0x48).
- Низкое энергопотребление, всего 5 мА при 3,3 В (измерение) и 100 мкА (спящий режим).
- Выбираемый ответ – взвешенный по шкале A , взвешенный по шкале C, взвешенный по шкале Z.
- Регулируемое время усреднения в диапазоне от 10 мс до 10 000 мс. Поддерживается
125 мс (быстрый режим) и 1000 мс (медленный режим). - Пороговое обнаружение и прерывание.
- Буфер на 100 чтений, позволяющий главному микроконтроллеру перейти в спящий режим.
- Можно приклеить к любой поверхности с помощью отрывного клея.
- Низкая стоимость и небольшой размер.
Распиновка датчика
Модуль измерителя уровня звука имеет 5 контактов. Контакт INT (прерывание) является необязательным и может быть оставлен открытым, если не используется в вашем приложении.
- 3V3 (входной контакт источника питания): подайте на этот контакт чистое стабилизированное питание 3,3 В. Модуль обычно потребляет 5 мА при 3,3 В.
- INT (контакт прерывания с открытым стоком, активный низкий): Функция прерывания отключена по умолчанию. Если включено, вывод INT переходит в низкий уровень, когда прерывание ожидает обработки.
- SCL (контакт SCL I2C с открытым стоком): стандартная линия SCL шины I2C, рекомендуемое подтягивающее сопротивление не менее 10 кОм.
- SDA (контакт SDA I2C с открытым стоком): стандартная линия SDA шины I2C, рекомендуемое сопротивление подтяжки не менее 10 кОм.
- GND (заземляющий контакт): Заземление модуля должно быть подключено непосредственно к заземлению источника питания системы или аккумулятора, если это возможно.
Схема проекта
Схема подключения модуля измерителя уровня звука к плате ESP32 представлена на следующем рисунке.
Подключите контакты VCC, GND, SDA и SCL модуля децибелметра к контактам 3.3V, GND, GP21 и GP22 ESP32 соответственно. Вы можете использовать макетную плату для сборки и перемычки для соединений.
Пример кода для работы с модулем измерителя уровня звука
Вот пример кода, который может считывать данные об уровне звука, считываемые модулем измерителя уровня звука с помощью ESP32. Код инициализирует протокол связи I2C для считывания значения данных датчика. Датчик имеет адрес I2C 0X48.
Скопируйте следующий код и загрузите его на плату ESP32. Для загрузки выберите ESP32 Dev Module и COM-порт, к которому подключена плата.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include <Wire.h> #define PCBARTISTS_DBM 0x48 #define I2C_REG_VERSION 0x00 #define I2C_REG_ID3 0x01 #define I2C_REG_ID2 0x02 #define I2C_REG_ID1 0x03 #define I2C_REG_ID0 0x04 #define I2C_REG_SCRATCH 0x05 #define I2C_REG_CONTROL 0x06 #define I2C_REG_TAVG_HIGH 0x07 #define I2C_REG_TAVG_LOW 0x08 #define I2C_REG_RESET 0x09 #define I2C_REG_DECIBEL 0x0A #define I2C_REG_MIN 0x0B #define I2C_REG_MAX 0x0C #define I2C_REG_THR_MIN 0x0D #define I2C_REG_THR_MAX 0x0E #define I2C_REG_HISTORY_0 0x14 #define I2C_REG_HISTORY_99 0x77 void setup() { Serial.begin(9600); Wire.begin(); byte version = reg_read(PCBARTISTS_DBM, I2C_REG_VERSION); Serial.print("dbMeter VERSION = 0x"); Serial.println(version, HEX); byte id[4]; id[0] = reg_read(PCBARTISTS_DBM, I2C_REG_ID3); id[1] = reg_read(PCBARTISTS_DBM, I2C_REG_ID2); id[2] = reg_read(PCBARTISTS_DBM, I2C_REG_ID1); id[3] = reg_read(PCBARTISTS_DBM, I2C_REG_ID0); Serial.print("Unique ID = "); Serial.print(id[0], HEX); Serial.print(" "); Serial.print(id[1], HEX); Serial.print(" "); Serial.print(id[2], HEX); Serial.print(" "); Serial.println(id[3], HEX); } void loop() { byte sound_level = reg_read(PCBARTISTS_DBM, I2C_REG_DECIBEL); Serial.print("Sound Level (dB SPL) = "); Serial.println(sound_level); delay(2000); } byte reg_read(byte addr, byte reg) { Wire.beginTransmission(addr); Wire.write(reg); Wire.endTransmission(); Wire.requestFrom(addr, (uint8_t)1); byte data = Wire.read(); return data; } |
После загрузки кода откройте Serial Monitor (окно монитора последовательной связи) - в нем отобразится уровень звука в дБ (SPL).
В тихой комнате измеренное значение децибел будет около 35. Значения децибел увеличиваются с увеличением уровня шума. Вы можете включить музыку, чтобы протестировать работу датчика на разных уровнях звука. Это высокоточный децибел-метр, поскольку калибровка выполняется на заводе.
Создание ESP32 IoT децибелметра (SPL) с регистратором данных
Теперь, когда мы протестировали децибеллометр и считываем значения в мониторе последовательной связи, мы можем еще больше улучшить этот проект. Мы можем использовать 0,96-дюймовый I2C OLED-дисплей для отображения значений дБ в реальном времени. Мы также можем отправить значение на любую платформу IoT, такую как Blynk, Thingspeak, Ubidots или любой другой сервер. Именно это мы сейчас и сделаем. Мы будем использовать Ubidots для регистрации данных и удаленного анализа в реальном времени.
Схема и соединения
Вот простое подключение для этого проекта. По сравнению с первоначальным вариантом мы добавили в схему дополнительный дисплей.
Подключите контакты VCC, GND, SDA и SCL OLED-дисплея SSD1306 0,96″ к контактам 3,3 В, GND, GP21 и GP22 ESP32 соответственно.
Настройка учетной записи Ubidots
Для удаленного мониторинга данных нам необходимо отправить значение децибелов со звукового датчика с помощью ESP32 на учетную запись Ubidots. Итак, давайте настроим эту учетную запись.
Создайте учетную запись Ubidots или войдите в систему, используя эту ссылку: https://stem.ubidots.com/ .
Перейдите к устройству и нажмите Create («Создать»).
Выберите пустое устройство и назовите его ESP32.
Таким образом, будет создано имя устройства ESP32.
Теперь нажмите на созданное устройство. Здесь вам нужно создать переменную.
Создайте необработанную переменную с именем Decibel meter (Измеритель децибел).
Теперь устройство и переменная созданы, поэтому возвращаемся к панели инструментов - нам нужно ее настроить.
В списке Add Widget («Добавить виджеты») выберите два виджета: Gauge («Датчик») и Line Chart («Линейная диаграмма»).
В Gauge и Line Chart выберите переменную Decibel Meter из ESP32. Теперь панель управления готова и выглядит так.
Датчик будет отображать значение записанных данных в реальном времени. Аналогично, столбчатая диаграмма будет отображать анализ данных децибелметра, записанных по времени.
Исходный код программы
Вот полный код для этого проекта. Код будет отображать значение датчика звука dB SPL на OLED-дисплее. Он также будет отправлять данные в облако Ubidots.
В следующих строках измените SSID WiFi, пароль и токен Ubidots.
1 2 3 |
#define WIFISSID "************" // Put your WifiSSID here #define PASSWORD "************" // Put your wifi password here #define TOKEN "************" // Put your Ubidots' TOKEN |
Для компиляции кода необходимо добавить библиотеку pubsubclient и библиотеку Adafruit SSD1306.
После добавления этих библиотек вы можете загрузить следующий код на плату ESP32.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
#include <Wire.h> #include <WiFi.h> #include <PubSubClient.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 //Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C //See datasheet for Address Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define PCBARTISTS_DBM 0x48 #define I2C_REG_VERSION 0x00 #define I2C_REG_ID3 0x01 #define I2C_REG_ID2 0x02 #define I2C_REG_ID1 0x03 #define I2C_REG_ID0 0x04 #define I2C_REG_SCRATCH 0x05 #define I2C_REG_CONTROL 0x06 #define I2C_REG_TAVG_HIGH 0x07 #define I2C_REG_TAVG_LOW 0x08 #define I2C_REG_RESET 0x09 #define I2C_REG_DECIBEL 0x0A #define I2C_REG_MIN 0x0B #define I2C_REG_MAX 0x0C #define I2C_REG_THR_MIN 0x0D #define I2C_REG_THR_MAX 0x0E #define I2C_REG_HISTORY_0 0x14 #define I2C_REG_HISTORY_99 0x77 #define WIFISSID "************" // Put your WifiSSID here #define PASSWORD "************" // Put your wifi password here #define TOKEN "************" // Put your Ubidots' TOKEN #define MQTT_CLIENT_NAME "ESP32" // MQTT client Name, please enter your own 8-12 alphanumeric character ASCII string; /**************************************** Define Constants ****************************************/ #define VARIABLE_LABEL1 "decibelmeter" // Assing the variable label #define DEVICE_LABEL "ESP32" char mqttBroker[] = "industrial.api.ubidots.com"; char payload[1000]; char topic1[150]; // Space to store values to send char str_decibelmeter[10]; /**************************************** Auxiliar Functions ****************************************/ WiFiClient ubidots; PubSubClient client(ubidots); void callback(char* topic, byte* payload, unsigned int length) { char p[length + 1]; memcpy(p, payload, length); p[length] = NULL; String message(p); Serial.write(payload, length); Serial.println(topic); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attemp to connect if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Connected"); } else { Serial.print("Failed, rc="); Serial.print(client.state()); Serial.println(" try again in 2 seconds"); // Wait 2 seconds before retrying delay(2000); } } } /**************************************** Main Functions ****************************************/ void setup() { Serial.begin(115200); Wire.begin(); byte version = reg_read(PCBARTISTS_DBM, I2C_REG_VERSION); Serial.print("dbMeter VERSION = 0x"); Serial.println(version, HEX); byte id[4]; id[0] = reg_read(PCBARTISTS_DBM, I2C_REG_ID3); id[1] = reg_read(PCBARTISTS_DBM, I2C_REG_ID2); id[2] = reg_read(PCBARTISTS_DBM, I2C_REG_ID1); id[3] = reg_read(PCBARTISTS_DBM, I2C_REG_ID0); Serial.print("Unique ID = "); Serial.print(id[0], HEX); Serial.print(" "); Serial.print(id[1], HEX); Serial.print(" "); Serial.print(id[2], HEX); Serial.print(" "); Serial.println(id[3], HEX); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } delay(500); display.clearDisplay(); WiFi.begin(WIFISSID, PASSWORD); Serial.println(); Serial.print("Waiting for WiFi Connection .............."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi Connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); client.setServer(mqttBroker, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } byte sound_level = reg_read(PCBARTISTS_DBM, I2C_REG_DECIBEL); Serial.print("Sound Level (dB SPL) = "); Serial.println(sound_level); display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(20, 10); display.setTextSize(1); display.print("Decibelmeter: "); display.setCursor(30, 30); display.setTextSize(2); display.print(sound_level); display.print(" dB"); display.display(); dtostrf(sound_level, 4, 2, str_decibelmeter); sprintf(topic1, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); sprintf(payload, "{\"%s\":", VARIABLE_LABEL1); sprintf(payload, "%s {\"value\": %s}}", payload, str_decibelmeter); Serial.println("Publishing temperature to Ubidots Cloud"); client.publish(topic1, payload); Serial.println(); client.loop(); delay(3000); } byte reg_read(byte addr, byte reg) { Wire.beginTransmission(addr); Wire.write(reg); Wire.endTransmission(); Wire.requestFrom(addr, (uint8_t)1); byte data = Wire.read(); return data; } |
Тестирование децибелметра
Теперь, когда код загружен, мы можем начать тестирование работы датчика звука. Мы можем узнать, насколько точен наш децибелметр.
OLED-дисплей начнет отображать значение в дБ SPL.
В тихом помещении уровень звука составляет около 34–35 дБ SPL.
Вы можете включить музыку и наблюдать рост уровня звука в соответствии с музыкальным ритмом.
Вы можете загрузить приложение Frequency Generator из Playstore, которое может воспроизводить различные звуки с переменной частотой.
Измените частоту звука и наблюдайте за показаниями на OLED-дисплее.
Те же данные можно считывать удаленно на платформе Ubidots.
Для этого обновите панель инструментов Ubidots, и здесь вы увидите значение уровня звука в реальном времени, а также графический анализ зарегистрированных данных.
Графически зарегистрированные данные можно использовать для дальнейшего анализа.
Вот анализ, который мы получили из наблюдений. Как показывает диаграмма ниже, значения децибел, считываемые с ESP32, являются высокоповторяемыми и свободными от случайных скачков. Он может удерживать устойчивые показания в течение длительностей низкого шума, а также очень хорошо реагирует на скачки или скачки уровня звука.
Видео, демонстрирующее работу проекта
Заключение
В заключение можно отметить что проект успешно демонстрирует создание высокоточного децибел-метра с использованием WiFi-модуля ESP32 и модуля датчика уровня звука. Этот измеритель, который не требует дальнейшей калибровки из-за своего предварительно откалиброванного состояния, обладает способностью определять уровни звука в диапазоне от 35 дБ до 115 дБ.
Используя протокол I2C, был создан эффективный интерфейс между ESP32 и датчиком уровня звука, обеспечивающий точное обнаружение и мониторинг уровней звука в децибелах (дБ SPL). Проект не только способствовал отображению обнаруженных уровней звука на 0,96-дюймовом OLED-дисплее, но и использовал платформу IoT Ubidots для передачи этих данных.
9 просмотров