SlideShare una empresa de Scribd logo
1 de 85
Descargar para leer sin conexión
電子工程系車用電子與資訊組
Arduino感測應用
吳錫修
sswu@nkut.edu.tw
Revised on July 16, 2018
光線感測、聲音感測、碰觸感測、溫濕度感測、IR
感測、超音波感測、PIR感測、RFID
Makeeachdaycount
 受光時,CdS硫化鎘內原本處於穩定狀態的電子受到激發成為自由電
子。所以光線越強,產生的自由電子也就愈多,電阻值就會變小
 5
光敏電阻
2
光線愈強,分壓輸出愈大
RCdS
R1 10KΩ
5V
Makeeachdaycount
 X ? Y : Z
 若X為true,執行Y,否則執行Z
 範例
if (analogRead(CDS) < threshold)
ledState = HIGH;
else
ledState = LOW;
上述程式碼可改寫如下:
ledState = (analogRead(CDS) < threshold)? HIGH : LOW;
三元運算子
3
Makeeachdaycount
 實驗目的
 熟用光敏電阻應用控制
 利用A0光敏電阻當作輸入裝置,當外界亮度小於臨界值時讓D12 LED亮,
否則讓LED亮燈號熄滅
 臨界值須依據現場環境調整
Lab 自動小夜燈 1/2
4
Makeeachdaycount
 參考程式
#define LED 2
#define CDS A0
bool ledState = LOW; //目前輸出腳位之狀態
int threshold = 600; //CDS亮度開關臨界值,視需要調整
int lightness;
void setup() {
pinMode(LED, OUTPUT);
pinMode(CDS, INPUT);
}
void loop() {
lightness = analogRead(CDS);
ledState = (lightness < threshold)? HIGH : LOW;
digitalWrite(LED, ledState);
}
Lab 自動小夜燈 2/2
5
Makeeachdaycount
 麥克風將聲波轉換為電子訊號
 動圈式麥克風(Dynamic Microphone)
 當聲波進入麥克風,振膜受到聲波的壓力而產生振
動,與振膜連接在⼀起的線圈則開始在磁場中移動
產生感應電流
聲音感測 1/2
6
 電容式麥克風(Condenser Microphone)
 當聲波進入麥克風,振動膜和基板之間的距離會隨著振動而改變電容值;
敏感度高,常見於錄音室使用
聲音
訊號輸出
感應磁鐡感應線圏
拾音薄膜
振動膜
電阻
電池
訊號輸出
基板
聲音
Makeeachdaycount
 麥克風輸出訊號很微弱,必須經過放大處理
 高通濾波器
1
2
1
2 3.14 68 0.1
≅ 23
 非反向放大器
1
100
1
101
聲音感測 2/2
7
100K
1K
68K
0.1uF
2.2K
MIC
LM358
+
-
3
2
8
4
1
5V
A0
負極與外殼相連
Makeeachdaycount
 實驗目的
 熟悉聲音感測電路原理
 熟用Serial Plotter工具驗證聲音感測輸出
Lab 聲音感測 1/2
8
Makeeachdaycount
 參考程式
#define MIC A2
void setup() {
pinMode(MIC, INPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(analogRead(MIC));
delay(10);
}
 選單命令Tools>Serial Plotter
Lab聲音感測 2/2
9
Makeeachdaycount
 市售聲音感測模組有三類,依應用需求選購合適的模組
 DO輸出:輸出HIGH或LOW
 SVR調整觸發準備
 AO輸出:輸出0~5V,對應音量大小
 AO輸出及DO輸出
聲音感測模組
10
Makeeachdaycount
 實驗目的
 熟用麥克風輸入控制 (注意:不同廠牌麥克風模組腳位排列不相同)
 使用A2 麥克風做為聲控開關控制D12 LED;拍手點亮LED,再拍手則熄滅
LED
 音量開關臨界值須依據現場環境調整調校
Lab 聲控開關 1/2
11
Makeeachdaycount
 參考程式
#define RED_LED 12
#define MIC A2
int threshold = 600; //音量開關臨界值
int normal = 100; //正常情況音量值
bool ledState = LOW; //目前輸出腳位之狀態
void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(MIC, INPUT);
}
void loop() {
if (analogRead(MIC) > threshold) { //聲音觸發
do { //等回復靜音
//do nothing
} while (analogRead(MIC) > normal);
ledState = !ledState; //切換輸出狀態
digitalWrite(RED_LED, ledState);
}
}
Lab 聲控開關 2/2
12
Makeeachdaycount
 Capacitive sensor利用電路等效電容變化做為近接感測
 當手指碰觸感應端,人體等效電容與電路電容形成並聯,使總電容量
增加
 TO-18或TO-39鐡殼封裝的電晶體,集極椄腳與鐡殼相通,非常適合
做為電容式近接開關的感應端
電容式近接感測原理 1/2
13
集極與外殼相連
Makeeachdaycount
 方波經過RC電路再經TTL準位轉換,會產生延遲;C愈大(手指碰觸感
測器時),延遲情況愈明顯
電容式近接感測原理 2/2
14
VS VC
VS
VC
VC(TTL)
1
Vm
TTL輸入電壓準位:Hi輸入電壓:2.0V以上,Low輸入電壓:0.8V以下
Makeeachdaycount
 安裝
