arduino 官網 arduino uno

Arduino 物聯網應用 - 上課教材

動畫互動網頁程式設計 > 課程內容 > 第 05 章 - 感測器應用

第 05 章 - 感測器應用

上次更新日期 2022/10/19

上一個章節我們可以讀入可變電阻的監測數值,該數值可以代表電壓呢!也可以用來進行一些額外的處理。 這個章節,我們拿幾個簡單的感測器來偵測環境一下,包括光敏電阻、溫溼度計、繼電器等, 測量看看這些感測器的數據資料是否正確,以及搭配其他東西來應用看看。

學習目標:

  1. 使用光敏電阻
  2. 使用溫濕度計
  3. 使用繼電器
  4. 使用三軸加速器

5.1: 光敏電阻

我們上一章可以從類比腳位去取得來自某些物件所傳來的電壓值,並轉成 0~1023 之間的數字。目前許多的偵測器, 在 arduino 上面的應用也是差不多的樣式,就是將要偵測的資料,轉成電壓之後,再由 arduino 讀回,套用公式後, 就可以取得需要的數據值。

先來討論一個光敏電阻的玩意兒,光敏電阻顧名思義,就是跟光有關的電阻。一般來說,當光線越強, 光敏電阻內部的電流可以放大,亦即電阻值變小,因此有光線的情況底下,電壓的強度會增加。當沒有光線時, 電阻變大,電壓自然就比較小了。

光敏電阻同樣也需要一個電流迴路,因此需要有 5V 的供電以及接地。那光敏電阻只有兩隻腳,要如何偵測數據呢? 就是從接地的那一頭,同時接地也同時連接到類比腳位 (我們這裡習慣使用 A1 腳位)。也就是說,光敏電阻的兩隻腳放在麵包板的不同群祖上, 一隻群組只接 5V ,一隻群組則同時接 A1 與一般電阻,一般電阻在接往接地即可。

例題 5.1.1:取得光敏電阻的數據,程式檔名設為 code-light-1 即可
  1. 連線方式:
    • 光敏電阻一腳 -- Arduino 5V
    • 光敏電阻另一腳 -- ( Arduino A1, 電阻器一腳 )
    • 電阻器一腳 -- Arduino 接地
  2. 程式設計:
    • 在全域變數區,設定整數變數 light 為 1,預計拿來當 A1 腳位讀取
    • 在 setup() 函數內,指定 Serial.begin 為 9600
    • 在 loop() 函數內,指定 int val = analogRead(light),並將該數值印出到序列埠,然後延遲 1 秒鐘即可。
將程式編譯後燒錄到 arduino 上,然後將光敏電阻阻隔光線、用手機手電筒照射,就知道數據的變化了。

現在我們知道光敏電阻可以了解光線的強弱,那麼這樣實驗看看,如果光敏電阻的數值高於 300 時,就關閉 LED 燈, 如果低於 300 時,就打開 LED 燈,這樣該如何處理?

例題 5.1.2:以光敏電阻自動開/關 LED 燈,將原本的 code-light-1 另存成 code-light-2 即可
  1. 連線方式:
    • 光敏電阻跟 5.1.1 相同,不用更動
    • 增加一個 LED 單色燈,使用 D9 腳位
  2. 程式設計:
    • 增加全域變數 led,數值為整數 9
    • 在 setup() 函數內,使用 pinMode 設計 led 為 OUTPUT
    • 在 loop() 函數內,在取得光敏電阻數字後,判斷是否大於 300,若是,則關閉 LED,若否,則開啟 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!無論如何,都從這裡拿出來處理!)。只要你的設備連接是正確的, 那麼最終就能輸出正確的溫溼度計資料了!

例題 5.2.1:偵測環境中的溫濕度,直接使用 code-dht-1 來修改
  1. 連接方式:
    • 將 DHT11 的三隻腳,直接插入麵包板上,注意看針腳的項目為何
    • 根據上面的針腳,將 5V, 接地、 D2 的 arduino 連線連上即可
  2. 程式設計:
    • 直接使用 code-dht-1 即可
編譯後燒錄上傳,應該可以在 COM 上面看到溫濕度情況了!你可以手握感測器,看看溫度有沒有上升, 你可以對著感測器吹氣,看看濕度有沒有上升。

每一種感測器都有其處理的極限!以這款 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 秒鐘進行一次的情況!先來摸一下接線的方式:

