В этом проекте мы создадим устройство мониторинга уровня и интенсивности звука на основе технологии Интернета вещей (IoT) с использованием NodeMCU ESP8266 и звукового модуля/датчика, а также будем осуществлять онлайн-мониторинг уровня звука на сервере Thingspeak.
Ранее на нашем сайте мы рассматривали подключение датчика звука и к другим платам:
Обзор проекта
Шумомер (sound level meter) используется для акустических (звук, распространяющийся по воздуху) измерений. Лучшим типом микрофона для шумомеров является конденсаторный микрофон, который сочетает в себе точность со стабильностью и надежностью. Диафрагма микрофона реагирует на изменения давления воздуха, вызванные звуковыми волнами. Вот почему этот прибор иногда называют измерителем уровня звукового давления (SPL).
Шумомеры обычно используются в исследованиях шумового загрязнения для количественной оценки различных видов шума, особенно промышленного, экологического, горнодобывающего и авиационного. Показания шумомера плохо коррелируют с воспринимаемой человеком громкостью, которую лучше измеряет измеритель громкости звука (loudness meter). Удельная громкость является компрессионной нелинейностью и изменяется на определенных уровнях и на определенных частотах. Эти показатели также можно рассчитать несколькими различными способами.
В этом проекте IoT мы сделаем измеритель уровня и интенсивности звука. Этот проект очень прост и может быть сделан дома для мониторинга звукового загрязнения. Мы будем использовать Nodemcu ESP8266, звуковой модуль (датчик звука) и OLED-дисплей. Звуковой датчик обнаружит звук и преобразует его в аналоговое напряжение, которое считывается Nodemcu ESP8266. Nodemcu подключается к Wi-Fi и загружает данные на сервер Thingspeak.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Датчик звука KY-038 (или аналогичный) (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода/перемычки.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик звука микрофона
Датчик звука микрофона (microphone sound sensor), как следует из названия, обнаруживает звук. Он измеряет громкость звука. Датчик звука представляет собой небольшую плату, которая объединяет микрофон (50 Гц-10 кГц) и некоторые схемы обработки для преобразования звуковых волн в электрические сигналы. Этот электрический сигнал подается на встроенный высокоточный компаратор LM393 для оцифровки и становится доступным на выводе OUT.
Модуль имеет встроенный потенциометр для регулировки чувствительности сигнала на контакте OUT. Мы можем установить порог с помощью потенциометра. Таким образом, когда амплитуда звука превышает пороговое значение, модуль выдаст LOW, в противном случае HIGH.
Кроме этого, модуль имеет два светодиода. Светодиод питания загорается когда на модуль подано питание. Светодиод состояния загорается, когда цифровой выход переходит в состояние LOW.
Датчик звука имеет только три контакта: VCC, GND и OUT. Контакт VCC подает питание на датчик и работает от напряжения от 3,3 В до 5 В. Контакт OUT выдает ВЫСОКИЙ уровень в тихих условиях и становится НИЗКИМ при обнаружении звука.
0,96-дюймовый I2C OLED-дисплей
Это 0,96-дюймовый OLED-дисплейный модуль. Он может быть подключен к любому микроконтроллеру с использованием протоколов I2C. Он имеет разрешение 128×64. В комплект входит дисплейная плата, дисплей, 4-контактный разъем, предварительно припаянный к плате.
OLED (Organic Light-Emitting Diode) — это технология самоизлучающего света, состоящая из тонкой многослойной органической пленки, помещенной между анодом и катодом. В отличие от технологии LCD, OLED не требует подсветки. OLED обладает высоким потенциалом применения практически для всех типов дисплеев и рассматривается как окончательная технология для следующего поколения плоских дисплеев.
Схема проекта
Схема подключения к NodeMCU ESP8266 звукового датчика и OLED-дисплея приведена на следующем рисунке.
Звуковой датчик и OLED-дисплей требуют питания 3,3 В. Поэтому подключите их клеммы VCC и GND к 3,3 В и GND NodeMCU соответственно. Подключите выходной контакт звукового датчика к контакту Nodemcu A0. Подключите контакты I2C, т. е. контакты SDA и SCL OLED-дисплея к контактам Nodemcu D2 и D1 соответственно.
Настройка Thingspeak
Для мониторинга данных датчиков на сервере Thingspeak вам сначала нужно настроить Thingspeak. Чтобы настроить сервер Thingspeak, посетите https://thingspeak.com/. Создайте учетную запись или просто войдите в нее, если вы создали учетную запись там ранее. Затем создайте новый канал со следующими данными.
После заполнения этих данных сохраните канал. Перейдите в API Key и скопируйте полученный там API key. Этот API key будет далее использоваться в программе.
Исходный код программы
Исходный код программы для взаимодействия датчика звука (звукового модуля) с ESP8266 приведен ниже. Скопируйте код и загрузите его на плату Nodemcu.
Обязательно внесите изменения в SSID Wi-Fi, пароль и API Thingspeak.
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 |
#include <ESP8266WiFi.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.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) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); int num_Measure = 128 ; // Set the number of measurements int pinSignal = A0; // pin connected to pin O module sound sensor long Sound_signal; // Store the value read Sound Sensor long sum = 0 ; // Store the total value of n measurements long level = 0 ; // Store the average value int soundlow = 40; int soundmedium = 500; int error = 33; String apiKey = "14K8UL2QEK8BTHN6"; // Enter your Write API key from ThingSpeak const char *ssid = "Alexahome"; // replace with your wifi ssid and wpa2 key const char *pass = "12345678"; const char* server = "api.thingspeak.com"; WiFiClient client; void setup () { pinMode (pinSignal, INPUT); // Set the signal pin as input Serial.begin (115200); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64) display.clearDisplay(); delay(10); Serial.println("Connecting to "); Serial.println(ssid); display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE); display.println("Connecting to "); display.setTextSize(2); display.print(ssid); display.display(); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); display.clearDisplay(); display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE); display.print("WiFi connected"); display.display(); delay(4000); } void loop () { // Performs 128 signal readings for ( int i = 0 ; i <num_Measure; i ++) { Sound_signal = analogRead (pinSignal); sum =sum + Sound_signal; } level = sum / num_Measure; // Calculate the average value Serial.print("Sound Level: "); Serial.println (level-error); display.clearDisplay(); display.setCursor(0,0); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.println("--- Decibelmeter ---"); if( (level-error) < soundlow) { Serial.print("Intensity= Low"); display.setCursor(0,20); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Sound Level: "); display.println(level-error); display.setCursor(0,40); display.print("Intensity: LOW"); display.display(); // { // if( (level-error) < 0) // Serial.print("Intensity= Low"); // display.setCursor(0,20); //oled display // display.setTextSize(1); // display.setTextColor(WHITE); // display.print("Sound Level: 0"); // // display.setCursor(0,40); // display.print("Intensity: LOW"); // // display.display(); // } } if( ( (level-error) > soundlow ) && ( (level-error) < soundmedium ) ) { Serial.print("Intensity=Medium"); display.setCursor(0,20); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Sound Level: "); display.println(level-error); display.setCursor(0,40); display.print("Intensity: MEDIUM"); display.display(); } if( (level-error) > soundmedium ) { Serial.print("Intensity= High"); display.setCursor(0,20); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Sound Level: "); display.println(level-error); display.setCursor(0,40); display.print("Intensity: HIGH"); display.display(); } sum = 0 ; // Reset the sum of the measurement values delay(200); if (client.connect(server, 80)) // "184.106.153.149" or api.thingspeak.com { String postStr = apiKey; postStr += "&field1="; postStr += String(level-error); postStr += "r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); } client.stop(); //delay(15000); // thingspeak needs minimum 15 sec delay between updates. } |
Для калибровки устройства необходимо практически исправить следующие строки.
1 2 3 |
int soundlow = 40; int soundmedium = 500; int error = 33; |
Звуковой модуль распознает звук на 3 различных уровнях, назначенных как низкая интенсивность, средняя интенсивность и высокая интенсивность. Вы можете установить soundlow и soundmedium по своему желанию. Интенсивность слышимости зависит от человека.
Аналогично, целое число ошибки определяется для удаления отрицательного значения для уровня звука. Это может быть известно только после загрузки кода и проведения наблюдения. Проверьте отрицательное значение, когда есть звук падения булавки, и назначьте в коде.
Тестирование работы проекта
После загрузки кода Nodemcu попытается подключиться к Wi-Fi. Весь процесс можно наблюдать на OLED-дисплее, как показано ниже.
После подключения к Wi-Fi на OLED-дисплее начнет отображаться уровень и интенсивность звука.
Теперь вы можете воспроизводить музыку и наблюдать значения на OLED-дисплее. Уровень звука будет повышаться при обнаружении высокого звука и понижаться при обнаружении низкого звука.
Также вы можете посетить Thingspeak, чтобы отслеживать данные об уровне звука онлайн. Просто перейдите в личный просмотр Thingspeak, и вы увидите следующие журналы данных и графики.
26 просмотров