微控制器(MCU)在現實世界的另一個用途是在報警系統中。從早上叫你起床的鬧鐘到火災警報、防盜警報,甚至是核電站出現問題時發出的警報,微控制器幫助保護我們所有人的安全。
本篇將帶你構建自己的防盜報警器,實現一個特殊的運動傳感器,不斷掃描任何人進入房間的事件。無論你是在保護銀行金庫,還是只是想防止兄弟姐妹們出現在你的房間里,防盜報警器肯定會派上用場。
這個項目需要用到:
樹莓派 Pico
面包板
任何顏色的 LED 燈
一個 330Ω 電阻
有源蜂鳴器
一個或多個 HC-SR501 被動紅外(PIR)傳感器
若干公對公、公對母杜邦線
microUSB 數據線
將 Pico 連接到樹莓派或其他運行 Thonny MicroPython IDE 的計算機。
HC-SR501 PIR 傳感器
在前面的系列教程中,你已經使用了按鈕開關形式的簡單輸入組件。這一次,你將使用被稱為被動紅外傳感器(PIR)的傳感器。有數百種不同的 PIR 傳感器可用,HC-SR501 低成本、高性能,并與 Pico 完美適配。
被動式紅外傳感器被設計用來檢測運動,特別是人和其他生物的運動。它的工作原理有點像照相機,但它不是捕捉可見光,而是尋找以紅外輻射的形式從活體發出的熱量。它被稱為被動紅外傳感器,而不是主動紅外傳感器,因為就像相機傳感器一樣,它自己不發出任何紅外信號。
實際的傳感器被埋在一個塑料鏡頭下,通常形狀像半個球。鏡頭在技術上并不是傳感器工作所必需的,但可以供更寬的視野(FOV),如果沒有透鏡,PIR 傳感器只能看到傳感器正前方一個非常窄的角度的運動。這種鏡頭可以從更寬的角度吸收紅外線,這意味著一個 PIR 傳感器就可以觀察到房間里大部分的移動情況。
在商業防盜報警系統中,PIR 傳感器只是使用的傳感器之一。其它的傳感器還包括:能告知窗 戶何時被打碎的碎玻璃傳感器、能監測門是開著還是關著的磁傳感器、能捕捉竊賊腳步聲的聲音傳感器以及能告知門鎖是否被撬開的振動傳感器。
然而,一個簡單的 PIR 傳感器對于低安全級別的地方就足夠了。
現在拿起你的 HC-SR501 傳感器看一看。首先要注意的是,它有自己的電路板。除了傳感器和鏡頭,還有其他幾個組件:驅動傳感器的黑色芯片、一些電容和微小的貼片電阻。你也可以看到幾個電位器,你可以用螺絲刀擰動它們,來調整傳感器的靈敏度,以及當觸發時它保持激活的時間。
你還會看到三個公排針,和 Pico 底部的排針一模一樣。但是,你不能直接將它們插入面包板,因為面包板上的組件會礙事。取三根公對母杜邦線,將母線端插入 HC-SR501 的針腳上。接下來,拿起公的一端,把它們連接到面包板和 Pico 上。在將傳感器連接到 Pico 上時,需要確認傳感器的文檔。不同公司生產的 HC-SR501 傳感器,它們引腳的順序會略有不同。
這里的傳感器,引腳順序為 GND 在底部,信號或觸發引腳在中間,電源引腳在右邊。
傳感器的信號引腳連接到 Pico 的 GP28 引腳。GND 和 VCC 分別連接 Pico 的 GND 和 5V 引腳。
警報器代碼
對 Pico 進行編程才能識別傳感器。這和讀取按鈕的操作類似。幾乎可以使用相同的代碼:
import machine sensor_pir = machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN)
就像上一篇教程中做的反應游戲一樣,防盜報警器的輸入應該作為一個中斷,停止程序正在做的任何事情,并在傳感器被觸發時做出反應。和前面一樣,首先定義一個回調函數來處理中斷:
def pir_handler(pin): print("ALARM! Motion detected!")
最后,設置中斷本身:
sensor_pir.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler)
單擊 Run 按鈕,并將程序保存到 Pico 中,命名為 Burglar_Alarm.py。
在 PIR 傳感器前面揮一揮你的手,你會看到一條消息出現在 Shell 區域,確認傳感器檢測到了手的移動。如果你一直揮動你的手,信息將持續輸出,但是在每條消息之間有一個延遲,
這種延遲和內置在 HC-SR501 上的電位器設置相關。你可以插入一個螺絲刀,把它朝一個 方向轉動來減少延遲,朝另一個方向轉動來增加延遲。請參考傳感器的文檔,以確定哪個電位器是控制延遲的。
組裝輸入和輸出之后的代碼
真正的防盜警報器有燈和警報器來醒周圍的人有問題了,下面我們就來添加它們。如圖所示添加 LED 和有源蜂鳴器。其中,LED 正極與 Pico 的 GP15 引腳相連,蜂鳴器的正極與 Pico 的 GP14 相連。GND 均與 Pico 的 GND 引腳相連。
加入 LED 和蜂鳴器之后的完整代碼如下:
import machine import utime sensor_pir = machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN) led = machine.Pin(15, machine.Pin.OUT) buzzer = machine.Pin(14, machine.Pin.OUT) def pir_handler(pin): print("ALARM! Motion detected!") for i in range(50): led.toggle() buzzer.toggle() utime.sleep_ms(100) sensor_pir.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler) while True: led.toggle() utime.sleep(5)
點擊 Run 按鈕,然后在 PIR 傳感器前再次揮舞你的手,這時不僅會有消息提示出現在 Shell 區域,LED 將開始快速閃爍 50 次并伴隨著警報器嗶聲(間隔 100 毫秒)。
為了讓防盜報警器更具震懾力,它在沒有察覺到任何動靜的情況下也會緩慢閃爍(每 5 秒一次),以此 警告潛在的入侵者,你的房間已經被人監視了。
祝賀你,這應該足以嚇入侵者了!
如果你使用的是無源蜂鳴器,嘗試這個版本的程序代替:
import machine import utime sensor_pir = machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN) led = machine.Pin(15, machine.Pin.OUT) buzzer = machine.Pin(14, machine.Pin.OUT) def pir_handler(pin): print("ALARM! Motion detected!") for i in range(50): led.toggle() for j in range(25): buzzer.toggle() utime.sleep_ms(3) sensor_pir.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler) while True: led.toggle() utime.sleep(5)
在蜂鳴器的使用上,上面的代碼是通過快速切換蜂鳴器引腳的電壓來模擬有源蜂鳴器振蕩器的效果。
嘗試將延遲時間從 3 毫秒改為 4 毫秒,你會發現蜂鳴器的聲音音調更低。改變延遲會改變蜂鳴器振蕩的頻率:延遲越長,蜂鳴器振蕩的頻率就越低,聲音的音調就越低;延遲越短,它的振動頻率 就越高,聲音的音調也就越高。
擴展警報器
添加多個 HC-SR501 傳感器可以覆蓋更多區域。我們以兩個為例,將新增的傳感器信號腳連接到 Pico 上的 GP22 引腳,如圖所示。
在設置第一個傳感器的地方添加一行新代碼:
sensor_pir2 = machine.Pin(22, machine.Pin.IN, machine.Pin.PULL_DOWN)
然后創建一個新的中斷,同樣在第一個中斷的下面:
sensor_pir2.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler)
請記住,一個處理程序可以有多個中斷,因此不需要更改終端處理程序的部分。
點擊 Run 按鈕,并在第一個 PIR 傳感器上揮一揮你的手,你會看到警報信息,LED 閃光,蜂鳴器的聲音和之前一樣。等他們完成,然后在第二個 PIR 傳感器上揮揮手,你會看到你的防盜警報以完全相同的方式響應。
為了使鬧鐘變得非常智能,你可以根據哪個引腳負責中斷來自定義消息,它的工作方式與你之前編寫的雙人反應游戲中完全相同。
回到你的中斷處理程序并修改它:
def pir_handler(pin): if pin is sensor_pir: print("ALARM! Motion detected in bedroom!") elif pin is sensor_pir2: print("ALARM! Motion detected in living room!") for i in range(50): led.toggle() buzzer.toggle() utime.sleep_ms(100)
就像在系列教程「反應游戲」項目中,這段代碼讓中斷報告它被哪個引腳觸發。最終完整的代碼如下:
import machine import utime sensor_pir = machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN) sensor_pir2 = machine.Pin(22, machine.Pin.IN, machine.Pin.PULL_DOWN) led = machine.Pin(15, machine.Pin.OUT) buzzer = machine.Pin(14, machine.Pin.OUT) def pir_handler(pin): if pin is sensor_pir: print("ALARM! Motion detected in bedroom!") elif pin is sensor_pir2: print("ALARM! Motion detected in living room!") for i in range(50): led.toggle() buzzer.toggle() utime.sleep_ms(100) sensor_pir.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler) sensor_pir2.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler) while True: led.toggle() utime.sleep(5)
祝賀你!你現在學會如何構建一個模塊化的防盜報警器來覆蓋你需要的所有監測區域了!
-
微控制器
+關注
關注
48文章
7489瀏覽量
151047 -
傳感器
+關注
關注
2548文章
50673瀏覽量
751987 -
mcu
+關注
關注
146文章
16990瀏覽量
350307 -
報警器
+關注
關注
12文章
919瀏覽量
108715 -
樹莓派
+關注
關注
116文章
1698瀏覽量
105524
原文標題:竊賊報警器:在樹莓派 Pico 上使用 PIR 傳感器
文章出處:【微信號:趣無盡,微信公眾號:趣無盡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論