例題 5.3.1:讓繼電器自己開關
  1. 開始連接-繼電器與 arduino 的訊號控制方式 (須 3 條公對公杜邦線):
    • 繼電器 DC+ -- 麵包板 -- arduino 5V 電源上
    • 繼電器 DC- -- 麵包板 -- arudino 的接地
    • 繼電器 IN -- 麵包板 -- arduino 的 D5 第 5 號訊號線上面
  2. 開始連接-繼電器與設備連接的方式 (須 2 條公對公杜邦線):
    • 繼電器 COM -- 麵包板 -- arduino 的 3.3V 上
    • 繼電器 NO -- 麵包板 -- 電阻器一端
    • 電阻器另一端 -- 麵包板 -- LED 燈正極
    • LED 燈負極 -- 麵包版 -- arduino 另一個接地上
  3. 將 arduino 接上 USB,你會發現繼電器的電源燈號亮了 (很亮!),記得此時只亮一顆燈,LED 燈預設是不亮的。
  4. IDE 程式撰寫,稱為 code-relay-1 即可!
    • 指定 sig 全域變數為整數,且為 5 號 (我們訊號線接到 D5 上)
    • setup 函數內,使用 pinMode 指定 5 號為 OUTPUT 模式
    • 在 loop 函數內,先用 digitalWrite(sig, HIGH) 讓燈亮,然後 delay 5 秒之後,再變成 LOW 關掉。
    編譯、上傳,看看執行的狀況。你的繼電器會有很大的聲音在做開/關的切換!那就是成功了。

上面的指令有點無厘頭~因為就一直開關而已。現在,讓我們來處理一下,用光敏電阻來判斷要不要開燈。 預設是不要開燈,當光敏電阻低於 300 時,就打開 LED 燈光。

例題 5.3.2:使用光敏電阻讓 LED 燈光自動開/關
  1. 開始連線
    • 光敏電阻一端 -- arduino 5V 已經在麵包板上
    • 光敏電阻另一端 -- 麵包板 -- A1 與電阻器
    • 電阻器力一端 -- DC- 的接地麵包板上
  2. 程式設計 code-relay=2
    • 全域變數新增一個 light 整數為 1 (A1 取得訊號)
    • 在 loop 函數內,使用 int val = analogRead(light),主要就是光敏電阻的電壓值,然後根據 val 是否大於 300, 若大於 300 則對 D5 做 LOW 的輸出,否則就對 D5 做 HIGH 的輸出即可。
編譯並上傳之後,嘗試遮住光敏電阻,應該就會發現到 LED 的開開關關了!如果覺得開關行為太頻繁,可以在每次處理之後延遲 3 秒, 這樣就不會太離譜!

上面單純只是讓大家知道繼電器怎麼使用,如果你想要使用 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 掃描一下裝置位址看看,要確定裝置沒問題,才有下一步啊!

例題 5.4.1: 連接三軸加速器
  1. 拿出你的三軸加速器,設備上面會有 GY-521 的小板子,上面有 8 個腳位,請先確認妥當。
  2. 將 GY-521 安插到不同排的麵包板上面
  3. 根據上面的說法,將 VCC, GND, SDA, SCL 連接到正確的 arduino 腳位上。
安插到 USB 上之後,三軸加速器的 LED 燈號就會亮起來!應該就有供電成功了。

完成連線之後,再來,讓我們掃描一下硬體位址吧!

例題 5.4.2: 掃描 I2C 裝置的存取位址,請先啟動 IDE 環境
  1. 從 IDE 的『檔案』、『範例』、『Wire』當中,取得『i2c_scanner』的範例資料。
  2. 直接編譯並上傳到 arduino 上
  3. 打開序列埠,你會發現類似如下的資料,那就是你的 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 模組來應用。

例題 5.4.3:安裝 MPU6050_light 模組,請先啟動 IDE 環境
  1. 前往『草稿碼』、『匯入程式庫』、『管理程式庫』之後就會出現程式庫管理員的畫面
  2. 在搜尋欄位裡面輸入『 MPU6050 』關鍵字,往下找會有一個名為 MPU6050_light 的標題, 由 rfetick 所撰寫,安裝時版本為 1.2.1 版。按下安裝即可。
  3. 安裝完畢請關閉程式庫管理員的畫面。
  4. 由『檔案』、『範例』找到最下方的『MPU6050_light』之後,開啟 GetAllData 範例檔。
燒錄正確沒問題之後,上傳到 arduino 上,打開終端界面,就可以看到溫度、ACCELERO, GYRO 等資料了! 稍微挪動一下麵包板,就會看到數據的變化了。

其他功能請自行上網找 arduino 官網提供的 MPU6050-light 函式庫內容說明。

5.5: 參考資料