本文主要讲解了物联网IOT技术全栈开发,基于STM32F103RCT6开发板,使用keil编译工具(标准库模式),采用华为云平台设计的一个智能养殖系统以及相关APP的开发的详细步骤。并且可以根据该系统模型进行场景改造,可以在本模型的架构下轻松改造中智慧农业、智慧交通、智慧家居等等相关模型系统。
可以点击下发链接转置B站观看演示视频:
物联网IOT-基于STM32开发板的智能养殖系统+华为云平台+APP端应用+keil编译工具
本次设计的基于室内智能养殖系统主要通过wifi联网方式,使华为云平台收集传感器上报的数据(包括温湿度、食物重量、水分余量、空气质量等),我们不仅可以通过手机app端及时观看养殖场环境数据,也可以通过养殖场内设计的OLED屏查看数据,而查看数据的权限则要RFID技术实现。;同时通过华为云平台或手机app下发指令控制水泵、电机等硬件设备完成补给粮食、补充水、清洁等功能并及时对命令进行响应,使我们可以根据监测到的数据及时下发命令完成各种操作;同时为方便日常操作,还在华为云平台上设计了一个设备联动规则,用于实现自动模式和手动模式的切换,通过设定一定的阈值来下发操作命令实现自动补给粮食、水等操作。
1.通过传感器设备实时检测养殖场的温湿度、气体浓度、以及食物和水分余量等;
2.通过电机、水泵等设备实现补给和清洁功能;
3.通过WIFI模块进行组网,并在华为云平台创建产品,实时上报传感器收集的数据,同时下发命令对水泵、电机进行操作并响应;
4.通过华为云平台的设备联动规则实现对补充粮食、补水以及清洁的自动模式和手动模式;
5.通过RFID技术实现对室内OLED屏显示的环境信息查看的权限管理;
6.通过app端可查看相关传感器数据,并下发命令,切换工作模式,数据查询。
可以转置以下文章:
还未发布,如需技术支持,可后台联系我或直接评论,看到都会回复,续将更新更详细的文章进行讲解。
相关传感器模块如需技术支持,也可后台咨询我,或直接评论,看到都会回复,后续将更新更详细的文章进行讲解各个模块。
首先我们手上的有些模块可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,因此需要首先对esp8266进行MQTT固件烧录,自行从官网上下载烧录软件和指定的固件库
AT
AT+CWMODE=1
AT+CWJAP=“huawei”,“123123123”
用USB转TTL模块连接ESP8266至电脑,与电脑通过串口进行AT通信,发送以上三步,观察手机热点是否能够连上esp8266设备,并观察串口是否返回“ok”指令。、
(注意将AT+CWJAP=“huawei”,"123123123"中的"huawei"改为自己的热点名字,"123123123"改为自己的热点密码,同时切记将热点频段由5改为2.4)
2.在(产品文档-开发指南-设备测开发)中寻找该界面后输入设备的ID和密码即可获得设备三元组
3.获得独属自己的华为云接入地址
(注意本系统采用的是MQTT协议)
至此,我们接入华为云所需要的信息已经全部准备完毕,可将其编写在我们keil中的esp8266.h文件中。如下所示:
1.首先可在电脑主机进行串口通信测试)(用USB转TTL模块连接esp8266与电脑进行AT通信)
成功连上云平台会有如下显示:
发送AT指令如下
AT
AT+CWMODE=1
AT+CWJAP=“wifi名称”,“wifi密码”
AT+MQTTUSERCFG=0,1,“NULL”,“设备三元组USERNAME”,“设备三元组PASSWORD”,0,0,“”
AT+MQTTCLIENTID=0,“设备三元组的ClientID”
AT+MQTTCONN=0,“产品接入地址”,1883,1
至此我们的esp8266模块就成功连上华为云平台了。
1、接线方式
采用3.3v
RX接PA9
TX接PA10
(esp8266模块共有六个引脚,在连接到开发板的时候只需使用电源,地线,RX,TX四个引脚)
2、keil端程序编写
首先在esp8266.c程序中编写发送AT指令的at函数
void at(char string[500])//等待正确回复
{
flag=0;
printf("%s\r\n",string);
while(1)
{
if(flag==1) //当串口中断判断接收到的回复为正确回复时会将flag置1
{
flag=0;
break;
}
else
delay_ms(50);
}
}
其次在esp8266.c程序中编写需要发送的相关AT指令进行发送,最后在主函数main.c中进行初始化在编译运行即可联网华为云平台,打开华为云平台可以发现设备处于在线状态
at("AT"); //AT测试
delay_ms(2000); //等待设备重启
at("AT"); //AT测试
at("AT+CWMODE=1");//设置模块为STA模式
sprintf(str_temp,"AT+CWJAP=\"%s\",\"%s\"",WIFI_SSID,WIFI_PWD); //连接WiFi
at(str_temp);
sprintf(str_temp,"AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\",\"%s\",0,0,\"\"",USERNAME,PASSWORD);//设置MQTT的登陆用户名与密码
at(str_temp);
sprintf(str_temp,"AT+MQTTCLIENTID=0,\"%s\"",ClientID);//设置MQTT的ClientID
at(str_temp);
sprintf(str_temp,"AT+MQTTCONN=0,\"%s\",%s,1",ADDRESS,PORT);//设置MQTT接入地址与端口号
at(str_temp);
sprintf(str_temp,"AT+MQTTSUB=0,\"$oc/devices/%s/sys/properties/report\",1",DeviceID); //订阅设备属性上报的主题
at(str_temp);
sprintf(str_temp,"AT+MQTTSUB=0,\"$oc/devices/%s/sys/commands/#\",1",DeviceID);//订阅设备命令接收的主题
at(str_temp);
sprintf(str_temp,"AT+MQTTSUB=0,\"$oc/devices/%s/sys/commands/response/#\",1",DeviceID);//订阅设备命令响应的主题
at(str_temp);
至此,我们以及完成了esp8266模块联网华为云平台了!!! 坚持就是胜利!
订阅的过程也是向华为云平台发送AT指令,进行订阅,这里在上一步已经完成了订阅了!!
(无需进行重复操作,只做简单说明)
sprintf(str_temp,"AT+MQTTSUB=0,\"$oc/devices/%s/sys/properties/report\",1",DeviceID); //订阅设备属性上报的主题
at(str_temp);
sprintf(str_temp,"AT+MQTTSUB=0,\"$oc/devices/%s/sys/commands/#\",1",DeviceID);//订阅设备命令接收的主题
at(str_temp);
sprintf(str_temp,"AT+MQTTSUB=0,\"$oc/devices/%s/sys/commands/response/#\",1",DeviceID);//订阅设备命令响应的主题
at(str_temp);
首先最好是在初始化的过程中做到最简单的在main.c主函数中只需要初始化和一个输出函数就可以获得传感器的值,便于后续上报数据。
如上图所示:length就是超声波传感器所返回的值。
如果不会进行如上的初始化,可在后台私信我,也可以进行评论,看到都会及时回复,后续将发布更详细的传感器讲解文章。
1.进行数据上报只需要在main.c程序中编写printf函数通过串口通信发送上报数据的AT指令即可。
如下代码示例(以此可以类比到温湿度等等数据的上报)
printf("AT+MQTTPUB=0,\"$oc/devices/%s/sys/properties/report\",\"{\\\"services\\\":[{\\\"service_id\\\":\\\"%s\\\"\\,\\\"properties\\\":{\\\"Water\\\": %f}}]}\",0,0\r\n",DeviceID,ServiceID1,length);
其中DeviceID是设备ID,ServiceID1是我们华为云创建的服务,根据自己所创自行修改,length是超声波传感器数据。同时还需要将上述的water改为自己的属性名
1.首先我们可以使用USB转TTL模块连接esp8266模块至电脑端进行串口通信,成功连接华为云并订阅更类消息后,我们在华为云下发命令,观察esp8266模块收到的消息格式。
可以观察到我们esp8266模块会收到如下数据:
2.通过步骤1我们已经知道了华为云平台下发数据的格式后,我们可以在串口中断函数中进行提取重要信息并进行判断执行什么操作。
我们需要提取的数据包括(request_id、以及操作符(我这里是1或0,也可以是ON、off,这些都是在创建云平台时自己设置的) 以及其他判断条件。)
串口中断函数(部分)
if(uart1_rec_i>=192) //
{
strncpy(analysis_Str, uart1_recstring, 12); //提取出“+MQTTSUBRECV”
if(strcmp(analysis_Str,"+MQTTSUBRECV")==0)
{
memset(analysis_Str,0,sizeof(analysis_Str)); //清空缓存区
strncpy(request_id, uart1_recstring+88, 36); //提取出request_id
strncpy(analysis_Str, uart1_recstring+131, 5); //提取出"paras"
if(strcmp(analysis_Str,"paras")==0) //有效参数体
{
memset(analysis_Str,0,sizeof(analysis_Str)); //清空缓存区
strncpy(analysis_Str, uart1_recstring+140,13); //提取出"Wat_1_control"
if(strcmp(analysis_Str,"Wat_1_control")==0)
{
if(uart1_recstring[156]=='0')
{
relay_off();//水泵开启
}
else if(uart1_recstring[156]=='1')
{
relay_on();//水泵关闭
}
printf("AT+MQTTPUB=0,\"$oc/devices/%s/sys/commands/response/request_id=%s\",\"\",0,0\r\n",DeviceID,request_id);//命令响应
}
通过中断函数提取操作符1或0判断执行什么操作;同时在上述步骤中也利用提取到的request_id完成了命令响应。可以观察到华为云平台的消息跟踪如下所示:
至此我们已经完成了硬件端到华为云平台的组网,数据上报,命令下发,命令响应。以上是以超声波传感器的数据上报华为云和华为云下发命令对水泵的控制与响应为例,以此为例可以进行多种传感器的数据上报和对多个设备的控制与响应。包括电机、风扇等等。
对上述硬件端到云平台的操作如有不懂,可以后台私信或直接评论,看到后都会进行回复,需要整个工程的也可以直接联系我。关注我后台发联系方式。
① 登录(身份认证)界面
② 查看数据和下发命令界面
③ 数据可视化分析界面
可以点击数据类型的下拉框选择温度、湿度、二氧化碳浓度、氨气浓度、饲料剩余量、饮用水剩余量等6中数据类型进行可视化分析。
至此,完成了整个智能养殖系统的全栈开发,使用keil编译工具进行开发板程序编写,在到华为云平台的搭建,以及APP的开发。可以再此的基础上进行场景切换,适用于各个场景包括智慧交通,智慧家居等等。
同时,如果需要整个工程的资源,可以后台联系我,获取相关联系方式。
最后,我也将继续更新更多物联网 IoT相关文章,共同学习与进步。