第 05 章 - 感測器應用
上次更新日期 2022/10/19
上一個章節我們可以讀入可變電阻的監測數值,該數值可以代表電壓呢!也可以用來進行一些額外的處理。 這個章節,我們拿幾個簡單的感測器來偵測環境一下,包括光敏電阻、溫溼度計、繼電器等, 測量看看這些感測器的數據資料是否正確,以及搭配其他東西來應用看看。
學習目標:
- 使用光敏電阻
- 使用溫濕度計
- 使用繼電器
- 使用三軸加速器
5.1: 光敏電阻
我們上一章可以從類比腳位去取得來自某些物件所傳來的電壓值,並轉成 0~1023 之間的數字。目前許多的偵測器, 在 arduino 上面的應用也是差不多的樣式,就是將要偵測的資料,轉成電壓之後,再由 arduino 讀回,套用公式後, 就可以取得需要的數據值。
先來討論一個光敏電阻的玩意兒,光敏電阻顧名思義,就是跟光有關的電阻。一般來說,當光線越強, 光敏電阻內部的電流可以放大,亦即電阻值變小,因此有光線的情況底下,電壓的強度會增加。當沒有光線時, 電阻變大,電壓自然就比較小了。
光敏電阻同樣也需要一個電流迴路,因此需要有 5V 的供電以及接地。那光敏電阻只有兩隻腳,要如何偵測數據呢? 就是從接地的那一頭,同時接地也同時連接到類比腳位 (我們這裡習慣使用 A1 腳位)。也就是說,光敏電阻的兩隻腳放在麵包板的不同群祖上, 一隻群組只接 5V ,一隻群組則同時接 A1 與一般電阻,一般電阻在接往接地即可。
- 連線方式:
- 光敏電阻一腳 -- Arduino 5V
- 光敏電阻另一腳 -- ( Arduino A1, 電阻器一腳 )
- 電阻器一腳 -- Arduino 接地
- 程式設計:
- 在全域變數區,設定整數變數 light 為 1,預計拿來當 A1 腳位讀取
- 在 setup() 函數內,指定 Serial.begin 為 9600
- 在 loop() 函數內,指定 int val = analogRead(light),並將該數值印出到序列埠,然後延遲 1 秒鐘即可。
現在我們知道光敏電阻可以了解光線的強弱,那麼這樣實驗看看,如果光敏電阻的數值高於 300 時,就關閉 LED 燈, 如果低於 300 時,就打開 LED 燈,這樣該如何處理?
- 連線方式:
- 光敏電阻跟 5.1.1 相同,不用更動
- 增加一個 LED 單色燈,使用 D9 腳位
- 程式設計:
- 增加全域變數 led,數值為整數 9
- 在 setup() 函數內,使用 pinMode 設計 led 為 OUTPUT
- 在 loop() 函數內,在取得光敏電阻數字後,判斷是否大於 300,若是,則關閉 LED,若否,則開啟 LED 燈。
如果在房間內、在水族箱上的燈光、在室外的小燈,都可以透過這個 arduino 搭配光敏電阻,進行額外動作的設計喔!
5.2: 使用溫濕度計 - 以 DHT11 為例
環境監測最常見的感測器就是溫溼度計。溫溼度計的模組非常多,我們拿比較便宜常用的 DHT11 模組來處理一下。 DHT11 模組基本上會有 4 隻腳,搭配背板會變成 3 隻腳,分別是 5V(VCC)、接地 (GND) 以及資料輸出。這個資料輸出會輸出溫度與濕度。 你可能會說,只有一隻腳,怎麼同時輸出兩個數據呢?沒錯!確實會輸出兩個數據!我們就得要使用 arduino 額外的模組, 搭配模組的使用,才有辦法取得正確的數據!
- arduino 範例與模組
現在,請在 IDE 主程式裡面的『檔案』、『範例』裡面,找到最底下的 DHT sensor library,底下就有個 DHT_Unifined_Sensor 範本。 請打開它,然後另存新檔成為 code-dht-1 的檔案,這個檔案最上面的內容會有點像這樣:
#include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 2 // Digital pin connected to the DHT sensor // Uncomment the type of sensor in use: #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; void setup() { ...
如上所示,最前面的 #include 就是在載入 DHT 的模組,其中比較重要的是 DHTPIN 這個設定,預設是放在 D2 腳位上喔! 如果你有需要其他的腳位,那就修改這個項目吧!否則,我們建議就放在 D2 即可。 而後面的感測器,則需要修改成為 DHT11 (新的可能有人會買到 DHT22!無論如何,都從這裡拿出來處理!)。只要你的設備連接是正確的, 那麼最終就能輸出正確的溫溼度計資料了!
- 連接方式:
- 將 DHT11 的三隻腳,直接插入麵包板上,注意看針腳的項目為何
- 根據上面的針腳,將 5V, 接地、 D2 的 arduino 連線連上即可
- 程式設計:
- 直接使用 code-dht-1 即可
每一種感測器都有其處理的極限!以這款 DHT11 來說,溫度誤差可能到 2 度,相對濕度每個跳動可能誤差到 5%! 所以,大概只是測個基準判斷,並不能拿來作為實際很需要準確性的工作當中喔。
5.3: 使用繼電器 (relay)
繼電器也是挺有趣的東西,基本上,它就是在一個電源迴路裡面的銜接器,可以進行短路 (on) 或斷路 (off) 的行為, 這樣就可以控制整個電源迴路的開或關了!你可以說,繼電器就是在一個可以持續通電的迴路當中的一個開關! 而這個開關目前可以讓我們透過 arduino 去控制這樣。這個繼電器除了可以控制 arduino 上面的電力供給之外, 也可以提供市電開關的目的!是相當有趣的!
從萬能百寶袋當中取出繼電器,它長的有點像底下這樣 (圖片來源按這裡查看),文末有繼電器的相關說明,請自行查閱。
仔細看圖示,下圖裡面會有 NO, COM, NC 這三個旋鈕,這三個項目的功能是:
- NO (Normal Open):正常線路打開,就是斷路、沒有連線的意思,這個會比較常用,就是正常情況下,線路沒有接在一起 (open 開來) 的意思。
- COM (Common Ground):一般接地,在官網上面說是要接火線或直流電的正極~
- NC (Normal Close):正常線路關閉,,就是短路、線路連接在一起的意思。正常情況就是有通電 (close 在一起)
因為我們比較習慣的方式,大多是『正常情況不需要通電,當有需要的時候,才通電打開』的意思!舉例來說,我們電腦教室裡面的通風扇, 溫度正常情況下,不用打開抽風扇 (停電),而溫度過高的情況下,才啟用抽風扇的電源 (來電) 的意思。這時,接法通常就會使用到 COM 與 NO 這兩個旋鈕~
至於第一個圖示有 DC+, DC- 與 IN 三個旋鈕,分別代表:
- DC+:接 arduino 3.3V 或 5V 的電源
- DC-;接 arduino 接地線
- IN:接上 arduino 訊號線
現在,先讓我們來玩一下自動讓繼電器一直開/關的動作!每 5 秒鐘進行一次的情況!先來摸一下接線的方式:
- 開始連接-繼電器與 arduino 的訊號控制方式 (須 3 條公對公杜邦線):
- 繼電器 DC+ -- 麵包板 -- arduino 5V 電源上
- 繼電器 DC- -- 麵包板 -- arudino 的接地
- 繼電器 IN -- 麵包板 -- arduino 的 D5 第 5 號訊號線上面
- 開始連接-繼電器與設備連接的方式 (須 2 條公對公杜邦線):
- 繼電器 COM -- 麵包板 -- arduino 的 3.3V 上
- 繼電器 NO -- 麵包板 -- 電阻器一端
- 電阻器另一端 -- 麵包板 -- LED 燈正極
- LED 燈負極 -- 麵包版 -- arduino 另一個接地上
- 將 arduino 接上 USB,你會發現繼電器的電源燈號亮了 (很亮!),記得此時只亮一顆燈,LED 燈預設是不亮的。
- IDE 程式撰寫,稱為 code-relay-1 即可!
- 指定 sig 全域變數為整數,且為 5 號 (我們訊號線接到 D5 上)
- setup 函數內,使用 pinMode 指定 5 號為 OUTPUT 模式
- 在 loop 函數內,先用 digitalWrite(sig, HIGH) 讓燈亮,然後 delay 5 秒之後,再變成 LOW 關掉。
上面的指令有點無厘頭~因為就一直開關而已。現在,讓我們來處理一下,用光敏電阻來判斷要不要開燈。 預設是不要開燈,當光敏電阻低於 300 時,就打開 LED 燈光。
- 開始連線
- 光敏電阻一端 -- arduino 5V 已經在麵包板上
- 光敏電阻另一端 -- 麵包板 -- A1 與電阻器
- 電阻器力一端 -- DC- 的接地麵包板上
- 程式設計 code-relay=2
- 全域變數新增一個 light 整數為 1 (A1 取得訊號)
- 在 loop 函數內,使用 int val = analogRead(light),主要就是光敏電阻的電壓值,然後根據 val 是否大於 300, 若大於 300 則對 D5 做 LOW 的輸出,否則就對 D5 做 HIGH 的輸出即可。
上面單純只是讓大家知道繼電器怎麼使用,如果你想要使用 110V 的交流電,那麼,請拿一條延長線,延長線裡面會有兩條線 (火線/地線), 將其中一條剪斷,變成兩頭之後,分別塞入 COM 與 NO 旋鈕中,然後夾緊。之後延長線預設會沒有通電,當你的 arduino 提供 HIGH 的狀態之後, 延長線才會有電力!這樣就搞定了! (使用上要小心!畢竟是交流電~建議使用延長線之後,先以三用電錶測試有沒有來電,確定沒有問題之後, 才開始使用該延長線較佳!)
5.4: 使用三軸陀螺儀
有時候,我們可能會使用到三軸加速器 (或所謂的陀螺儀),這東西主要的目的是在測量 X, Y, Z 的方位,只是,這東西的輸出資料實在太多了, 使用一般的界面,很難一項一項讀出來,因此,這陀螺儀會使用到 I2C 的界面去彙整數據,所以,我們得要將陀螺儀接到正確的位置, 不能隨意接在 arduino 的腳位喔!
- I2C 與 arduino 腳位
一般 I2C 的腳位共有四隻,分別是:
- GND:接地
- VCC:5V供電
- SDA:串列資料線 (serial data)
- SCL:串列時脈線 (serial clock)
arduino 上面有接地與 5V 的腳位,這個沒問題~那 SDA 與 SCL 要接在哪裡呢?在 arduino nano 上面,這兩個針腳, 需要接在 I2C 的位置上喔~主要接腳是這樣的 (不同的 arduino 板子其接腳都不相同!連接之前請特別搜尋一下喔!):
- SDA: 接在 A4 上
- SCL: 接在 A5 上
- arduino 的 I2C 模組
為了方便使用者的操作, arduino 釋出名為 Wire 的模組,某部份就是用來支援 I2C 的!因此,你要使用到 A4, A5 的類比腳位, 就得要在 IDE 程式碼裡面,先使用『 #include <Wire.h> 』這個模組才可以!此外,我們也得要知道這個 I2C 的裝置是不是正常的? 因此,可以使用 Wire 模組提供的 I2C scanner 掃描一下裝置位址看看,要確定裝置沒問題,才有下一步啊!
- 拿出你的三軸加速器,設備上面會有 GY-521 的小板子,上面有 8 個腳位,請先確認妥當。
- 將 GY-521 安插到不同排的麵包板上面
- 根據上面的說法,將 VCC, GND, SDA, SCL 連接到正確的 arduino 腳位上。
完成連線之後,再來,讓我們掃描一下硬體位址吧!
- 從 IDE 的『檔案』、『範例』、『Wire』當中,取得『i2c_scanner』的範例資料。
- 直接編譯並上傳到 arduino 上
- 打開序列埠,你會發現類似如下的資料,那就是你的 I2C 位址。
13:57:54.514 -> 13:57:54.514 -> I2C Scanner 13:57:54.514 -> Scanning... 13:57:54.514 -> I2C device found at address 0x68 ! 13:57:54.559 -> done
- 安裝 MPU6050_light 模組
要驅動 GY-521 三軸加速器,可以用很多模組。這個 GY-521 用的是 MPU6050 晶片,因此,可以抓 MPU6050 的函式庫。 我們這裡先測試使用 MPU6050_light 模組來應用。
- 前往『草稿碼』、『匯入程式庫』、『管理程式庫』之後就會出現程式庫管理員的畫面
- 在搜尋欄位裡面輸入『 MPU6050 』關鍵字,往下找會有一個名為 MPU6050_light 的標題, 由 rfetick 所撰寫,安裝時版本為 1.2.1 版。按下安裝即可。
- 安裝完畢請關閉程式庫管理員的畫面。
- 由『檔案』、『範例』找到最下方的『MPU6050_light』之後,開啟 GetAllData 範例檔。
其他功能請自行上網找 arduino 官網提供的 MPU6050-light 函式庫內容說明。
5.5: 參考資料
- 光敏電阻連接示意:https://blog.jmaker.com.tw/arduino-photoresistor/
- 使用 DHT11 的簡單連線:https://shop.mirotek.com.tw/arduino/start/arduino-start-13/
- 繼電器的購物網:https://www.taiwaniot.com.tw/product/arduino-1路繼電器模組-5v-高低電平觸發可調/
- 繼電器的使用:https://blog.jmaker.com.tw/arduino-relay/
- 三軸陀螺儀:https://atceiling.blogspot.com/2019/09/arduino57mpu-6050-gy-521.html
- 三軸陀螺儀的原理與數據解析說明:https://www.796t.com/content/1507437608.html