
Устройство считывает уровень шума и показывает график изменения звука.
Описание работы:
Для начала работы подключите питание к Arduino. На дисплее будет показываться график уровня звука, который изменяется слева направо. Так же появляется риска, которая может двигаться сверху вниз. Изменение положения риски зависит от потенциометра. Изменение значение потенциометра регулирует предельное значение уровня звука. При увеличении значения потенциометра, риска будет двигать вверх, при уменьшении - вниз. Если уровень шума окружающей среды больше заданного предельного значения на потенциометре, то загорится светодиод.
Нам понадобится:
- Arduino Uno х 1шт.
- Trema Set Shield х 1шт.
- Trema-модуль потенциометр х 1шт.
- Trema-модуль светодиод х 1шт.
- Trema OLED-дисплей 128x64 х 1шт.
- Trema-модуль датчик звука х 1шт.
Для реализации проекта нам необходимо установить следующую библиотеку:
- Библиотека iarduino_OLED для работы с Trema OLED-дисплей 128x64.
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.
Схема сборки:
- Устанавливаем Trema Set Shield в Arduino Uno.
- Устанавливаем Trema-модуль потенциометр в 2 посадочную площадку.

- Устанавливаем Trema OLED-дисплей 128x64 в 1 посадочную площадку, в верхнюю I2C колодку.

- Устанавливаем Trema-модуль светодиод в 5 посадочную площадку.

- Устанавливаем в 6 посадочную площадку.

- Полученные результат представлен ниже на рисунке.

Код программы:
Копировать1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_OLED. #include <iarduino_OLED.h> // Подключаем библиотеку iarduino_OLED. iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C. // int pinDatS = A3; // Объявляем пин для работы с датчиком звука. int pinLedRed = 11; // Объявляем пин для работы с красным светодиодом. int pinPot = A0; // Объявляем пин для работы с потенциометром. // float mass[44]; // Массив для хранения полученных данных с датчика звука. const float average = 2; // Переменная усреднения показаний датчика (чем выше значение, тем выше инерционность выводимых показаний). int potValue; // Переменная для считывания показания потенциометра. int potValuePrev; // Переменная для сохранения предыдущего значения потенциометра. // float readDatS; // void setup() // { // myOLED.begin(); // Инициируем работу с дисплеем. myOLED.autoUpdate(false); // Запрещаем автоматический вывод данных. Информация на дисплее будет обновляться только после обращения к функции update(). pinMode(pinLedRed, OUTPUT); // Переводим вывод pinLedRed в режим выхода. } // // void loop() // { // for (int i = 0; i <= 130; i = i + 3) // Цикл для стирания графика с предыдущими элементами массива. { // myOLED.drawLine(i, 64-mass[i/3], i+3, 64-mass[(i+3)/3], 0); // Стираем график. } // // readDatS = map(analogRead(pinDatS), 0, 1023, 0, 64); // Считаем показания датчика. // int Prev = mass[0]; // Дополнительная переменная для переноса массива, присваиваем ей значение первого элемента массива. int Prev2; // Вторая дополнительные переменные для переноса массива. // Формула аппроксимации. // mass[0] *= average-1; // Умножаем предыдущее значение датчика звука на коэффициент усреднения-1. mass[0] += readDatS; // Добавляем к полученному значению новые показания датчика звука. mass[0] /= average; // Делим полученное значение на коэффициент усреднения. // for (int i = 1; i <= 43; i++) // Переносим каждый элемент массива по очереди с помощью цикла. { // Prev2 = mass[i]; // Присваиваем второй дополнительное переменной новый элемент массива. mass[i] = Prev; // Присваиваем новому элементу массива предыдущий элемента массива. Prev = Prev2; // Присваиваем дополнительным переменным вторую дополнительную переменную. } // // for (int i = 0; i <= 130; i = i + 3) // Цикл для выведения на дисплей график. { // myOLED.drawLine(i, 64-mass[i/3], i+3, 64-mass[(i+3)/3],1); // Выводим на дисплей график } // // potValue = analogRead(pinPot)/16; // Считываем показания потенциометра и делим на 16. if (potValuePrev != potValue) // Если не равны предыдущее и полученное значение потенциометра, то произошло изменение. { // myOLED.drawLine(0, potValuePrev, 130, potValuePrev,0); // Стираем на дисплее уровень в виде линии. potValuePrev = potValue; // Сохраняем полученное значение с датчика звука в предыдущую переменную. } // myOLED.drawLine (0, potValue, 130, potValue,1); // Выводим на дисплей уровень в виде линии. // if (mass[0] > 64 - potValue){digitalWrite(pinLedRed, HIGH);} // Если значения датчика звука больше потенциометра, то зажигаем светодиод. else {digitalWrite(pinLedRed, LOW);} // Если меньше, то гасим светодиод. // myOLED.update(); // Разрешаем автоматический вывод данных. } //
Алгоритм работы:
В начале скетча (до кода setup) выполняются следующие действия:
- Подключаем библиотеку iarduino_OLED для работы с Trema OLED-дисплей 128x64.
- Объявляем объект myLED, с указанием адреса дисплея на шине I2C.
- Объявляем пины для работы с Trema-модуль датчик звука, Trema-модуль светодиод, Trema-модуль потенциометр.
- Объявляем массив и переменные задействованные в программе.
В коде setup выполняются следующие действия:
- Инициируем работу с дисплеем. Запрещаем автоматический вывод данных.
- Переводим вывод Arduino для светодиода в режим выхода.
В коде loop выполняются следующие действия:
- Стираем график звука.
- Считываем показания датчика и аппроксимируем полученные значения по формуле.
- Сдвигаем массив данных.
- Отрисовываем новый график.
- Проверяем изменилось положение риски, если изменилось, то выводим риску на дисплей, стираем предыдущее положение риски.
- Проверяем превышает уровень звука на датчики предельный уровень потенциометра . Если превышает, то горит светодиод.
Особенность:
Такой принцип работы можно использовать для считывания данных с любого устройства, выдающий аналоговый сигнал.
Ссылки:
Комплект для повторения проекта
Что понадобится
Это быстрый ориентир по основным модулям и деталям. Полный список для повторения проекта смотрите в самой статье.
6 позиций
Arduino Uno R3 (USB ATmega16U2)
Платформа c микроконтроллером ATmega328P на ядре AVR с чипом USB ATmega16U2 для разработки электронных устройств на языке C++
Открыть в iArduino
Trema Set Shield
Плата расширения, которая упрощает процесс подключения модулей к Arduino.
Открыть в iArduino
Потенциометр v2 (Trema-модуль)
Сенсор для настройки скорости вращения двигателя, угол поворота сервопривода, яркости светодиода и т.д.
Открыть в iArduino
Светодиод - зеленый (Trema-модуль)
Trema-модуль светодиод
Открыть в iArduino
OLED экран 128×64 / 0,96” (Trema-модуль)
Компактный графический дисплей с белым начертанием, позволит выводить русские и английские символы
Открыть в iArduino
Датчик звука (Trema-модуль)
Позволяет получить аналоговое значение соответствующее уровню громкости звука
Открыть в iArduino