CapacitiveSensor函式庫 1/4
15
Makeeachdaycount
 CapacitiveSensor藉由量測Send pin與Receive Pin之間狀態切換之
延遲情形,提供⼀個相對數值,
 CapacitiveSensor類別方法
 CapacitiveSensor(byte sendPin, byte receivePin)
 建構CapacitiveSensor物件
 sendPin輸出檢測訊號之接腳
 receivePin讀取觸控訊號之接腳
 電阻R建議值1MΩ~10MΩ,receivePin連接100pF電容接地可增加檢測
穩定性
CapacitiveSensor函式庫 2/4
16
Makeeachdaycount
 long capacitiveSensorRaw(byte samples)
 傳回總感應電容對應值
 samples取樣數,較大值分辦率較佳但會降低程式效能;建議值30
 long capacitiveSensor(byte samples)
 傳回感應電容變化對應值 (總感應電容對應值 – 基準感應電容對應值)
 samples取樣數,較大值分辦率較佳但會降低程式效能;建議值30
 void set_CS_Timeout_Millis(unsigned long timeout_millis)
 設定量測逾時時間,預設為2000毫秒 (2秒)。發射端 (Send pin) 訊號準
位變換後,會開始檢測感應端 (Receive pin) 訊號何時跟隨變化,在檢
測期間,其它程式會暫停運作,所以必須設定逾時時間
CapacitiveSensor函式庫 3/4
17
Makeeachdaycount
 void reset_CS_AutoCal()
 立即校正capacitiveSensor函式的感應電容基準值
 void set_CS_AutocaL_Millis(unsigned long autoCal_millis)
 設定自動校正capacitiveSensor函式的基準感應電容值的時間間隔,設
定為0xFFFFFFFF可關閉自動校正功能
CapacitiveSensor函式庫 4/4
18
Makeeachdaycount
 實驗目的
 熟用CapacitiveSensor函式庫,測試觸控開關感應值
 開啟Serial Monitor觀察手指碰觸輸出結果
Lab 電容式近接感應值測試 1/3
19
foil
tape
Makeeachdaycount
 參考程式
#include <CapacitiveSensor.h> //引用CapacitiveSensor函式庫
CapacitiveSensor cs = CapacitiveSensor(2,3); //建構CapacitiveSensor物件
void setup() {
cs.reset_CS_AutoCal(); //校正感應電容基準值
cs.set_CS_AutocaL_Millis(180000); //每隔3分鐘自動校正感應電容基準值
Serial.begin(9600);
}
void loop() {
Serial.print(cs.capacitiveSensorRaw(30)); //讀取總感應電容值
Serial.print("t");
Serial.println(cs.capacitiveSensor(30)); //讀取感應電容變化值
delay(100);
}
Lab 電容式近接感應值測試 2/3
20
Makeeachdaycount
Lab 電容式近接感應值測試 3/3
21
手指碰觸感應端時
Makeeachdaycount
 實驗目的
 使用CapacitiveSensor做為觸控開關控制LED
 需調整開關臨界值
Lab 電容式近接開關 1/3
22
foil
tape
Makeeachdaycount
 參考程式
#include <CapacitiveSensor.h> //引用CapacitiveSensor函式庫
#define LED 4
int threshold = 1000;
bool ledstate = LOW;
int cs_value;
CapacitiveSensor cs = CapacitiveSensor(2,3); //建構CapacitiveSensor物件
void setup() {
pinMode(LED, OUTPUT);
cs.reset_CS_AutoCal(); //校正感應電容基準值
Serial.begin(9600);
}
Lab 電容式近接開關 2/3
23
Makeeachdaycount
void loop() {
cs_value=cs.capacitiveSensor(30);
Serial.println(cs_value);
if (cs_value > threshold) { //碰觸感應端
ledstate = !ledstate;
digitalWrite(LED, ledstate);
while (cs_value > threshold) { //等待放開
cs_value=cs.capacitiveSensor(30);
delay (10);
Serial.println(cs_value);
}
}
delay(100);
}
Lab 電容式近接開關 3/3
24
Makeeachdaycount
 GND接地,VCC為供電電源,SIG為數字信號輸出腳
 點動型:初態為低電位,觸摸為高電位
電容式觸摸感測器模組
25
Makeeachdaycount
Lab 觸控開關 1/2
26
 實驗目的
 觸控開關控制LED
Makeeachdaycount
 參考程式
#define RED_LED 3
#define TOUCHPAD 2
bool ledState = LOW;
void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(TOUCHPAD, INPUT);
}
void loop() {
if (digitalRead(TOUCHPAD)==HIGH) { //碰觸感應端
ledState = !ledState;
digitalWrite(RED_LED, ledState);
do {
} while (digitalRead(TOUCHPAD)==HIGH); //等待放開
}
}
Lab 觸控開關 2/2
27
Makeeachdaycount
 紅外線 (infrared,IR)波⻑在770nm至1000nm之間,而人眼可感知
的電磁波波⻑在400nm到700nm之間,所以紅外線屬於不可見光
 ⼀般家電遙控器使用波⻑940nm紅外線LED,載波最常見的是36kHz
