一、环境介绍
单片机采用:STM32F103C8T6
上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。
云平台: 采用中国移动OneNet. 也可以采用腾讯、阿里云、华为云、百度天工物接入、机智云等等。 前面文章有讲解。
协议: 采用MQTT协议
开发软件:keil5
完整项目源码下载: https://download.csdn.net/download/xiaolong1126626497/19766925
二、包含的硬件与实物图介绍
- 一个光敏电阻传感器
- 一个DHT11温湿度传感器
- 一个MQ-5 液化气/天然气/煤气监测传感器
- 一个MQ-2 烟雾传感器
- 3盏LED灯表示窗帘开关、空调开关、电视开关
- 联网WIFI采用: ESP8266
- 最小系统板: STM32F103C8T6
- 物联网服务器: OneNet平台
- 物联网手机APP: 设备云
设备云APP下载地址(Android): https://download.csdn.net/download/xiaolong1126626497/18697132
三、功能介绍
这是基于STM32设计的智能家居控制系统,采用ESP8266连接OneNet云平台。
设备端可以实时采集烟雾浓度、温湿度、煤气天然气浓度到云平台,在云平台网页端或者手机APP上可以远程查看数据,还可以点击云平台界面上的按钮,完成对家里的电器设备控制:窗帘开关、空调开关、电视开关(采用LED灯模拟)等。
四、OneNet创建设备
从0开始创建OneNet设备,参考这里:https://cloud.tencent.com/developer/article/1931954
首地址:https://open.iot.10086.cn/
这是STM32设备端连接OneNet串口打印的提示信息:
登录成功的效果:
数据流收到物联网终端上传的信息。
查看设计的网页界面:
五、程序下载介绍
点击开始编程之后,按下开发板上的RST按钮,即可启动下载。
六、STM32设备端代码
6.1 esp8266.c
代码语言:javascript复制#include "esp8266.h"
struct ESP8266_WIFI esp8266_wifi;
/*
函数功能: 配置ESP8266WIFI为AP模式 TCP服务器模式
函数参数:
char *ssid :将要创建的WIFI热点名称(英文字母)
char *password :将要创建的WIFI热点密码(最短长度8位)
u16 port :TCP服务器的端口号(0~65535)
返 回 值:0表示成功,其他值表示失败
*/
u8 ESP8266_AP_TCP_ServerMode(const char *ssid,const char *password,u16 port)
{
u8 i;
char *find_str=NULL;
char cmd_buffer[100];
/*1. 发送测试指令,检测WIFI是否正常*/
printf("发送测试指令,检测WIFI是否正常...n");
if(ESP8266_SendCmd("ATrn"))return 1;
/*2. 关闭回显*/
printf("关闭回显...n");
if(ESP8266_SendCmd("ATE0rn"))return 2;
/*3. 设置当前WIFI的模式为AP模式*/
printf("设置当前WIFI的模式为AP模式...n");
if(ESP8266_SendCmd("AT CWMODE=2rn"))return 3;
/*4. 复位模块,设置的模式必须复位之后才会生效*/
printf("复位模块...n");
if(ESP8266_SendCmd("AT RSTrn"))return 4;
DelayMs_72M(1000);
DelayMs_72M(1000);
DelayMs_72M(1000);
DelayMs_72M(1000);
/*5. 关闭回显*/
printf("关闭回显...n");
if(ESP8266_SendCmd("ATE0rn"))return 5;
/*6. 设置创建的热点信息*/
printf("设置创建的热点信息...n");
snprintf(cmd_buffer,100,"AT CWSAP="%s","%s",1,4rn",ssid,password);
if(ESP8266_SendCmd(cmd_buffer))return 6;
/*7. 开启多连接,在服务器模式下才可开启*/
printf("开启多连接...n");
if(ESP8266_SendCmd("AT CIPMUX=1rn"))return 7;
/*8. 设置端口号(0~65535)*/
printf("设置端口号...n");
snprintf(cmd_buffer,100,"AT CIPSERVER=1,%drn",port);
if(ESP8266_SendCmd(cmd_buffer))return 8;
/*9.查询本地IP地址*/
printf("查询本地IP地址...n");
if(ESP8266_SendCmd("AT CIFSRrn"))return 9;
/*10. 保存WIFI的信息*/
esp8266_wifi.port=port;
strcpy(esp8266_wifi.mode,"AP");
//提取IP地址
/*
IP地址= CIFSR:APIP,"192.168.4.1"
CIFSR:APMAC,"86:f3:eb:17:e6:86"
*/
find_str=strstr((char*)USART3_RX_BUFF,"APIP");
if(find_str) //判断是否查找成功
{
find_str =6;
for(i=0;*find_str!='"';i )
{
esp8266_wifi.ip[i]=*find_str;
find_str ;
}
esp8266_wifi.ip[i]='