基于web的嵌入式智能家居控制系统课程设计报告内容摘要:

//用 read()函数读取实际按键值放入缓存中 if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) { . . perror(read buttons:)。 //读取失败则显示错误信息 exit(1)。 } //循环比较数组 buttons[i]和 current_buttons[i]中的值,若不相等说明按键i 状态改变 for (i = 0, count_of_changed_key = 0。 i sizeof buttons / sizeof buttons[0]。 i++) { if (buttons[i] != current_buttons[i]) { buttons[i] = current_buttons[i]。 //更新 button 中的值,为下次比较做准备 printf(%skey %d is %s, count_of_changed_key? , : , i+1, buttons[i] == 39。 039。 ? up : down)。 //输出按键状态 count_of_changed_key++。 } } if (count_of_changed_key) { printf(\n)。 //格式控制 } } close(buttons_fd)。 return 0。 了解了按键例程功能后,我们就可以对它进行移植了。 在执行 buttons[i] = current_buttons[i]。 后, button[i]已经保存了相应按键的最新状态,因此可以在这条语句后面加上判断语句,用于更新网页信息: FILE *fp。 if((fp=fopen(,r+))==NULL) //以读 写方式打开网页源码文件 exit(0)。 switch (i) //定位到网页源代码中的指定位置 { . . case 0:fseek(fp,1864L,0)。 break。 case 1:fseek(fp,2064L,0)。 break。 case 2:fseek(fp,2264L,0)。 break。 case 3:fseek(fp,2464L,0)。 break。 case 4:fseek(fp,4495L,0)。 break。 case 5:fseek(fp,4695L,0)。 break。 case 6:fseek(fp,4895L,0)。 break。 case 7:fseek(fp,5095L,0)。 } if(buttons[i]==39。 139。 ) //判断按键状态 fprintf(fp,”1”)。 //根据案件状态修改网页源码的值,以更改网页显示 else fprintf(fp,”0”)。 fclose(fp)。 注: fseek(fp,nL,0)函数是文件定位函数,这里它的作用是定位到 fp 文件从头开始第 n 个位置。 这里实际上是对网页源码进行修改。 至此,传感器传来的电平信 息都会在网页源码中体现,只要刷新网页,就能够看到端口的最新信息。 最后,用交叉编译成生成驱动程序 —— button。 模拟开关控制驱动 模拟开关控制驱动也是通过 GPIO 口控制模拟开关的,其本质是控制 GPIO 口的高点电平的输出。 与传感器信息采集驱动一样,也有现存的驱动可供调用,就是LED 灯控制驱动,是在 /dev 下的 leds。 也就是说我们可以直接通过调用驱动控制,举个简单例子: fd = open(/dev/leds, 0)。 //打开 led 驱动程序 if (fd 0) { perror(open device leds)。 //显示错误信息 exit(1)。 } ioctl(fd, 0, 3)。 //关闭第三盏 led 灯 ( IO 口状态为高电平) close(fd)。 //关闭驱动程序 . . 打开 leds 这个驱动后,只需要用 ioctl()函数就可以实现对 IO 口状态控制。 模拟开关驱动主要负责读取 cgi 程序生成的 文件中的数据,根据数据内容改变 GPIO 口的状态,同时将 GPIO 口的状态反馈给网页。 数据读取: char type_tmp[8]={}。 //用于存放读 取的组别字符信息 char ping_tmp[8]={}。 //用于存放对应组别字符数值 int type[8]={}。 //用于存放转化为整形后的组别信息 int ping[8]={}。 //用于存放转化为整形后的数值信息 int i,fd。 if((fp=fopen(,r))==NULL) //用读的方式打开 文件 exit(0)。 fread(type_tmp,1,8,fp)。 //在 fp 文件中读取 8 个 1 个字节大小数据,保存在type_tmp 中 fread(ping_tmp,1,8,fp)。 fclose(fp)。 for(i=0。 i8。 i++) { type[i]=(int)*(type_tmp+i)48。 //转换为数值 ping[i]=(int)*(ping_tmp+i)48。 } 数据读取后重新分类保存在 type[]和 ping[]中,根据数值改变 GPIO 口状态: for(i=0。 i8。 i++) { num=type[i]1。 //因为总共只有 4 个 led 灯口,用 num 变量控制复用。 if(num=4) num=4。 if(ping[i]==1) //根据组别和数据控制 led 端口的状态。 ioctl(fd, 1, num)。 else if(ping[i]==2) ioctl(fd, 0, num)。 } 端口状态改变后,向网页反馈状态信息,同样利用更改网页源码实现: if((fp=fopen(,r+))==NULL) //原理同传感器信息采集驱动中部分程序 exit(0)。 for(i=0。 i8。 i++) { switch (i) { case 0:fseek(fp,2589L,0)。 break。 case 1:fseek(fp,2704L,0)。 break。 case 2:fseek(fp,2819L,0)。 break。 . . case 3:fseek(fp,2934L,0)。 break。 case 4:fseek(fp,5220L,0)。 break。 case 5:fseek(fp,5335L,0)。 break。 case 6:fseek(fp,5450L,0)。 break。 case 7:fseek(fp,5565L,0)。 break。 } if(ping[i]==1) fprintf(fp,1)。 else if(ping[i]==2) fprintf(fp,0)。 } fclose(fp)。 不管是传感器信息采集驱动还是模拟开关驱动程序,都是需要运行在 while(1)循环中,编译完成后在终端中同时打开运行。 网页的源码修改后需要刷新才能看到最新信息,因此在可接受范围之内对实时性方面做了如下处理: ① 网页程序中设定网页每十秒钟自动刷新,这样用户看到网页上的信息至少是 10 内 的。 ② 用户在网页页面设定完成点击提交时, cgi 程序让页面重新载入,提交后更改会立即被显示出来。 以上处理能够在将设计难度降低到自己的能力范围之内,又不影响系统正常运行。 最后用交叉编译器生成驱动程序 —— read_type 4. WEB 嵌入式只能家居控制系统测试和应用 软件系统测试 1. 将编译好的驱动程序、网页、 cgi 程序、图片包发送到开发板 /home/plg 2. 在嵌入式系统的终端运行传感器信息采集驱动( button)和模拟开关控制驱动( read_type)。 3. 在客户端浏览器输入开发板静态 IP: ,可以看到欢迎界面。 4. 点击“进入系统”进入到简介控制界面,如图。 5. 查看核心板的初始状态:电源指示灯亮,其余不亮 .。 6. 在浏览器中选中第一项“洒水”和第二项的“开空调”,点提交后,核心板 LED 端口电平发生变化,网页也 做相应的指示,如图 和图 所示。 . . 7. 按下开发板上的 K K K8 按键按钮,手动刷新网页(或者等待网页自动刷新),网页上的信息如图 所示。 8. 松开按键后,状态恢复安全状态,与图 一样。 9. 网页上选中“关水”“关空调”选项后,状态重新恢复到图 状态。 浏览器提交的设置数据都会被保存在服务器里,因此再一次登陆后可以看到之前的设置。 详情在驱动程序中可以看到。 图 智能家居控制系统简介界面 . . 图 提交后核心板 LED灯情况(第一盏是电源灯) 图 提交后网页信息更新情况 . . 图 按下 K K K8后网页显示的信息 5.总结与展望 伴随着人们生活的水平的提高,家居智能化成为人们新的需求,将嵌入式 WEB远程控制系统应用在智能家居方面是未来发展的必然趋势。 实现基于 WEB嵌入式智能家居控制系统最主要的步骤就是将嵌入式、 web服务器、家电控制三者结合。 传统的 PC机服务器存在诸多弊端,嵌入式系统的引入刚好可以解决这方面问题,自然而然的,下一步工作就是在嵌入式下建立服务器,通过 cgi程序和服务程序将网页和家电控制结合起来 —— 这也是引导本次毕业设 计的主要思路。 本次设计虽然完成了,但仅仅算是一个模型,在这个模型基础上还可以做很多改进,如增强网页数据传输安全性,改善网页动态特性,脱离局域网使之能真正在 Inter网络上登陆等,这些是智能家居必然要实现的过程,也是今后继续深入的方向。 . . 参考文献 [1]Tiny210 用户手册 [J].。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。