或38kHz
 IR接收器
紅外線LED 1/2
28
VCC
GND
OUT IR Receiver
Makeeachdaycount
 IR發射器
 紅外線LED外觀與⼀般LED幾乎⼀樣
 驅動電路
紅外線LED 2/2
29
GPIO
10kΩ
220ΩIR LED
3904
5V
IR Transmitter
2N3904或2N2222
Makeeachdaycount
 家電廠商都會為旗下的紅外線遙控產品制定專屬的協定,所以A廠牌
的遙控器是不能控制B廠牌的家電
 Philips RC-5 Protocol
 https://www.sbprojects.net/knowledge/ir/rc5.php
紅外線傳輸協定
30
Makeeachdaycount
 下載IRRemote程式庫
 https://github.com/z3t0/Arduino-IRremote
 選單命令Sketch> Include Library> Add ZIP Library…安裝IRRemote
程式庫
IRRemote程式庫 1/2
31
Makeeachdaycount
 IRRemote程式庫內設計IRrecv類別及IRsend類別,分別提供IR接收及
傳送功能
 IRrecv類別方法
 IRrecv (int recvpin)
 recvpin 連接到紅外線接收器OUT端之接腳
 IRrecv (int recvpin, int blinkpin)
 recvpin 連接到紅外線接收器OUT端之接腳
 blinkpin 連接到接收指示燈之接腳
 void blink13 (int blinkflag)
 blinkflag 設為true表示啟用接收指示功能,每次接收到紅外線訊號
會使blinkpin閃燈;false表示停用接收指示燈
IRRemote程式庫 1/4
32
Makeeachdaycount
 int decode (decode_results *results)
 嘗試解碼所接收到的紅外線訊息並儲存到results結構變數,成功的話回
傳true,否則傳回false
 void enableIRIn()
 啟用IR接收
 void resume()
 重新啟用IR接收
IRRemote程式庫 2/4
33
Makeeachdaycount
 decode()函式會將接收資料解碼存入decode_results結構變數
class decode_results{
public:
decode_type_t decode_type; //UNKNOWN, NEC, SONY, RC5, ...
unsigned int address; //Used by Panasonic & Sharp [16-bits]
unsigned long value; //Decoded value [max 32-bits]
int bits; //Number of bits in decoded value
volatile unsigned int *rawbuf; //Raw intervals in 50uS ticks
int rawlen; //Number of records in rawbuf
int overflow; //true iff IR raw code too long
};
其中decode_type_t是在IRremote.h檔案中宣告的列舉資料
typedef enum {
UNKNOWN = -1, UNUSED = 0, RC5, RC6, NEC, SONY, PANASONIC, JVC, SAMSUNG, WHYNTER,
AIWA_RC_T501, LG, SANYO, MITSUBISHI, DISH, SHARP, DENON, PRONTO, LEGO_PF,
} decode_type_t;
IRRemote程式庫 3/4
34
Makeeachdaycount
 IRsend類別方法
 IRsend()
 預設使用D3連接到紅外線發射器
 void sendWhynter (unsigned long data, int nbits)
 data 要傳送之資料值
 nbits 傳送的資料值所佔位元數
 針對其它廠牌紅外線傳輸協定,還有sendNEC()、 sendSony()、
sendRC5()、 sendRC6()、 sendSharpRaw()、 sendJVC()、
sendSAMSUNG()等方法,方法參數用法相同
 如果IRrecv無法正確解碼所接收到的紅外線訊息,可更換不同的紅外線
傳輸協定方法試試
IRRemote程式庫 4/4
35
Makeeachdaycount
 實驗目的
 讀取IR遙控器傳送之控制碼並顯示到Serial Monitor
 記錄IR遙控器按鍵0與1相對應的控制碼
Lab IR遙控器訊號測試 1/3
36
Makeeachdaycount
 參考程式
#include <IRremote.h> //引用IRRemote函式庫
const byte irReceiverPin = 2; //紅外線接收器OUTPUT訊號接在D2
const byte LED = 4; //D4接指示燈
IRrecv irrecv(irReceiverPin, LED); //建立IRrecv物件來接收紅外線訊號
decode_results ir_results; //用來儲存解碼結果之decode_results結構變數
void setup() {
irrecv.blink13(true); //啟用接收指示
Serial.begin(9600);
irrecv.enableIRIn(); //啟動IR接收
}
Lab IR遙控器訊號測試 2/3
37
Makeeachdaycount
void loop() {
if (irrecv.decode(&ir_results)) { //解碼成功,收到⼀組紅外線訊號
Serial.println(ir_results.value, HEX); //紅外線控制碼
irrecv.resume(); //繼續收下⼀組紅外線訊號
}
delay(100);
}
Lab IR遙控器訊號測試 3/3
38
Makeeachdaycount
 實驗目的
 熟悉IR遙控程式設計
 按下IR遙控器按鍵1開啟LED,按下IR遙控器按鍵0關閉LED
Lab IR遙控LED 1/3
39
Makeeachdaycount
 參考程式
