Arduinoサウンドセンサーでリアルタイム音量監視─LEDインジケーターとLCD表示付き
必要な部品と用品
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| フルサイズ ブレッドボード | 1 | |
| 9V電池 | 1 | 任意 |
| 9V-バレルジャック コネクタ | 1 | 任意 |
| オス-オス ジャンパーワイヤー | 1式 | |
| オス-メス ジャンパーワイヤー | 1式 | |
| LCD 16x2(I2Cバックパック付き) | 1 | Adafruit等、白文字/青背景 |
| サウンドセンサーモジュール KY-038 | 1 | |
| 5mm LED 黄色 | 2 | 低音量表示用 |
| 5mm LED 緑 | 4 | 中音量表示用 |
| 5mm LED 赤 | 2 | 高音量表示用 |
| 5mm LED 白 | 4 | |
| 5mm LED 青 | 4 | |
| 抵抗 100Ω | 8 | 白・青LED用 |
| 抵抗 220Ω | 4 | 赤・黄LED用 |
| 抵抗 330Ω | 4 | 緑LED用 |
使用するアプリ
- Arduino IDE
プロジェクト概要
スピーカーから出力される音量レベルを監視するプロジェクトです。好奇心と暇つぶしから生まれました。
KY-038マイクサウンドセンサーモジュールで値を取得し、シリアルモニタで確認→スプレッドシートに転記→昇順ソート→頻出値や好みの値を閾値として設定しました。
- 低音域値 → 黄色LED点灯
- 中音域値 → 緑色LED点灯
- 高音域値 → 赤色LED点灯
LCD(任意)でリアルタイムに数値表示も可能です。既存コードを組み合わせて改良しました。
遭遇した問題: LCD表示で前回値の桁が残る現象(例:前回1234、今回619なのに「6194」と表示)。スペース出力で対処しました。
Arduinoコード
#include "Arduino.h"
#include "LiquidCrystal_PCF8574.h"
#define LCD_ADDRESS 0x27
#define LCD_ROWS 2
#define LCD_COLUMNS 16
#define SCROLL_DELAY 150
#define BACKLIGHT 255
LiquidCrystal_PCF8574 LCDi2C;
// LEDピン割り当て(ブレッドボード上の位置=Arduinoピン)
int LED1 = 3; int LED2 = 4; int LED3 = 5; int LED4 = 6;
int LED5 = 7; int LED6 = 8; int LED7 = 9; int LED8 = 10;
int soundSensor = 2; // KY-038のDOピン接続先
int sensorValue = A0; // KY-038のAOピン接続先(アナログ入力)
boolean LEDStatus = false;
void setup() {
Serial.begin(9600);
LCDi2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
pinMode(soundSensor, INPUT);
pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT); pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT); pinMode(LED8, OUTPUT);
}
void loop() {
int sensorValue = analogRead(A0); // アナログ値読取
int SensorData = digitalRead(soundSensor); // デジタル値読取
if (SensorData == HIGH) { // 音検知時
if (!LEDStatus) {
LEDStatus = true;
Serial.println(sensorValue);
// LCD表示(桁残り防止でスペース追加)
LCDi2C.setCursor(0, 0);
LCDi2C.print("SoundLevel Data:");
LCDi2C.setCursor(0, 1);
LCDi2C.print(sensorValue);
LCDi2C.print(" ");
}
// 閾値ごとのLED制御(値は実測値から決定)
if (sensorValue >= 750) { digitalWrite(LED8, HIGH); } else { LEDStatus = false; digitalWrite(LED8, LOW); }
if (sensorValue >= 735) { digitalWrite(LED7, HIGH); } else { LEDStatus = false; digitalWrite(LED7, LOW); }
if (sensorValue >= 725) { digitalWrite(LED6, HIGH); } else { LEDStatus = false; digitalWrite(LED6, LOW); }
if (sensorValue >= 720) { digitalWrite(LED5, HIGH); } else { LEDStatus = false; digitalWrite(LED5, LOW); }
if (sensorValue >= 715) { digitalWrite(LED4, HIGH); } else { LEDStatus = false; digitalWrite(LED4, LOW); }
if (sensorValue >= 700) { digitalWrite(LED3, HIGH); } else { LEDStatus = false; digitalWrite(LED3, LOW); }
if (sensorValue >= 675) { digitalWrite(LED2, HIGH); } else { LEDStatus = false; digitalWrite(LED2, LOW); }
if (sensorValue >= 650) { digitalWrite(LED1, HIGH); } else { LEDStatus = false; digitalWrite(LED1, LOW); }
} else {
// 音検知なし:全LED消灯
LEDStatus = false;
for (int i = 1; i <= 8; i++) {
digitalWrite(i + 2, LOW); // LED1=D3 ... LED8=D10
}
}
}
注:元コードの一部論理(LEDStatusの扱い等)を整理し、可読性を高めています。閾値は環境に合わせて調整してください。
回路図
配線は画像の通り端から端へ接続してください。
参考リンク
- ソーシャルメディア:Facebook | Twitter | Instagram
- 関連ファイル:Google Drive
製造プロセス
- センサーデータをRaspberry Piに統合:実践ガイド
- Raspberry Piでライントラッキングセンサー – シンプルなKY-033ドア/ライン検出器
- GY-91モジュールでRaspberry Pi上に堅牢な温度・センサーAPIを構築
- Arch SystemsとFlex、高度分析で製造データ変革へ提携
- Würth Elektronik、産業IoT向け超小型低消費電力3軸MEMS加速度センサ「WSEN-ITDS」発表
- BASELABS、Dynamic Grid発表─生データセンサーフューションで高度自動車モデリングを実現
- 皮膚型ソフト触覚センサー搭載ロボットグリッパーで精密把持を実現
- ISSセンサー向け高精度WiFi RSSIトラッキング
- IoTエコシステムにおける視覚データの力を解き放つ
- 高インパクトなセンサー駆動IoTアプリケーション構築の6つの核心原則
- 革新的材料が次世代LEDデータ通信を駆動