STM32+ESP8266-小白物联网智能家居项目
物联网demo
- 物料清单
- STM32C8T6(进口)
- ESP826601S
- DHT11
- 0.96OLEDIIC
- 按键 4P 665 直插
- 下载器:ST-LINK
PCB设计
onenet-show工程
初始化代码
- 选择芯片 STM32F103C8
- Define 高等容量 STM32F10X_MD, USE_STDPERIPH_DRIVER
报错
error: L6235E: More than one section matches selector - cannot all be FIRST/LAST.
原因:项目中同时包含以下启动文件,
startup_stm32f10x_hd.s
startup_stm32f10x_md.s
startup_stm32f10x_ld.s
......
应该针对不同的CPU选择不同的启动文件。
解决办法1:从项目中删除不相关的启动文件
解决办法2:右击不相关的启动文件,点击 options for file ‘startup_stm32f10x_md.s’…
在弹出的对话框中的properties页,勾去灰化的’Include in Target Build’和‘Always Build’两项。
- main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171//单片机头文件
//网络协议层
//网络设备
//硬件驱动
//C库
void Hardware_Init(void);
void Display_Init(void);
void Refresh_Data(void);
u8 temp,humi;
/*
************************************************************
* 函数名称: main
*
* 函数功能:
*
* 入口参数: 无
*
* 返回参数: 0
*
* 说明:
************************************************************
*/
int main(void)
{
unsigned short timeCount = 0; //发送间隔变量
unsigned char *dataPtr = NULL;
Hardware_Init(); //初始化外围硬件
ESP8266_Init(); //初始化ESP8266
// UsartPrintf(USART_DEBUG, "Connect MQTTs Server...\r\n");
OLED_Clear(); OLED_ShowString(0,0,"Connect MQTTs Server...",16);
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
DelayXms(500);
// UsartPrintf(USART_DEBUG, "Connect MQTT Server Success\r\n");
OLED_ShowString(0,4,"Connect MQTT Server Success",16); DelayXms(500);
OLED_Clear(); OLED_ShowString(0,0,"Device login ...",16);
while(OneNet_DevLink()) //接入OneNET
{
ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT");
DelayXms(500);
}
OneNET_Subscribe();
Display_Init();
while(1)
{
if(++timeCount >= 100) //发送间隔5s
{
DHT11_Read_Data(&temp,&humi);
// UsartPrintf(USART_DEBUG, "OneNet_SendData\r\n");
OneNet_SendData(); //发送数据
timeCount = 0;
ESP8266_Clear();
}
dataPtr = ESP8266_GetIPD(0);
if(dataPtr != NULL)
OneNet_RevPro(dataPtr);
Refresh_Data();
DelayMs(10);
}
}
/*
************************************************************
* 函数名称: Hardware_Init
*
* 函数功能: 硬件初始化
*
* 入口参数: 无
*
* 返回参数: 无
*
* 说明: 初始化单片机功能以及外接设备
************************************************************
*/
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
Delay_Init(); //systick初始化
Usart1_Init(115200); //串口1,打印信息用
Usart2_Init(115200); //串口2,驱动ESP8266用
Key_Init();
Led_Init(); //蜂鸣器初始化
OLED_Init(); //初始化OLED
while(DHT11_Init())
{
// UsartPrintf(USART_DEBUG, "DHT11 Error \r\n");
OLED_ShowString(0,0,"DHT11 Error",16);
DelayMs(1000);
}
// UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
OLED_Clear(); OLED_ShowString(0,0,"Hardware init OK",16); DelayMs(1000);
}
void Display_Init(void)
{
OLED_Clear();
OLED_ShowCHinese(0,0,1);//温
OLED_ShowCHinese(18,0,2);//度
OLED_ShowCHinese(36,0,0);//:
OLED_ShowCHinese(72,0,3);//℃
OLED_ShowCHinese(0,3,4);//湿
OLED_ShowCHinese(18,3,5);//度
OLED_ShowCHinese(36,3,0);//:
OLED_ShowString(72,3,"%",16);//%
OLED_ShowCHinese(0,6,6);//台
OLED_ShowCHinese(18,6,7);//灯
OLED_ShowCHinese(36,6,0);//:
}
void Refresh_Data(void)
{
char buf[3];
sprintf(buf, "%2d", temp);
OLED_ShowString(54,0,buf,16); //温度值
sprintf(buf, "%2d", humi);
OLED_ShowString(54,3,buf,16); //湿度值
if(led_info.Led_Status) OLED_ShowCHinese(54,6,8);//亮
else OLED_ShowCHinese(54,6,9);//灭
}
点亮LED
1 | //单片机头文件 |
按键控制LED
1 | //单片机头文件 |
获取DHT11温湿度数据
1 | /***************STM32F103C8T6********************** |
ESP8266连接WiFi
1 |
连接MQTT
1 |
App主要代码
1 | <template> |