#include <IRremote.h> //引用IRRemote函式庫
const byte irReceiverPin = 2; //紅外線接收器OUTPUT訊號接在D2
const byte LED = 4; //D4接指示燈
IRrecv irrecv(irReceiverPin); //建立IRrecv物件來接收紅外線訊號
decode_results ir_results; //用來儲存解碼結果之decode_results結構變數
void setup() {
pinMode(LED, OUTPUT); //啟用接收指示
Serial.begin(9600);
irrecv.enableIRIn(); //啟動IR接收
}
Lab IR遙控LED 2/3
40
Makeeachdaycount
void loop() {
if (irrecv.decode(&ir_results)) { //解碼成功,收到⼀組紅外線訊號
switch (ir_results.value) {
case 0xFF6897: //按鍵0控制碼,須依遙控器實測結果調整
digitalWrite(LED, LOW);
break;
case 0xFF30CF: //按鍵1控制碼,須依遙控器實測結果調整
digitalWrite(LED, HIGH);
break;
}
Serial.println(ir_results.value, HEX); //紅外線控制碼
irrecv.resume(); //繼續收下⼀組紅外線訊號
}
delay(100);
}
Lab IR遙控LED 3/3
41
Makeeachdaycount
 實驗目的
 熟悉IR資料送收,讓二套Arduino透過IR送收資料
 Arduino A按下按鈕時透過IR傳送控制碼給Arduino B
Lab IR傳輸應用 1/6
42
Arduino A
Makeeachdaycount
 Arduino B收到控制碼後控制LED On/Off
Lab IR傳輸應用 2/6
43
Arduino B
Makeeachdaycount
 Arduino A參考程式
#include <IRremote.h> //引用IRRemote函式庫
const byte SW = 5;
IRsend irsend; //建立IRsend物件來傳送紅外線訊號 (使用D3)
bool lastState = HIGH; //前⼀次開關腳位之狀態
bool ledState = LOW; //LED輸出狀態
byte click = 0;
void setup() {
pinMode(SW, INPUT_PULLUP);
Serial.begin(9600);
}
Lab IR傳輸應用 3/6
44
Makeeachdaycount
void loop() {
bool b1 = digitalRead(SW); //讀取開關目前狀態
if (b1 != lastState) { //開關狀態改變
delay(20); //防彈跳
if (b1 == digitalRead(SW)) { //再次確認開關狀態
lastState = b1;
click++;
}
}
if (click == 2){ //已Click開關
click = 0;
Serial.println("IR send");
irsend.sendRC5(0xA0A0A0, 24); //IR送出控制碼
}
delay(100);
}
Lab IR傳輸應用 4/6
45
Makeeachdaycount
 Arduino B參考程式
#include <IRremote.h> //引用IRRemote函式庫
const byte irReceiverPin = 2; //紅外線接收器OUTPUT訊號接在D3
const byte LED = 4; //D4接指示燈
IRrecv irrecv(irReceiverPin); //建立IRrecv物件來接收紅外線訊號
decode_results ir_results; //用來儲存解碼結果之decode_results結構變數
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); //啟動紅外線解碼
}
Lab IR傳輸應用 5/6
46
Makeeachdaycount
void loop() {
if (irrecv.decode(&ir_results)) { //解碼成功,收到⼀組紅外線訊號
switch (ir_results.value) {
case 0xA0A0A0: //收到正確的控制碼
ledState = !ledState;
digitalWrite(LED, ledState);
break;
}
Serial.println(ir_results.value, HEX);
irrecv.resume(); //繼續收下⼀組紅外線訊號
}
delay(100);
}
Lab IR傳輸應用 6/6
47
Makeeachdaycount
 SPI介面
 溫度解析度:0.0625°C
