每到過年時節,鞭炮、煙火、或是鄰居打牌到半夜,吵得你睡不著?或是家住鬧區,附近商辦大樓整修施工不斷?

過度吵雜的環境不僅容易精神緊張、難以集中注意力,長期更可能導致睡眠品質不佳,甚至聽力受損;一般而言超過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檢視並觀察數據。

 

步驟

  1. 設定Adafruit IO

  2. 硬體配置

  3. 程式設計

 

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分鐘上傳一次資料。

 

小結

提醒大家,沒有經過標準公證單位認證的量測儀器,僅能做為參考用唷。即使是參考量測,我們仍舊可以把它放在家,簡易地偵測是否有超標噪音;家住鬧區的夥伴們,就能以數據資料,相對客觀地委婉勸導鄰里囉!更多NBIoT實作分享,歡迎瀏覽其他文章參考。