ESP8266+STM32智能开关

2022 年秋季学期

《STM32 项目实践》课程考核报告

ESP8266+STM32 智能开关

数理与电子信息工程学院

物联网工程

201 班

203021040118

学生姓名 陶志霖 任课教师 杨子靖 提交日期 2022 12 23

一、实现功能

设计一个ESP8266wifi模块和 STM32 单片机结合的智能开关,使其可以实现 温湿度的上传和远程控制开关。

1.实现通过手机 APP 远程获取当时房间内的温湿度和历史数据。

2.实现长按按键 5 秒后,板子上的WIFI模块可实现自动配网,可将实时收 集到的温湿度数据上传到阿里云上。

3.可通过 APP 上的按键实现继电器开或关以达到远程控制效果。

二、硬件设计

1 硬件各个模块介绍。

由于板载的 CH340E 和庆科WIFI模块出现故障,因此本次实验采用同样使用 CH340C 芯片的 ESP8266 & NodeMCU V3 来代替,其板载 CH340C 芯片通过串口与 STM32 进行通信后上传到阿里云。

ESP8266 模块

1、esp8266 是一款入门级的串口 WiFi 模块芯片,专为移动设备,可穿戴电子产 品和物联应用设计,可以通过 AT 指令配置,和单片机上的串口进行通信,利用 WIFI进行数据传输。低功耗小尺寸串口 WiFi模块;

2、它里面有一个 MCU,所以我们可以把它当作 MCU 来使用。常用的功能包括: IO 控制、定时器、中断、PWM、FreeRTOS、串行通信(UART、IIC、SPI)等;

3、可以联网,只要能连接到wifi,还可以通过网络远程控制ESP8266;

4、可以通过第三方网站的API接口获取相关信息;

5、用的也是 CH340 芯片,可以替代板内损坏的 CH340 芯片。

STM32 芯片

STM32 芯片相关参数

电路板实物图

PCB 电路板

电路板原理图

2. 各部分电路设计与分析。

2.1STM32F04MCU:实行代码的运算

2.2ESP8266 模块:实现数据上传阿里云

2.3 继电器驱动模块:控制电路

2.4 供电模块:为板子提供电源

2.5 温湿度模块:检测温湿度

2.6 串口模块:数据传输

2 设计原理

硬件接线

1、STM32 烧录代码,接线 STM32-----STLINKV2

PA13 SWDIO

PA14 SWCLK

3.3V 3.3V

GND GND

2、STM32 连接电脑调试,接线

STM32 串口助手

PA9 RX

PA10 TX

3.3V 3.3V

GND GND

3、STM32 连接 ESP8266,接线

STM32 ESP8266

PA9 RX

PA10 TX

3.3V 3.3V

GND GND

4、STM32 发数据给阿里云 调试时,接线

STLINKV2-----STM32-----ESP8266-----串口模块

5、阿里云给 STM32 发指令

调试时,接线

STLINKV2-----STM32-----ESP8266-----串口模块

三、软件设计

1、框架

ESP8266 连接阿里云,然后与 STM32 进行远程数据传输,数据交换,控制 LED 灯,通过串口传 输温湿度以及开关灯指令的数据 。

阿里云设备

发送指令后,看阿里云账号的设备就在线了,然后可以进行数据收发。

2、阿里云和 ESP8266 配置

2.1、注册阿里云设备信息

在阿里云中选择物联网平台并添加相应的产品信息

创建产品

填写名称 STM32 实训开关和所属品类点击确认

点击刚才创建的 STM32 实训开关定义功能属性

记下标识符

点击设备创建设备

系统会自动创建设备的三元组信息需要记录下来

{

"ProductKey": "a1E2TbVIEQS",

"DeviceName": "2Cv0KvczQtT2WCUw0bVh",

"DeviceSecret": "6a77d37bed25755134db9752f28e8c49"

}

便可以看到连接 MQTT 连接所需要的三元组其中DeviceName 为刚

才我们自行设置设备的名称(注意不是产品名称),至此已经完成了 阿里云上设备的添加。

注意:此时的设别还是处理未激活的状态,需要我们使用 esp8266 连 接成功后,才会显示在线状态。

在 Arduino 中修改刚才记录的信息

至此已经完成了对 esp8266 的配置,此时设备应该可以正常上线。

3、流程图

3、关键程序分析