TC77溫度感測器 1/2
48
Makeeachdaycount
 Temperature Read Timing Diagram
 供電後bit 2為0,完成溫度轉換後bit 2為1
 bit 1與bit 0不使用 (DON'T CARES)
 溫度值為13位元
TC77溫度感測器 2/2
49
Makeeachdaycount
 實驗目的
 熟用TC77感測器量測溫度值
 每5秒讀取溫濕度值並輸出到Serial monitor
Lab 溫度感測 1/4
50
TC77
Makeeachdaycount
 byte incoming = shiftIn(dataPin, clockPin, bitOrder);
 從dataPin腳位讀取位元資料,讀取8位元後存入incoming變數中
 clockPin為送出觸發讀取信號之腳位
 bitOrder指定位元資料讀取順序,MSBFIRST或LSBFIRST
 範例
#define TC77_SIO 11
#define TC77_SCK 12
...
val1 = shiftIn(TC77_SIO, TC77_SCK, MSBFIRST);
Lab 溫度感測 2/4
51
Makeeachdaycount
 參考程式
#define TC77_SIO 11
#define TC77_SCK 12
#define TC77_CS 13
int value;
float tempC, tempF;
void setup() {
pinMode(TC77_CS, OUTPUT);
pinMode(TC77_SIO, INPUT);
pinMode(TC77_SCK, OUTPUT);
Serial.begin(9600);
}
Lab 溫度感測 3/4
52
Makeeachdaycount
void loop() {
byte val1, val2;
digitalWrite(TC77_CS, LOW); //設定CS為LOW,準備讀取資料
val1 = shiftIn(TC77_SIO, TC77_SCK, MSBFIRST); //讀取high byte
val2 = shiftIn(TC77_SIO, TC77_SCK, MSBFIRST); //讀取low byte
digitalWrite(TC77_CS, HIGH); //完成讀取,CS回復為HIGH
value = val1*256 + val2;
tempC = (value>>3) * 0.0625; //去除最低3位元後轉換為10進制溫度值
tempF = tempC * 1.8 + 32; //換算華氏溫度值
Serial.print("Temperature:");
Serial.println(tempC, 2);
delay (5000);
}
Lab 溫度感測 4/4
53
Makeeachdaycount
 DHT11是⼀款簡易的數位溫濕度感測器
 量測範圍:20~90%RH,0~50℃
 準確度:25℃時,±5%RH ±2℃
 工作電壓:3.5V~5.5V
DHT11溫濕度感測器 1/2
54
VCC
DATA
GND
Makeeachdaycount
 資料格式
DHT11溫濕度感測器 2/2
55
>18ms 80us 50us
Makeeachdaycount
 選單命令Sketch>Include Library>Manage Libraries…
 安裝DHT sensor library by Adafruit Version 1.2.3
Arduino DHT函式庫
56
Makeeachdaycount
 實驗目的
 熟用DTH11感測器量測溫濕度
 每10秒讀取溫濕度值並輸出到Serial monitor
Lab 溫濕度感測 1/3
57
Makeeachdaycount
 參考程式
#include <DHT.h> //引用IRRemote函式庫
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE, 0);
void setup() {
pinMode(DHTPIN, INPUT);
Serial.begin(9600);
dht.begin();
}
Lab 溫濕度感測 2/3
58
Makeeachdaycount
void loop() {
float h = dht.readHumidity(); //讀取濕度值
float t = dht.readTemperature(); //讀取溫度值
Serial.print("Humidity: ");
Serial.print(h, 1); //顯示溫度值 (小數點1位)
Serial.print("%t Temperature: ");
Serial.print(t, 1); //顯示濕度值 (小數點1位)
Serial.println("C");
delay(10000);
}
Lab 溫濕度感測 3/3
59
Makeeachdaycount
 超音波 (ultrasound) 是指任何頻率超過人類耳朵可以聽到的最高閾值
20KHz之聲波或振動
 音速 = 331.31 1
.
 在⼀大氣壓、25°C時音波在空氣中之波速約為 346m/s
 蝙蝠利用生物聲納 (biosonar) 回音定位 (echolocation) 來捕捉獵物或
躲避障礙物
超音波測距原理 1/2
60
Emitted Wave of Bat
Reflected Wave of Prey
Makeeachdaycount
 距離 = 音速*發射超音波至接收到反射波之時間/2
 duration(us) * 0.0346(cm/us) / 2;
超音波測距原理 2/2
61
Makeeachdaycount
 HC-SR04
 精度:3mm
 距離範圍:2cm ~ 450cm
 有效的角度:<15℃
 觸發輸入信號:10uS TTL pulse
超音波感測器 1/2
62
Signal
Internal
Initiate Echo back
10uS TTL to trigger pin
Pulse width corresponds to distance
(about 150uS-25mS, 38mS if no obstacle)
Formula:
pulse width (uS) * 0.0346 (cm/uS) / 2
Ultrasonic Transducer will issue 8 40kHz pulse
Makeeachdaycount
 duration = pulseIn(pin, value);
 duration = pulseIn(pin, value, timeout);
檢測脈波寛度,工作範圍10 us~3 minutes
 pin:信號接腳
 value:要偵測的脈波類型,HIGH或LOW
 timeout:等待脈波起始之時間(us),預設為1秒
 回傳值表示脈波寬度 (單位us),0表示timeout前沒有脈波起始
超音波感測器 2/2
63
Makeeachdaycount
 實驗目的
 熟用HC-SR04超音波感測器
 每3秒使用超音波測量距離 (cm),小數點第1位
Lab 超音波測距 1/3
64
Makeeachdaycount
 參考程式
#define TRIG 6
#define ECHO 5
long duration;
int distance;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
Serial.begin(9600);
}
Lab 超音波測距 2/3
65
Makeeachdaycount
void loop() {
digitalWrite(TRIG, LOW); //Clears the trig pin
delayMicroseconds(2);
digitalWrite(TRIG, HIGH); //從Trig送出10 us脈波
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH); //讀取Echo脈波寬度(us)
distance= duration * 0.0346 / 2; //換算為距離(cm)
Serial.print("Distance: "); //在Serial Monitor顯示距離值
Serial.print(distance, 1);
Serial.println(" cm");
delay(3000);
}
Lab 超音波測距 3/3
66
Makeeachdaycount
 人體都有恒定體溫 (約37度),會發出特定波⻑10um左右的紅外線
 被動式紅外線感測器就是靠探測人體發射的10um左右的紅外線而進
行工作的
PIR感測器 1/2
67
Fresnel Lens
PIR (Passive Infra-Red) sensor
Pyroelectric sensor
Makeeachdaycount
 感應角度小於120°
 最大距離7m
PIR感測器 2/2
68
VCC
GND
OUT
Delay Time Adjust
Distance Adjust
Repeat Trigger
Single Trigger
Makeeachdaycount
Lab PIR人體移動感測 1/2
69
Makeeachdaycount
 參考程式
