学习资料来自Get started with MicroPython on Raspberry Pi Pico

在现实生活中,微控制器的另一个应用是在警报系统中。

所需材料

  • 树莓派Pico
  • 一块面包板
  • 任意颜色的LED
  • 一个330Ω的电阻
  • 一个压电式蜂鸣器
  • 一个(或多个)红外传感器
  • 公对公和公对母跳线若干

打印警报信息

HC-SR501 PIR

在之前的项目,我们应用了一些简单的输入元件——按钮,这次我们使用特殊的输入元件——红外传感器(passive infrared sensor)。

红外传感器是用来探测物体运动的装置,尤其是人类或其他活物。它就像一个摄像机,但它并不捕捉可见光,而是寻找活物因热发出的红外线。

拿起HC-SR501传感器,我们最先注意到的是它有一块电路板,就像Pico一样,只不过它的小一些。除了电路板,它当然还有其他元件:一块驱动传感器黑色集成电路,一些电容器,一些小的表面贴装的电阻,一些小的电位器(我们可以用螺丝刀旋转来调整传感器的灵敏度以及被触发后能保持活跃多久)。

我们还能看到三个公引脚(male pins),但显然,我们无法将引脚直接插入面包板,因为电路板上的其他元件会妨碍。我们可以用公对母(M2F)跳线实现转换.

如下图连接电路:

HC-SR501 PIR.png

代码拆解

导入所需库

1
2
import machine
import utime

定义红外传感器

1
sensor_pir = machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN)

与之前的反应力小游戏相同,小偷报警器应作为一种打断(interrupt)——在程序运行的时候停下。像之前一样定义一个回调函数处理打断:

1
2
3
4
def pir_handler(pin):
utime.sleep_ms(100)
if pin.value():
print("警报!检测到运动")

utime.sleep_ms(100)if pin.value():行用来避免警报器因微微的位移被触发。缓和地处理波动,即函数防抖。

Debouncing is removing unwanted input noise from buttons, switches or other user input. Debouncing prevents extra activations or slow functions from triggering too often.

——What is debouncing? – TechTarget Definition

最终,建立打断本身(注意,这是不是函数的一部分)

1
sensor_pir.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler)

使用LED

电路连接

小偷警报器+LED.png

代码拆解

在定义红外线传感器后,添加LED的针脚:

1
led = machine.Pin(15, machine.Pin.OUT)

handler函数的print行下,添加(注意,应有8个空格的缩进):

1
2
3
for i in range(50):
led.toggle()
utime.sleep_ms(100)

toggle()函数用于改变针脚的值,而不是设定一个值。

现在,程序应该为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import machine
import utime

sensor_pir = machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN)
led = machine.Pin(15, machine.Pin.OUT)

def pir_handler(pin):
utime.sleep_ms(100)
if pin.value():
print("警报!检测到运动")
for i in range(50):
led.toggle()
utime.sleep_ms(100)

sensor_pir.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler)

为了让警报更具威慑性,我们可以让LED在无人入侵时也缓慢闪烁,在程序末尾,添加

1
2
3
while True:
led.toggle()
utime.sleep(5)

连接蜂鸣器

电路连接

小偷警报器+buzzerpng.png

代码拆解

定义蜂鸣器

1
buzzer = machine.Pin(14, machine.Pin.OUT)

led_toggle()行后,添加(注意,有12个空格的缩进)

1
buzzer.toggle()

现在,程序应为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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):
utime.sleep_ms(100)
if pin.value():
print("警报!检测到运动")
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)

连接更多红外传感器

电路连接

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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):
utime.sleep_ms(100)
if pin.value():
if pin is sensor_pir:
print("警报!警报器1检测到运动")
elif pin is sensor_pir2:
print("警报!警报器2检测到运动")
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)