经过3个月的不断摸索,终于把91arm学堂阶段二的项目实践内容基本上做了出来(视频教程中的代码并不全),在此把相关心得和代码保存下来,供自己和学友们参考
系统硬件:
主控模块:nanopi s2(cortex-A9 四核s5p4418)、5v转3.3v模块、光感、声感、5v继电器、面包板及LED灯、串口转USB调试接口等
无线网络模块:tiny6410(ARM11 三星S3C6410)、红外传感、继电器、面包板及LED灯
先看整体效果,主控程序的为znkg2018,网络端程序为net_light
主控及网络端程序如下:
web浏览器界面如下:
该项目的主要思路:
(1)主控程序znkg2018(交叉编译移植到nanopi s2上)包含四个线程:
线程一:(用于进程间通信)循环查看共享内存、消息队列数据,根据消息队列的消息类型将实时将共享内存数据更新到主数据结构内存,或者将主数据结构内存更新至共享内存;
线程二:(用于检测设备上下线)循环读取5v转3.3v模块连接的开发板gpio口数据,高电平则代表相应的感应设备连接上了系统,可以读取该设备数据线连接的gpio口电平状态了(5v转3.3v模块、感应设备的电源线二合一连接在一起,实现同时插拔,从而通过该线程检测相应感应设备的插拔);
线程三:(用于侦听网络设备的连接)该线程为网络服务端,首先建立TCP数据流(socket~bind~listen~accetp)循环侦听网络客户端的连接请求,收到情求后自己再开辟新的线程用于同该客户端通信,根据客户端数据更新主数据结构中的网络设备状态,根据主数据结构中的网络设备状态向网络设备发送相应的命令。网络通信是基于协议的,便于命令分类和传输校验。
线程四:(用于灯光设备开关控制)本项目共三个小灯,分别为主控端的两个、网络端的一个,开关均由继电器控制,模拟了220v的客厅、书房灯及办公室(远端)的大灯。循环查询主数据结构中的灯光设备的开关状态,向对应的继电器发送写数据命令从而控制灯光开关。若感应设备绑定了灯光设备,则读取感应设备gpio口数据,并将该数据写入继电器gpio口中。网络设备则只更新网络命令状态值,由进程三发送出去,再由网络端程序处理并控制其继电器gpio,从而控制相应的灯光开关。
(2)网络客户端程序net_light(交叉编译移植到tiny 6410上)就一个主程序:
该程序通过ip和端口号连接nanopi上的主控程序的网络线程,根据主控程序传来的网络命令更新相应的设备状态。
(3)nanopi上的boa服务器运行的cgi程序:
在nanopi上安装了boa服务器后,就可以通过浏览器来访问nanopi中的cgi程序了,在boa的www文件夹中放上index.html文件,其为欢迎界面,其中的选项分别连接了不同的cgi程序,这些程序都打开了主控程序管理的共享内存和消息队列,通过修改表单并提取表单中的数据,更新共享内存数据,并通过消息队列通知主控设备更新共享内存或将共享内存中的数据更新到主数据结构内存。主数据结构内存修改后,则主控设备的四个线程会做出相应的动作的。
编辑器采用推荐的source insight,可以自动推导出变量、函数的声明及相互间的引用,方便编写及分析程序(但我采用的软件其编码格式为Ascill,不是utf-8,在编译时为乱码,用notepad++转换编码格式就OK了)
-
ARM
+关注
关注
134文章
9030浏览量
366559 -
控制系统
+关注
关注
41文章
6517浏览量
110396
原文标题:基于ARM的智能灯光控制系统经验总结分享
文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论