本帖最后由 yuanlai2010 于 2014-8-28 21:49 编辑
Linux下的第一个实际小应用——统计房间人数
参与Helper2416开发板助学计划心得
学习Linux也有一段时间了,今天终于完成了一个有实际用处的小应用.虽然很简单,而且如果使用单片机来完成的话将会更简单,不过既然是基于Linux来实现的,对于学习Linux来说,还是具有较大的意义的.
应用简述:
该应用主要用于统计只有一个入口的房间里面的人数,靠的就是检测人的进出,有人进入,人数加1,有人出去则人数减1.应用开始运行的时候,默认此房间内的人数为0,所以如果在启动应用之前就已经有人在房间内的话,那么统计数目就会有误差,不过计数也不会变为负数的。
应用实现原理:
出入检测:使用两对M8毫米激光对射光电开关,按如下原理图安置,
安装结构示意图:
发射器实物图:
接收器实物图:
接收器在接收到激光时输出低电平,没有接收到激光时,输出高电平。当有人出入时,会挡住光源一段时间,挡住的那段时间输出的是高电平,随即人经过,重新接收到光源,输出低电平,把这个信号接到Herper2416的IO引脚上,利用那个下降沿信号来触发中断,
开发板底板原理图J14局部:
这里使用的是J14 的EINT5 和 EINT8(考虑到J14接口并不能直接使用标准的杜邦线),在驱动中注册这两个中断,根据中断号来判定是哪个引脚发生中断,然后让read函数返回特定的值,最终就是靠判断这两个引脚中断的先后顺序来判定是有人进还是有人出。
实际接口:黑色为GND、黄色接EINT5、绿色接EINT8:
统计人数:这个很简单,在应用程序中简单实现。比较可惜的是现在还不知道怎么写QT的UI程序,所以只能把统计信息打印在终端上了。
应用程序源码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- void display(int number, int flag)
- {
- system("clear");
- printf("\n\n\n\n\n\n\n\n\n");
- printf(" ****************************************\n");
- switch(flag){
- case 0:
- printf(" * Welcome ! *\n");
- break;
- case 1:
- printf(" * Someone come in ! *\n");
- break;
- case -1:
- printf(" * Someone come out ! *\n");
- break;
- case 2:
- printf(" * !!! Ghost come out !!! *\n");
- break;
- }
- printf(" * *\n");
- printf(" * %4d people in the room *\n", number);
- printf(" ****************************************\n");
- }
- int main(int argc, char **argv)
- {
- int fd;
- int number = 0;
- int key_value,i,flag = 0;
- fd = open("/dev/button_driver", O_RDONLY);
- if(fd < 0)
- {
- perror("cannot open device button");
- exit(1);
- }
- display(number, flag);
- while(1){
- flag = 0;
- for(i=0;i<2;i++){
- read(fd, &key_value, sizeof(key_value));
- flag = key_value;
- }
- if (flag == 1){
- number++;
- display(number, flag);
- }
- else{
- number--;
- if(number < 0){
- number = 0;
- flag = 2;
- }
- display(number, flag);
- }
- }
- close(fd);
- return 0;
- }
复制代码
觉得比较遗憾的几点:
1:没能做出一个界面来,只能后续慢慢学习咯。
2:本来是用无线来做的,把检测装置用430+X-bee做,然后在Helper2416中用X-bee接收信号就好了,可是悲剧的是,昨天在测试X-Bee的时候,手贱去跟新了下X-Bee的固件,结果就悲剧咯。有一个X-Bee模块跟新失败,变成砖头了。我仅有这一对啊。
我将在二楼放上测试视屏,当然只是模拟了。以下为视屏截图。
论坛ID:yuanlai2010
发表时间:2014-08-28