树莓派DIY之无线感应报警
完成这些步骤以后,我们就基本完成硬件的连接了。
接下来就是软件的实现了。
这一部分主要和大家介绍的我这个小应用的软件部分。
软件是实现这个功能的核心啊,主要包括以下几个部分:
(1)感应模块,感知无线感应模块的输入
(2)驱动蜂鸣器,需要产生PWM波
(3)显示模块,LCD1602根据不同的感应情况显示不同的信息。
这三部分我们都可以借鉴网上的资料,但是要根据自己的情况做一些修改。当然,我非常推荐下面这个网站:http://wiringpi.com/。我程序里面用到的函数都在下面的目录里,大家点进去,对着我后面的程序找就能找到原型了!
Wiring是为了更好的应用树莓派的GPIO口专门编写的控制函数。这个控制函数包含了很多已经写好了库函数,我们只要按照规则调用就行。当然在使用这些函数的时候,我们要根据自己树莓派GPIO口的连接情况更改一些参数。
下面是整个软件实现过程:
************************************/
#include #include int main (int args, char *argv[]) if(softPwmCreate(27, 100, 100) != 0) //必须先创建发PWM波的引脚,才能用来发PWM波 lcdPosition (fd, 0, 0); lcdPuts (fd, " Raspberry Pi!"); //启动信息 if(argv[1]) FILE *fp; lcdPosition (fd, 0, 0) ; while(1) fp=fopen("/sys/class/thermal/thermal_zone0/temp","r"); //读取树莓派温度 fp=fopen("/sys/class/thermal/thermal_zone0/temp","r"); //读取树莓派温度 fp=fopen("/proc/meminfo","r"); //读取内存信息 sleep(1); return 0; } 这里面用到了很多的函数,包括关于LCD显示的函数,PWM波引脚初始化等函数。这些都是Wiring里面已经包含好了的。在利用时,我们需要查看函数的具体调用的原理即可。 这个大家千万要注意就是调用函数的参数要和我们实际试验中的引脚对应起来,否则调用函数不会有结果的。一些错误的连线还可能烧坏树莓派 软件写完以后,我们就是编译,调试和实验了。 现在我们来整理一下思路哈,这都是在树莓派系统终端执行! (1)进入树莓派系统终端, 安装版本管理软件 sudo apt-get install git (2)clone程序pi-screen。这个程序只有相应的显示功能,我们需要根据自己的需要添加 git clone https://github.com/qtsharp/pi-screen (3)更改源程序,根据自己想实现的功能,添加相应的函数和功能。 这主要包括更改LCD1602函数的引脚,PWM波 (4)编译源文件,生成可执行文件。使用如下语句: gcc 1602.c -o 1602 -L lin -l wiringPi -lwiringPiDev (5)最后执行文件,使用如下语句: sudo ./1602 到了这一步,我们就可以看实验结果了。 下面是我自己调试的一些过程。 这是感应没有输出的时候: 可以看到: DETECT:FALSE ,感应模块LED没亮,同时蜂鸣器没有输出 这是感应模块有输出的时候: 显示可以看到此时: DETECT:TRUE,感应模块LED亮起,同时蜂鸣器有输出。 到这里这个实验就结束了,大家也可以自己试试哈。 中间调试过程也出了一些bug,以后我总结一下再和大家分享哈!
#include
#include
#include
#include
{
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 failedn") ;
return 1 ;
}
sleep (1) ; //显示屏初始化
{
printf ("PwmInit failedn") ;
return 1;
}
sleep(1);
{
lcdPosition (fd, 0, 0) ;
lcdPuts (fd, " ") ; //清空第一行
lcdPosition (fd, 0, 0) ; lcdPuts (fd, argv[1]) ; //命令行参数显示至第一行
}
char temp_char[15]; //树莓派温度
char Total[20]; //总内存量
char Free[20]; //空闲内存量
lcdPuts (fd, " ") ; //清空第一行
{
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);
}
fgets(temp_char,9,fp);
fgets(temp_char,9,fp);
float Temp;
Temp=atof(temp_char)/1000;
lcdPosition (fd, 0, 1);lcdPrintf (fd, "%3.1fC", Temp) ;
fclose(fp);
fgets(Total,19,fp);
fgets(Total,4,fp);
fgets(Free,9,fp);
fgets(Free,19,fp);
fgets(Free,4,fp);
lcdPosition (fd, 7, 1);
lcdPrintf (fd, "%3d/%3dMB", atoi(Free),atoi(Total)) ;
fclose(fp);
}
评论