由于需要在按下开关口计时五秒后配网,根据48MHz 的芯片主频写了一个简单计时函数;在主函数里 面先将需要调用的各种函数初始化,然后在循环里面加入计时函数的触发条件以及出发后发送配网指令,

配网方式一;

当按键按下黄灯闪,然后发送配网指令

配网方式二:

在 Arduino IDE 中写下热点名称

四、功能测试与总结

1. 简单测试效果

串口发送接收数据:

按键控制灯测试:

设备运行效果:

串口接收到的数据以及阿里云收到的数据对比

手机 APP 显示效果

历史数据曲线

2.总结测试效果分析

本次项目各个功能器件除板载WiFi 芯片和 CH340E 无法直接使用外其他 硬件都可以正常使用,智能插座可实现实现通过手机 APP 远程获取当时房间 内的温湿度,也可以用手机系统控制继电器打开电源;该智能插座可以在按 下开关五秒后自动连网并上传当时的温湿度,也可设置手动模式,此模式状 态下使用按键能控制继电器的开关以至于控制插座是否通电。

焊接的时候十分小心,可是因为自己的粗心大意中在测试的时候把 30V 的直流电看成 3.0V 亲眼体验到了一把钽电容的烟花,最后和韦洪雷同学把 剩余的能用的元件重新焊接才完成了本次焊接实验,由于 CH340 和板载的庆 科 WiFi 模块已经损坏,只能采用现有的 ESP8266 来代替,而监控 8266 与 STM32 之间的通信我用 CC2530 开发板底座来进行,其带有一块板载 CH340C 串口芯片。

总之,本次实训课可谓十分难忘,体会到了知识的获取并不是一件很轻 松的事情,只能通过不断犯错不断修改来积累经验。最后,感谢老师和同学 们的帮助,在学习嵌入式的道路上我又走出了一步。

附录

程序和完整电路

1.#include "main.h"

2.

3. int flag = 0;

4. unsigned char flag_kay = 0;

5.

6. int main(void)

7.{

8.

9.

10.

/*初始化 LED 灯*/

11.

LED_init();

12.

/*蜂鸣器初始化*/

13.

Buzzer_init();

14.

/*继电器初始化*/

15.

Relay_init();

16.

/*初始化温湿度传感器 DHT11*/

17.

DHT11_GPIO_Config();

18.

/*按键初始化*/

19.

Key_init();

20.

/*初始化串口 1*/

21.

USART1_Config();

22.

/*初始化 WIFI*/

23.

WIFI_Config();

24.

/*连接 wifi*/

25.

26.

/*蜂鸣器响起*/

27.

BUZZER_ON();

28.

Delay_ms(1550);

29.

/*蜂鸣器不响*/

30.

BUZZER_OFF();

31.

/*循环闪烁灯*/

32.

while(1)

33.

{

34.

USART_PRINTF_FLAG=1;

35.

/*可通过按键实现继电器开或关*/

36.

/*实现长按 5 秒,可实现配网*/

37.

while(getIsKey()==1 && flag<5){

38.

flag++;

39.

YELLOW_LED_ON();

40.

Delay_ms(400);

41.

YELLOW_LED_OFF();

42.

Delay_ms(400);

43.

}

44.

if(flag == 5) {

45.

flag = 0;

46.

USART_PRINTF_FLAG=2;

47.

Delay_ms(90);

48.

printf("%s","AT+ILOPAWSAP\r");

49.

/*发送到调试串口 1*/

50. //

USART_PRINTF_FLAG=1;

51. //

Delay_ms(1);

52. //

printf("%s","AT+ILOPAWSAP\r");

53.

YELLOW_LED_ON();

54.

}

55.

else if(flag > 0){

56.

flag = 0;

57.

YELLOW_LED_OFF();

58.

if(flag_kay == 0)

59.

{

60.

flag_kay = 1;

61.

RELAY_ON();

62.

RED_LED_ON();

63.

}else{

64.

flag_kay = 0;

65.

RELAY_OFF();

66.

RED_LED_OFF();

67.

}

68.

}

69.

70.

delay_val=0;

71.

while(delay_val++<200)

72.

{

73.

if(REC_FLAG==SET)

74.

{

75.

REC_FLAG = RESET;

76.

if(strcmp("ERROR\r\n",Receive_Data)!=0)

77.

{

78.

if(strcmp("+ILOPEVENT:SETJSON,property,16,{\"powe

rstate\":0}\r\n",Receive_Data)!=0)//相等,返回 0

79.

{

80.

if(strcmp("+ILOPEVENT:SETJSON,property,16,{\"

powerstate\":1}\r\n",Receive_Data)!=0)

81.

{

82.

if(strcmp("+ILOPEVENT:ILOP,CONNECTED\r\n",

Receive_Data)!=0)

83.

{

84.

YELLOW_LED_OFF();

85.

}

86.

else

87.

{

88.

YELLOW_LED_ON();

89.

}

90.

}

91.

else

92.

{

93.

RELAY_ON();

94.

}

95.

}

96.

else

97.

{

98.

RELAY_OFF();

99.

}

100.

}

101.

else

102.

{

103.

GPIO_ResetBits(GPIOA,GPIO_Pin_1);//红灯

104.

}

105.

/*串口 1 打印串口 2 接收的数据*/

106.

USART_PRINTF_FLAG=1;

107.

printf("\r\n%s",Receive_Data);

108.

}

109.

Delay_ms(10);

110.

111.

}

112.

/*读取温湿度传感器数据*/

113.

if(Read_DHT11(&dht11_data)==SUCCESS)

114.

{

115.

/*发送当前温湿度到阿里云*/

116.

USART_PRINTF_FLAG=2;

117. sprintf(Send_String,"{\"CurrentHumidity\":%d,\"IndoorT emperature\":%d.%d}" , dht11_data.humi_int, dht11_data.temp_int, dht1 1_data.temp_deci);

118.

len = strlen(Send_String);

119.

printf("AT+ILOPSENDJSON=property,%d\r",len);

120.

Delay_ms(90);

121.

printf("%s",Send_String);

122.

/*发送到调试串口 1*/

123.

USART_PRINTF_FLAG=1;

124.

printf("AT+ILOPSENDJSON=property,%d\r",len);

125.

Delay_ms(1);

126.

printf("%s",Send_String);

127.

128.

}

129. }

130. }

