微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 树莓派DIY之无线感应报警

树莓派DIY之无线感应报警

时间:11-28 来源:互联网 点击:
这是我用树莓派给大家展示的一个小玩意哈,我会连续的用几篇博客来把这个小玩意的来龙去脉说清楚哈。这次我先大致的给大家介绍一下我这次利用树莓派做的小玩意是什么?

因为是利用手头现有的工具,主要包括树莓派B+,LCD1602,蜂鸣器,单路径循迹传感器模块。其主要作用如下:

树莓派:主控芯片,根据外部输入控制输出。主要利用树莓派的GPIO口

蜂鸣器:无源蜂鸣器,通过PWM波驱动其发声,由树莓派驱动。

LCD1602:显示必要的信息,输出设备。

单路径循迹传感器模块:输入设备。可以通对反射红外线的接收情况来判断物体的距离。当被检测物体在检测范围内时,红外线被反射回来且强度足够大,模块的输出端为低电平,指示二极管被点亮。否则输出高电平。

小创意的目的:

通过把LCD1602,蜂鸣器和单路径循迹传感器模块都接入到树莓派的GPIO引脚上面,用单路径循迹传感器检测物体的距离或颜色。当物体距离过近时,此时路径传感器模块输出为低电平,这个时候LCD1602显示出“DETECTED:YES”,同时蜂鸣器发出声音。而当物体为黑色或者距离较远时,蜂鸣器没有输出,同时LCD1602显示“DETECTED:NO”。

这次和大家分享得是我怎么分配树莓派的引脚哈。因为用的是B+的板子,所以GPIO口比较多,我就把其他的小模块直接和树莓派的GPIO口连接起来,不要担心GPPIO口不够用。

这是树莓派和蜂鸣器相连,使用了两个引脚,Pin20和Pin36。其中Pin20是树莓派的Ground引脚,所以我通过Pin36引脚(GPIO16)来发PWM波驱动蜂鸣器。

树莓派和LCD1602连接。这个可以参考我之前写的博客,完全按照这个来就行,这个也是官网推荐的连接方式,特别主要LCD1602的RW引脚一定要接地,否则可能烧坏树莓派。

http://www.rs-online.com/designspark/electronics/eng/blog/content-1148

树莓派和单路径循迹模块连接,一共有三个引脚,其中一个引脚接电压正极,Pin1,树莓派输出5V。一个接地,Pin34,树莓派的Ground。另外一个是信号输出,Pin3。在程序里面,通过判断树莓派引脚的电压来判断物体的距离。

完成这些步骤以后,我们就基本完成硬件的连接了。

接下来就是软件的实现了。

这一部分主要和大家介绍的我这个小应用的软件部分。

软件是实现这个功能的核心啊,主要包括以下几个部分:

(1)感应模块,感知无线感应模块的输入

(2)驱动蜂鸣器,需要产生PWM波

(3)显示模块,LCD1602根据不同的感应情况显示不同的信息。

这三部分我们都可以借鉴网上的资料,但是要根据自己的情况做一些修改。当然,我非常推荐下面这个网站:http://wiringpi.com/。我程序里面用到的函数都在下面的目录里,大家点进去,对着我后面的程序找就能找到原型了!

Wiring是为了更好的应用树莓派的GPIO口专门编写的控制函数。这个控制函数包含了很多已经写好了库函数,我们只要按照规则调用就行。当然在使用这些函数的时候,我们要根据自己树莓派GPIO口的连接情况更改一些参数。

下面是整个软件实现过程:

************************************/

#include
#include
#include

#include
#include
#include

int main (int args, char *argv[])
{
if (wiringPiSetup () == -1)
exit (1) ;
int fd = lcdInit (2, 16, 4, 15,16 , 0,1,2,3,0,0,0,0) ; //参考例程的程序,参数和自己硬件连接方式一致
if (fd == -1)
int fd = lcdInit (2, 16, 4, 15,16 , 0,1,2,3,0,0,0,0) ;
if (fd == -1)
{
printf ("lcdInit 1 failed\n") ;
return 1 ;
}
sleep (1) ; //显示屏初始化

if(softPwmCreate(27, 100, 100) != 0) //必须先创建发PWM波的引脚,才能用来发PWM波
{
printf ("PwmInit failed\n") ;
return 1;
}

lcdPosition (fd, 0, 0); lcdPuts (fd, " Raspberry Pi!"); //启动信息
sleep(1);

if(argv[1])
{
lcdPosition (fd, 0, 0) ;
lcdPuts (fd, " ") ; //清空第一行
lcdPosition (fd, 0, 0) ; lcdPuts (fd, argv[1]) ; //命令行参数显示至第一行
}

FILE *fp;
char temp_char[15]; //树莓派温度
char Total[20]; //总内存量
char Free[20]; //空闲内存量

lcdPosition (fd, 0, 0) ;
lcdPuts (fd, " ") ; //清空第一行

while(1)
{
if( digitalRead(8) == LOW)
{
lcdPosition (fd, 0, 0);lcdPrintf (fd, "DETECTED:TRUE ") ;
softPwmWrite(27, 10);
}
else
{
lcdPosition (fd, 0, 0);lcdPrintf (fd, "DETECTED:FALSE") ;
softPwmWrite(27, 100);
}

fp=fopen("/sys/class/thermal/thermal_zone0/temp","r"); //读取树莓派温度
fgets(temp_char,9,fp);

fp=fopen("/sys/class/thermal/therm

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top