#define PIRSensor 8
#define LED 12
void setup() {
pinMode(PIRSensor, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
int sensorValue = digitalRead(PIRSensor);
if (sensorValue == HIGH)
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
}
Lab PIR人體移動感測 2/2
70
Makeeachdaycount
 RFID是Radio Frequency Identification的縮寫
 RFID系統由感應器(Reader)和RFID標籤(Tag)所組成,利用感應器發
射無線電波,觸動感應範圍內的RFID標籤,藉由電磁感應產生電流,
供應RFID標籤上的晶片運作並發出電磁波回應感應器
 RFID標籤可分為主動式及被動式
 被動式標籤本身沒有電池裝置,所需電流全靠感應器的無線電波電磁感應
產生,所以只有在接收到感應器發出的訊號才會被動的回應感應器
 主動式的標籤內置有電池,可以主動傳送訊號供感應器讀取,訊號傳送範
圍也較廣
RFID系統
71
Makeeachdaycount
 選單命令Sketch>Include Library>Manage Libraries…
安裝MFRC522 Library
72
Makeeachdaycount
 9接Reset (RST),10接Slave select (SS),11接Master-out slave-in
(MOSI),12接Master-in slave-out (MISO),13接Serial Clock (SCK)
Arduino Uno接線
73
Arduino Uno
pin 10
pin 13
pin 11
pin 12
GND
pin9
3.3V
Makeeachdaycount
 MFRC522物件.PCD_Init()
 初始化MFRC522讀卡機模組
 MFRC522物件.PICC_IsNewCardPresent()
 是否感應到新的卡片
 MFRC522物件.PICC_ReadCardSerial()
 讀取卡片的資料
 MFRC522物件.PICC_GetType()
 取得卡片類型
 MFRC522物件.PICC_GetTypeName()
 取得卡片類型名稱
MFRC522函式 1/2
74
Makeeachdaycount
 每張Mifare卡片都有唯⼀的ID (unique identifier,簡稱UID),UID的⻑
度和內容,可從底下兩個屬性取得:
 MFRC522物件.uid.size:UID的⻑度
 MFRC522物件.uid.uidByte:UID碼的陣列
MFRC522函式 2/2
75
Makeeachdaycount
 參考程式
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); //建構MFRC522物件
void setup() {
Serial.begin(9600);
SPI.begin(); //初始化SPI bus
mfrc522.PCD_Init(); //初始化MFRC522
Serial.println("Scan PICC to see UID and type...");
}
Lab 讀取RFID卡片資料 1/3
76
Makeeachdaycount
void loop() {
//確認是否有新卡片
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
byte *id = mfrc522.uid.uidByte; //取得卡片的UID
byte idSize = mfrc522.uid.size; //取得UID的⻑度
Serial.print("PICC type: "); //顯示卡片類型
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
Serial.print("UID: "); //顯示卡片的UID
for (byte i = 0; i < idSize; i++) {
Serial.print(id[i], HEX); //以16進位顯示UID值
Serial.print(" ");
}
Serial.println();
mfrc522.PICC_HaltA(); //讓卡片進入停止模式
}
}
Lab 讀取RFID卡片資料 2/3
77
Makeeachdaycount
Lab 讀取RFID卡片資料 3/3
78
Makeeachdaycount
 實驗目的
 熟用Mifare RFID-RC522應用
 讀取正確的RFID卡時
 驅動Servo為開鎖狀態,亮綠色LED
 3秒後Servo回復為關鎖狀態,LED OFF
 讀取錯誤的RFID卡時
 亮紅色LED
 3秒後LED OFF
Lab RFID門禁控制 1/6
79
Makeeachdaycount
Lab RFID門禁控制 1/5
80
Makeeachdaycount
 參考程式
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
#define LED_ALARM 2
#define LED_UNLOCK 3
#define SERVO 5
MFRC522 mfrc522(SS_PIN, RST_PIN); //建立MFRC522物件
Servo servo; //建立Servo物件,模擬開關的切換狀態
int cards[][4] = {{0xA3,0x3E,0x82,0xCB}, {0xD0,0xF3,0xBD,0x4E}};
bool access = false;
bool lockerSwitch = true; //開關狀態,預設為「關」
Lab RFID門禁控制 2/5
81
Makeeachdaycount
void locker(bool lock) {
if (lock) servo.write(90); //關鎖
else servo.write(10); //開鎖
delay(15); //等伺服馬達轉到定位
}
void reset(){
digitalWrite(LED_UNLOCK, LOW);
digitalWrite(LED_ALARM, LOW);
lockerSwitch = true;
locker(lockerSwitch);
}
Lab RFID門禁控制 3/5
82
Makeeachdaycount
void setup() {
pinMode(LED_ALARM, OUTPUT);
pinMode(LED_UNLOCK, OUTPUT);
pinMode(SERVO, OUTPUT);
servo.attach(SERVO);
SPI.begin(); //初始化SPI bus
mfrc522.PCD_Init(); //初始化MFRC522
reset();
}
Lab RFID門禁控制 4/5
83
Makeeachdaycount
void loop() {
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
byte *id = mfrc522.uid.uidByte; //取得卡片的UID
byte idSize = mfrc522.uid.size; //取得UID的⻑度
for (byte i = 0; i < idSize; i++) {
Serial.print(id[i], HEX); //以16進位顯示UID值
Serial.print(" ");
}
Serial.println();
for(int x = 0; x < sizeof(cards); x++) {
access = true;
for(int i = 0; i < idSize; i++ ) {
if(id[i] != cards[x][i]) { //卡片錯誤,繼續比對下⼀張
access = false;
break;
}
}
if(access) break; //找到正確卡片,結束比對
}
Lab RFID門禁控制 5/5
84
Makeeachdaycount
mfrc522.PICC_HaltA(); //讓卡片進入停止模式
if (access && lockerSwitch) {
lockerSwitch = false;
locker(lockerSwitch);
}
digitalWrite(LED_UNLOCK, access);
digitalWrite(LED_ALARM, !access);
delay(3000);
reset();
}
}
Lab RFID門禁控制 3/3
85

