分享

带环境检测和联网实时监控的智能家电控制系统

 知芯世界 2020-10-28

项目实现的功能说明:    

对比于原设计基本功能都实现了,就是效果没哪么理想。首先,通过蓝牙打开和关闭家电功能,直接通过点亮和关闭LED灯展示;其次,环境值的获取,只展示获取温度值一个,以及通过设定临界温度值控制LED的开关展示控制家电;再有就是联网的从设备,只通过一个WIFI模块的通信展示。作品完成的功能内容有:通过官方APP:ST BlueMS的Debug Console的双向传输功能实现蓝牙跟设备的通信,可以通过蓝牙发送不同的指令控制LED灯的开关,获取当前的温度值,设置一个临界温度值实现大于该值打开LED,少于关闭LED;通过蓝牙发送联网信息给WIFI模块,控制WIFI模块配置联网,并可通过网络服务器进行网络远程通信,可通过联网控制LED的开关,以及通过网络获取温度值。
软硬件设计思路:    

硬件就基于SensorTile套件的系统主板SensorTile Core System和扩展板STEVAL-STLCS01V1开发,通过接线连接外围器件。软件则通过官方的en.Bluemicrosystem2_firmware软件开发包的修改完成,主要是理解蓝牙的通信机制和环境温度的获取和处理函数,并添加功能函数实现作品功能;大致是,把SDK包里的Debug Console的处理函数换成自己添加的功能函数,调用和修改温度环境的处理函数,以及加上与WIFI模块通信和数据处理功能函数。
原理图:

下面这里我就比较详细的描述一下这次作品的设计并作个总结。首先是,相关开发工具的介绍:

1,硬件类

SensorTile套件,这个前面已经在设计分享里介绍过,这里就不做描述了,主要是用到系统主板SensorTile Core System和扩展板STEVAL-STLCS01V1,根据作品的原理图作相应修改就行了,其中要注意的是用到的几个I/O口,程序下载口就直接用板子上的,还有几个就是用于控制LED的两个I/O口,是用MCU上的PA11和PA12两个端口,以及用于与wifi模块通信的UART口,这里分别用板上的GPIO2和GPIO3即MCU上的PC0和PC1两个端口,它是低功耗串行异步收发器LP_UART1,这里因为没有对功耗特别要求,所以把它作为通用的串行通信器来用,还有一点要注意的是,要想用串口的两个端口,必须把扩展板上的R5,R6两个电阻去掉,如图:

可以看出它原来是作为IIC通信口使用的,所以要去掉。

接着就是wifi模块,这里使用的是ESP8266的串行通信模块,型号是ESP-12F,电路图如下:

比较简单,可以像我这样通过直接焊线实现。

最后是LED,这个简单,也可以像我这样直接用个洞洞板焊接出来。剩下就是下载工具,可以用ST-LINK V2,也可以用J-LINK,个人喜欢咯。

2,软件类

支持STM32开发的软件主流还是IAR FOR ARM和KEIL两款软件,我用的是IAR FOR ARM的7.6版,这个需要的可以在网上下载,网上很容易就能找到相关的版本和破解工具,以及安装和破解方法。还有就是ST官方提供的SDK包和测试APP,这里用的是en.Bluemicrosystem2_firmware这个固件包修改的,需要的可以到前面的帖子里下载,以及ST BlueMS这个APP前面也有提供下载的。

3,接着就是重头戏,固件源代码的修改,首先还是要先熟悉一下的,前一篇也有介绍过本次开发所用到的几个地方,这里我再详细的介绍一下吧。

首先,顺着工程文件的路径,找到并打开工程,如下图:

红圈1为路径,2为工程文件,打开工程,界面如下:

这里主要看main.c, sensor_service.c和stm32l4xx_it.c这三个源文件,其中main.c是主函数,主要完成端口的初始化,数据的处理,逻辑功能的实现等都在这里操作,而sensor_service.c则是负责与蓝牙通信的部分,stm32l4xx_it.c则是中断处理的部分。下面我就说一下要用到的那些功能和修改了那些部分。

如下图,我一般在修改的地方都会加上类似的标识,方便观看理解,

我就主要介绍几个大的修改,第一个是,蓝牙通信那部分,如图:

这里原来就是作为Debug Console双向传输测试用的处理函数,原来只是简单的回传动作,这里把它改为接收蓝牙数据并作前期处理的功能函数,如图:

在这里,我就先说一下,我个人定的几个指令吧。首先,LED的控制,是通过APP端发送过来的LED1ON,LED1OFF,LED2ON,LED2OFF这几条指令控制的;接下来是获取温度值,是通过RTE这条指令完成的,返回的温度值格式是Temp=xx.x *C;跟着是设置一个控制LED灯开和关的临界温度值,是通过STE=XX.X(温度值,如36.4),单位是摄氏度;继续,需要处理的是发送WIFI模块联网的指令,这个指令分两次发送,因为蓝牙一次最大的发送长度是20个字节,太长只能分开传输,指令分别是AT1="SSID",#   AT2="password"#  必须按照1,2这样的顺序发送,其中SSID为路由名称,这里要注意的是SSID和password里不能出现#这个结束位,当发送完两个指令时,MCU会通过串口配置wifi模块,而模块返回的信息会通过蓝牙反馈到APP上的,信息内容请参考wifi模块的说明书;当wifi模块连上路由后,我们再建立一个服务器,然后通过指令把服务器的IP和端口信息发送给处理器,指令内容是SC1="TCP","XXX.#  SC2=XXX.X.XXX"#  SC3=,XXXX#  一共三个指令,其中前两个指令里的XX是服务器的IP,后面那个指令的XX是端口号,通过返回的模块信息就可以判断有没有建立连接,连上服务器后,可以通过以下指令跟设备通信,D1ON,D1OFF,D2ON,D2OFF 四个指令分别控制LED的开和关,GT指令则是获取当前温度值,返回的温度值格式是:Temp=XX.X *C。以上便是所有的指令协议操作了,具体操作也可以看我发的作品展示视频。

跟着就是主函数main.c的修改了,如图:

图1

图2

                                                         图3

其中1图是添加的蓝牙数据处理函数,包括LED灯的开关,温度值的获取和回送,临界温度值的处理函数,以及wifi模块处理的函数,2图是用到的端口和串口的初始化函数,3图是添加的串口中断响应和数据处理的函数,主要是处理wifi模块的回显和通过服务器通信发送过来的数据。

再就是在中断源文件stm32l4xx_it.c里添加串口中断函数,如图:

   

还有就是,环境数据获取的函数,如图:

温度,气压和湿度都是在static void SendEnvironmentalData(void)这个函数里获取和处理的,其中温度是在下图这个地方: 

这里可以直接调用修改就可以了,具体都是通过SPI中断事件处理的。

好了,到这里就基本介绍完了,有兴趣的朋友可以自己也试试咯。在这里,再次的感谢ST和EEworld等相关人员的工作,让我有这么一次实习的机会,同时也祝各位参赛的朋友顺顺利利咯!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多