EPS8266 主要代码

1.#include <ESP8266Wi Fi.h>

2./* 依赖 PubSubClient 2.4.0 */

3.#include <PubSubClient.h>

4./* 依赖 ArduinoJson 5.13.4 */

5.#include <ArduinoJson.h>

6.

7.#include <DFRobot_DHT11.h>

8.DFRobot_DHT11 DHT;

9.#define DHT11_PIN 2 //pin2 对应的是 D4 引脚

10.

11. /* 连接您的 WIFI SSID 和密码 */

12. #define WIFI_SSID "vivo"

13. #define WIFI_PASSWD "123456789"

14.

15. /* 设备的三元组信息*/

16. #define PRODUCT_KEY "a1E2TbVIEQS" //阿里云 中对应的设备的 PRODUCT_KEY

17. #define DEVICE_NAME "2Cv0KvczQtT2WCUw0bVh" //修改为 自己阿里云中设备的 DEVICE_NAME

18. #define DEVICE_SECRET "6a77d37bed25755134db9752f28e8c49" //DEVIC E_SECRET

19. #define REGION_ID "cn-shanghai" //注册阿 里云服务器对应的地区

20.

21. /* 线上环境域名和端口号,不需要改 */

22. #define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".ali

"

yuncs.com

23. #define MQTT_PORT 1883

24. #define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY

25. #define CLIENT_ID "a1E2TbVIEQS.2Cv0KvczQtT2WCUw0bVh|securemod e=2,signmethod=hmacsha256,timestamp=1672252581243 |"

26. #define MQTT_PASSWD "b8b88eeca7dbdd39c3b4a4e25cd8509603deba9cc4 1f5a7dd2cdc8269c19e0d6"

27. #define ALINK_BODY_FORMAT "{\"id\":\"a1E2TbVIEQS\",\"version\

":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"

28. #define ALINK_TOPIC_PROP_POST

"/thing/event/property/post"

"/sys/" PRODUCT_KEY "/" DEVICE_NAME

29.

30. //#define ALINK_TOPIC_PROP_POST "/sys/a1E2TbVIEQS/2Cv0KvczQtT2WCU w0bVh/thing/event/property/post" //设置属性上报

31.

32. unsigned long lastMs = 0;

33. float RH,T,RH_sum,T_sum;

34. unsigned char count=0;

35. Wi FiClient espClient;

36. PubSubClient client(espClient);

37. //SHTC3 mySHTC3; 38.

完整电路:

posted @ 2025-06-10 22:22  陶志霖找工作专用  阅读(55)  评论(0)    收藏  举报