Más contenido relacionado

La actualidad más candente

Node RED で実現する製造業の DX
Node RED で実現する製造業の DXNode RED で実現する製造業の DX
Node RED で実現する製造業の DX
雅治 新澤
 

La actualidad más candente (20)

ゆるバグ
ゆるバグゆるバグ
ゆるバグ
 
論文口試簡報製作技巧
論文口試簡報製作技巧論文口試簡報製作技巧
論文口試簡報製作技巧
 
5. 心律調節器
5. 心律調節器5. 心律調節器
5. 心律調節器
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
Python與Ardinio整合應用
Python與Ardinio整合應用Python與Ardinio整合應用
Python與Ardinio整合應用
 
Arduino程式除錯
Arduino程式除錯Arduino程式除錯
Arduino程式除錯
 
大学でC言語をはじめて触る人へ
大学でC言語をはじめて触る人へ大学でC言語をはじめて触る人へ
大学でC言語をはじめて触る人へ
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
 
資料結構-20個經典題型
資料結構-20個經典題型資料結構-20個經典題型
資料結構-20個經典題型
 
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術についてAIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
 
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
Node RED で実現する製造業の DX
Node RED で実現する製造業の DXNode RED で実現する製造業の DX
Node RED で実現する製造業の DX
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
携帯SoCでの画像処理とHalide
携帯SoCでの画像処理とHalide携帯SoCでの画像処理とHalide
携帯SoCでの画像処理とHalide
 
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2
 
論文口試
論文口試論文口試
論文口試
 
東京工業大学「ロボット技術・ロボットミドルウェア」
東京工業大学「ロボット技術・ロボットミドルウェア」東京工業大学「ロボット技術・ロボットミドルウェア」
東京工業大学「ロボット技術・ロボットミドルウェア」
 
Junior新趨勢:P2P支付
Junior新趨勢:P2P支付Junior新趨勢:P2P支付
Junior新趨勢:P2P支付
 
骨質疏鬆衛教檔案
骨質疏鬆衛教檔案骨質疏鬆衛教檔案
骨質疏鬆衛教檔案
 

Similar a Arduino感測應用

RoBoard 與 Lego NXT Sensors 之連接
RoBoard 與 Lego NXT Sensors 之連接RoBoard 與 Lego NXT Sensors 之連接
RoBoard 與 Lego NXT Sensors 之連接
roboard
 
基于嵌入式系统的Avs P10编码系统设计
基于嵌入式系统的Avs P10编码系统设计基于嵌入式系统的Avs P10编码系统设计
基于嵌入式系统的Avs P10编码系统设计
Hengyi
 
Ad9850 mc145151
Ad9850 mc145151Ad9850 mc145151
Ad9850 mc145151
kcarring
 
智慧家庭 簡報
智慧家庭 簡報智慧家庭 簡報
智慧家庭 簡報
艾鍗科技
 
Pdf unspecified 865330
Pdf unspecified 865330Pdf unspecified 865330
Pdf unspecified 865330
Dante Lupu
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)
FLASH开发者交流会
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
Shanda innovation institute
 

Similar a Arduino感測應用 (20)

RoBoard 與 Lego NXT Sensors 之連接
RoBoard 與 Lego NXT Sensors 之連接RoBoard 與 Lego NXT Sensors 之連接
RoBoard 與 Lego NXT Sensors 之連接
 
嵌入式inux應用專題文件-智慧家庭系統
嵌入式inux應用專題文件-智慧家庭系統嵌入式inux應用專題文件-智慧家庭系統
嵌入式inux應用專題文件-智慧家庭系統
 
(通讯协议)G485_V11(编辑版本-E12).pdf
(通讯协议)G485_V11(编辑版本-E12).pdf(通讯协议)G485_V11(编辑版本-E12).pdf
(通讯协议)G485_V11(编辑版本-E12).pdf
 
S3c2410a 16adc
S3c2410a 16adcS3c2410a 16adc
S3c2410a 16adc
 
基于嵌入式系统的Avs P10编码系统设计
基于嵌入式系统的Avs P10编码系统设计基于嵌入式系统的Avs P10编码系统设计
基于嵌入式系统的Avs P10编码系统设计
 
Ad9850 mc145151
Ad9850 mc145151Ad9850 mc145151
Ad9850 mc145151
 
