在本文中,单片机开发工程师们分享了一个使用PIC单片机开发的被动红外(PIR)传感器模块的报警器。在这个方案中,我们使用PIC12F635单片机进行开发,持续监控传感器模块的输出,并在其激活时打开蜂鸣器。
一、被动红外(PIR)报警器方案的原理
某些半导体材料具有暴露于热红外辐射时会产生表面电荷的特性。这种现象称为热电。被动红外(PIR)传感器模块的工作原理相同。人体以红外线辐射的形式辐射热量,最大约为9.4微米。人体的存在会导致热释电传感器感应到的周围环境的IR轮廓发生突然变化。PIR传感器模块在板上具有仪表电路,该仪表电路将该信号放大到适当的电压电平以指示运动的检测。
PIR传感器需要大约10到60秒的初始稳定时间才能正常运行。在这段时间内,传感器要熟悉周围的环境,并应避免其视野内的任何运动。PIR传感器的典型范围为6米,其设计旨在适应缓慢变化的条件,例如随着时间的流逝,周围温度分布的逐渐变化。但是,传感器会响应任何轮廓的突然变化(例如,人体运动)。这就是为什么不应将PIR传感器模块放置在加热器,交流电源插座或任何会在周围环境中产生快速变化的地方的原因。
PIR传感器模块通常具有3针连接:Vcc,输出和接地。引脚排列可能会有所不同,因此我建议查看制造商的数据表以确认引脚。有时候,他们确实在板上靠近引脚的地方有标签。我所拥有的一个可以做到,它可以通过5-12V电源供电,因为它具有自己的稳压器。当检测到运动时,输出变高。
此外,它还有3针跳线选择,可用于单触发或连续触发输出模式。这两个位置带有标签H和L。当跳线位于H位置时,当反复重新触发传感器时,输出将保持高电平。在位置L,每次触发传感器,输出就变高和变低。因此,在此模式下,连续运动将产生重复的高/低脉冲。传感器模块的前部具有菲涅耳透镜,可将红外光聚焦到传感器元件上。
二、红外报警器方案电路图
该红外报警器方案的电路图非常简单,这里使用4节AA电池为电路供电,可提供6V电源。串联使用一个二极管将电压降至5.4V,因为PIC单片机的工作电压应低于5.5V。此外,在电源极性相反的情况下,该二极管还可以为电路提供保护。我已经使用NI-MH可充电电池(可提供4.8V)对电路进行了测试,并且可以正常工作,但是我建议使用碱性电池(每个1.5V)以提高性能。你也可以使用9V电池,但是电路中需要LM7805稳压器IC。
PIR传感器模块的输出通过PIC12F635的GP5(引脚2)进行监控。当检测到运动时,此输出约为3.3V(我的传感器模块的板上有3.3V稳压器IC)。你仍然可以使用该电压作为PIC12F635的有效逻辑高电平,但我更喜欢使用该电压来驱动NPN晶体管(BC547)的基极,以便在集电极处获得逻辑电压的完整摆幅。现在,单片机监视晶体管的集电极上的电压。在正常情况下,晶体管截止,集电极输出为逻辑高电平(+5V)。当检测到运动时,传感器模块的高输出使晶体管饱和,并且集电极处的电压下降至逻辑低。触发器的跳线选择在H位置,因此只要运动存在,传感器的输出将保持有效。注意,PIC12F635单片机使用4.0 MHz的内部时钟源。在本方案中,MCLR功能被禁用,WDT为OFF。
LED通过串联的限流电阻连接到端口GP4。电源打开时,LED闪烁3次。这表示系统已启动。端口引脚GP2驱动压电蜂鸣器。压电蜂鸣器在其谐振频率处提供最大的输出声压。我使用的压电蜂鸣器是EFM-290ED,其谐振频率为3.4±0.5 KHz。玩了一点之后,我发现最大的输出声音约为3725 Hz。尽管规范说工作电压为7-12V,但仅用5V供电时会产生很大的声音。
该方案用C语言编写,并使用MikroC Pro for PIC进行编译。首次打开电源时,LED闪烁3次,表明系统已打开电源。然后,单片机等待60秒钟,然后开始监视PIR传感器输出。需要注意的是,首次开启电源时,PIR传感器需要此等待一小会时间才能稳定下来。当单片机检测到传感器被触发时,它以3725 Hz方波驱动压电蜂鸣器。MikroC具有用于生成声音的内置库(Sound_Play())。另一个需要注意的问题是当感应到运动时你想要让警报响多长时间,这取决于你对单片机进行编程的设置。由于传感器处于重新触发模式,因此只要持续感测到运动,蜂鸣器就会保持打开状态。如果运动消失,并且传感器输出变为逻辑低电平,则蜂鸣器不会立即停止,但仍会打开约10秒钟,但频率略有不同(3570 Hz)。如果再次检测到运动,它将以其峰值谐振频率(3725 Hz)驱动压电蜂鸣器。
三、红外报警器方案源代码
sbit Sensor_IP at GP5_bit; // sensor I/P
sbit LED at GP4_bit; // LED O/P
unsigned short trigger, counter;
void Get_Delay(){
Delay_ms(300);
}
void main() {
CMCON0 = 7;
TRISIO = 0b00101000; // GP5, 5 I/P‘s, Rest O/P’s
GPIO = 0;
Sound_Init(&GPIO,2);
// Blink LED at Startup
LED = 1;
Get_Delay();
LED = 0;
Get_Delay();
LED = 1;
Get_Delay();
LED = 0;
Get_Delay();
LED = 1;
Get_Delay();
LED = 0;
Delay_ms(60000); // 45 Sec delay for PIR module stabilizaTIon
counter = 0;
trigger = 0;
do {
while (!Sensor_IP) { // Sensor I/P Low
Sound_Play(3725, 600);
Delay_ms(500);
trigger = 1;
counter = 0;
}
if (trigger) {
Sound_Play(3570, 600);
Delay_ms(500);
counter = counter+1;
if(counter == 10) trigger=0;
}
}while(1);
} // End main()