每到過年時節,鞭炮、煙火、或是鄰居打牌到半夜,吵得你睡不著?或是家住鬧區,附近商辦大樓整修施工不斷?
過度吵雜的環境不僅容易精神緊張、難以集中注意力,長期更可能導致睡眠品質不佳,甚至聽力受損;一般而言超過70dB會讓人感到焦躁或不適,依照法規「噪音管制區劃定作業準則」明訂的分貝標準,在夜間更是得低於55分貝。
究竟如何對環境音做長時間且有效的量測呢?有沒有儀器幫助我們判斷周遭噪音對人已經是危害等級呢?今天就來實作一個NBIoT聲音監測計,紀錄噪音,揪出公害!
所需材料
-
Arduino UNO
-
AM7020(含SIM Card、天線)
-
SparkFun Electret Microphone Breakout(駐極體麥克風放大模組)
-
杜邦線數條
Arduino UNO
Arduino UNO是一款入們級的微控制器,也是最多初學者使用的一塊開發版,平價且容易入手,基本功能包括I2C、SPI、UART、Analog、Digital IO、PWM。
AM7020
AM7020是一款NBIoT模組,模組本身支援HTTP(S)、MQTT(S)、TLS等多項Protocol,加上專屬am7020的Arduino Library,讓使用門檻大大降低,初學者也能輕鬆使用。
SparkFun Electret Microphone Breakout
SparkFun Electret Microphone Breakout主要由一個駐極體麥克風與一個60倍的放大器組成,駐極體麥克風放大模組通過捕捉麥克風中兩個導電板(一個振動膜片和另一個固定的)之間的聲波並將它們轉換為電波(振幅),最後將信號放大後供微控制器的ADC讀取。
架構
以Arduino UNO作為主要控制板,使用類比輸入讀取麥克風原始訊號,經過UNO計算後再使用Software UART將資料交由AM7020使用MQTT Protocol發送至Adafruit IO,最後由Adafruit IO檢視並觀察數據。
步驟
-
設定Adafruit IO
-
硬體配置
-
程式設計
1.設定Adafruit IO
我們需要為Adafruit IO平台建立三個Feed,分別為音量(分貝)資料「mic」、噪音標準燈號「dB-color」、施工標準燈號「rule-color」;將這三個Feed建立在預設(Default) Group內。(若對AdafruitIO設定還不熟悉可參考5步驟輕鬆上手Adafruit IO平台!)
接下來需要為Adafruit IO平台建立一個Dashboard,用來將音量資料以折線圖方式呈現,Dashboard名稱設定為「mic」。
進入剛建立的Dashboard後新增一個折線圖(Line Chart)的Block,Feed選擇「mic」,在折線圖Block設定頁面設定「Y-Axis Minimum」、「Y-Axis Maximum」、「Decimal Places」、「Draw Grid Lines」。
新增一個指示器(Indicator)的Block用來顯示施工標準燈號,Feed選擇「rule-color」,在指示器Block設定頁面設定「Block Title」、「Conditions」。
新增一個指示器(Indicator)的Block用來顯示噪音標準燈號,Feed選擇「rule-color」,在指示器Block設定頁面設定「Block Title」、「Conditions」。
2.硬體配置
Arduino UNO |
AM7020 |
Microphone |
5V |
V |
- |
3v3 |
- |
VCC |
GND |
G |
GND |
8 |
T |
- |
9 |
R |
- |
7 |
EN |
- |
A0 |
- |
AUD |
3.程式架構說明
程式碼請參閱Github( https://github.com/JiekangHuang/am7020_Microphone )
程式會使用到以下兩個Library,請先去Github上下載下來放到Arduino Library資料夾底下。
-
TinyGsm(產生TCP封包)
-
PubSubClient(產生MQTT封包)
在整體通訊上我們使用MQTT與Adafruit IO溝通,而實際上實作通訊架構上我們分為兩層,由上到下分別為MQTT、TCP,每層架構獨自完成各自工作後再將結過傳送至下層,最終由AM7020發送到AdafruitIO。
轉換麥克風類比數據為分貝
麥克風模組接收到的都是音訊的原始類比資料,必須要演算為dB(分貝)才能讓人閱讀;演算方法使用APP Sound Meter做為參考,紀錄並比對雙方數值,最後用線性迴歸(linear regression)做校正;線性迴歸計算可以使用Excel會較為方便,計算完畢後dB可由如下公式得出。
dB = (adc + 截距係數) / dB係數 |
麥克風原始類比數據與APP Sound Meter比較:
ADC |
APP dB |
330 |
49 |
344 |
51 |
400 |
53 |
420 |
63 |
490 |
65 |
530 |
70 |
600 |
73 |
626 |
77 |
675 |
80 |
重點程式碼說明
檔名:am7020_Microphone.ino
-
Line 14~20:建立MQTT通訊架構(分層架構)
-
Line 23:定義Microphone類比輸入腳位為類比腳A0
-
Line 24~25:定義截距、斜率(由上方excel計算得出,可自行依需求調整)
-
Line 40~42:定義噪音條件(標準值可見下圖,這裡使用第三類)
-
Line 44:定義施工條件(標準值可見下圖)
-
Line 62:NBIoT連線
-
Line 64:設定MQTT KeepAlive
-
Line 81:檢查MQTT連線狀態
-
Line 93:讀取麥克風原始類比數據
-
Line 95:將麥克風原始類比數據做校正
-
Line 96:紀錄4分半鐘內最大值
-
Line 110:發布dB資料到Adafruit IO
-
Line 112:取得基地台時間
-
Line 115:判斷噪音標準燈號(超過標準為紅色,反之綠色)
-
Line 118:上傳噪音標準燈號
-
Line 122:判斷施工標準燈號(施工時間為紅色,反之綠色)
-
Line 125:上傳施工標準燈號
檔名:config.h
-
Line 11:資料上傳間間格(可自行依需求調整)
-
Line 67~68:MQTT Broker username、password(請修改為自己的Adafruit IO帳號密碼)
噪音標準值(參考噪音管制區劃定作業準則)
成品
打開Adafruit IO Dashboard即可觀察音量(分貝)的長期折線圖,觀察自家都是幾點開始受到噪音影響、持續多久等等數據;右下方可查看目前分貝數是否超出規定之標準;裝置將每4.5分鐘上傳一次資料。