智慧家庭 簡報
智慧家庭 簡報智慧家庭 簡報
智慧家庭 簡報
 
Digital Passband Communication
Digital Passband CommunicationDigital Passband Communication
Digital Passband Communication
 
181201_CoAP_coding365
181201_CoAP_coding365181201_CoAP_coding365
181201_CoAP_coding365
 
[智慧創新應用自造松]LPWAN]技術現況與應用實務
[智慧創新應用自造松]LPWAN]技術現況與應用實務[智慧創新應用自造松]LPWAN]技術現況與應用實務
[智慧創新應用自造松]LPWAN]技術現況與應用實務
 
12022.10.14.pdf
12022.10.14.pdf12022.10.14.pdf
12022.10.14.pdf
 
Arduino 習作工坊 - Lesson 4 通訊之夜
Arduino 習作工坊 -  Lesson 4 通訊之夜Arduino 習作工坊 -  Lesson 4 通訊之夜
Arduino 習作工坊 - Lesson 4 通訊之夜
 
Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門
 
Pdf unspecified 865330
Pdf unspecified 865330Pdf unspecified 865330
Pdf unspecified 865330
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
 
Argox as 9500-hd_2d條碼掃描器dm
Argox as 9500-hd_2d條碼掃描器dmArgox as 9500-hd_2d條碼掃描器dm
Argox as 9500-hd_2d條碼掃描器dm
 
Plc4
Plc4Plc4
Plc4
 
(4)0407 0101 半被動式射頻辨識rfid溫度感測標籤
(4)0407 0101 半被動式射頻辨識rfid溫度感測標籤(4)0407 0101 半被動式射頻辨識rfid溫度感測標籤
(4)0407 0101 半被動式射頻辨識rfid溫度感測標籤
 
Godson x86
Godson x86Godson x86
Godson x86
 

Más de 吳錫修 (ShyiShiou Wu)

Más de 吳錫修 (ShyiShiou Wu) (20)

Vuforia AR影片程式設計
Vuforia AR影片程式設計Vuforia AR影片程式設計
Vuforia AR影片程式設計
 
micro:bit亮度感測應用
micro:bit亮度感測應用micro:bit亮度感測應用
micro:bit亮度感測應用
 
Vuforia AR 同時追踨多張辨識圖
Vuforia AR同時追踨多張辨識圖Vuforia AR同時追踨多張辨識圖
Vuforia AR 同時追踨多張辨識圖
 
micro:bit開關控制應用
micro:bit開關控制應用micro:bit開關控制應用
micro:bit開關控制應用
 
Vuforia AR 應用程式設計入門
Vuforia AR應用程式設計入門Vuforia AR應用程式設計入門
Vuforia AR 應用程式設計入門
 
Vuforia AR 應用程式準備作業
Vuforia AR應用程式準備作業Vuforia AR應用程式準備作業
Vuforia AR 應用程式準備作業
 
micro:bit LED顯示控制
micro:bit LED顯示控制micro:bit LED顯示控制
micro:bit LED顯示控制
 
IDE for micro:bit
IDE for micro:bitIDE for micro:bit
IDE for micro:bit
 
Microbit 1 introduction
Microbit 1 introductionMicrobit 1 introduction
Microbit 1 introduction
 
Arduino overview
Arduino overviewArduino overview
Arduino overview
 
使用Makeblock App學習mBot程式設計
使用Makeblock App學習mBot程式設計使用Makeblock App學習mBot程式設計
使用Makeblock App學習mBot程式設計
 
使用M部落App學習mBot程式設計
使用M部落App學習mBot程式設計使用M部落App學習mBot程式設計
使用M部落App學習mBot程式設計
 
nodeMCU IOT教學03 - NodeMCU導論
nodeMCU IOT教學03 - NodeMCU導論nodeMCU IOT教學03 - NodeMCU導論
nodeMCU IOT教學03 - NodeMCU導論
 
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
 
Unity遊戲程式設計 - 2D Platformer遊戲
Unity遊戲程式設計 - 2D Platformer遊戲Unity遊戲程式設計 - 2D Platformer遊戲
Unity遊戲程式設計 - 2D Platformer遊戲
 
Unity遊戲程式設計 - 2D移動與碰撞處理II
Unity遊戲程式設計 - 2D移動與碰撞處理IIUnity遊戲程式設計 - 2D移動與碰撞處理II
Unity遊戲程式設計 - 2D移動與碰撞處理II
 
Unity遊戲程式設計 - 2D運動與碰撞處理I
Unity遊戲程式設計 - 2D運動與碰撞處理IUnity遊戲程式設計 - 2D運動與碰撞處理I
Unity遊戲程式設計 - 2D運動與碰撞處理I
 
Python與Ardinio整合應用
Python與Ardinio整合應用Python與Ardinio整合應用
Python與Ardinio整合應用
 
mBlock積木式設計程式
mBlock積木式設計程式mBlock積木式設計程式
mBlock積木式設計程式
 
Unity遊戲設計- 2D動畫製作及應用
Unity遊戲設計-  2D動畫製作及應用Unity遊戲設計-  2D動畫製作及應用
Unity遊戲設計- 2D動畫製作及應用
 

Arduino感測應用