基于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].。基于web的嵌入式智能家居控制系统课程设计报告
相关推荐
((SelectWays == 10 || SelectWays == 100) amp。 amp。 NextInput == 2) { Number2 =。 } } 12 public void ShowResult() // “ =”显示结果 { if (SelectWays == 100 || SelectWays == 11) { if (Op_Div == true) { if
服务器 oracle数据库双机热备安装手册 or acle数据库双机热备安装手册 oracle数据库双机热备可以实现数据库的高可用性,在一台服务器出现故障无法提供 oracle数据库服务时,另一台服务器自动接管服务,保障数据库的正常运行。 本次使用 windows的 MSCS实现双机热备。 配置环境: 2台服务器,使用
式系统的要求, Windows CE 支持在多种不同的 CPU 硬件平台上运行。 Windows CE 系统一般包括 4 个主要模块,它们分别为内核模块、对象存储模块、图像,窗口和事件子系统模块、通信模块。 和其它党风的操作 系统一样,内核是 Windows CE 的核心,它主要负责内存管理、进程调度等功能。 图 12 Windows CE 体系结构图 开 发工具 Shell 内核 对象存储
then coin=0011。 next_state=state3。 elsif datain=10 then coin=0100。 next_state=state4。 elsif datain=00 then act10=39。 139。 act5=39。 039。 coin=0000。 next_state=idle。 end if。 when state3= if datain=01
124=d=254。 when 125=d=254。 when 126=d=255。 when 127=d=255。 when others=null。 end case。 end if。 其中,时钟信号 clk,复位信号 clr, 8位二进制输出信号端口 d。 程序设计流程图如下图所示: 输 出 赋 值 0NYNY计 数 器 是否 为 1 2 7。 复 位 信 号是 否 为 0。 查 表 输
tdxPl:buffer std_logic_vector(3 downto 0)。 倒计时显示东西方向人行道所亮灯剩余时间。 tnbh:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 4)。 tnbl:BUFFER STD_LOGIC_VECTOR(3 downto 0)。 倒计时显示南北方向所亮灯剩余时间。 tnbph:buffer std_logic_vector(8