我是靠谱客的博主 时尚春天,这篇文章主要介绍物联网毕设(基于stm32的智能家居系统)第二节 硬件端实现前言一、配置ESP8266二、如何给平台发消息三、补充四、文章系列链接五、下载链接 ,现在分享给大家,希望可以做个参考。

第二节 硬件端实现


文章目录

目录

第二节 硬件端实现

文章目录

前言

一、配置ESP8266

1.ESP8266.c

2.ESP8266.h 

3、如何使用

(1)初始化

(2) 进入主程序​

二、如何给平台发消息

1.发消息

三、补充

1 common.c

2 common.h

四、文章系列链接

五、下载链接 



前言


本文主要写如何实现下层

一、配置ESP8266

1.ESP8266.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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
#include "bsp_esp8266.h" #include "common.h" #include <stdio.h> #include <string.h> #include <stdbool.h> #include "bsp_SysTick.h" static void ESP8266_GPIO_Config ( void ); static void ESP8266_USART_Config ( void ); static void ESP8266_USART_NVIC_Configuration ( void ); struct STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 }; struct STRUCT_USARTx_Fram strUSART_Fram_Record = { 0 }; /** * @brief ESP8266初始化函数 * @param 无 * @retval 无 */ void ESP8266_Init ( void ) { ESP8266_GPIO_Config (); ESP8266_USART_Config (); macESP8266_RST_HIGH_LEVEL(); macESP8266_CH_DISABLE(); } /** * @brief 初始化ESP8266用到的GPIO引脚 * @param 无 * @retval 无 */ static void ESP8266_GPIO_Config ( void ) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /* 配置 CH_PD 引脚*/ macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure ); /* 配置 RST 引脚*/ macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN; GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure ); } /** * @brief 初始化ESP8266用到的 USART * @param 无 * @retval 无 */ static void ESP8266_USART_Config ( void ) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* config USART clock */ macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE ); macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE ); /* USART GPIO config */ /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure); /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure); /* USART1 mode config */ USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(macESP8266_USARTx, &USART_InitStructure); /* 中断配置 */ USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断 USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //使能串口总线空闲中断 ESP8266_USART_NVIC_Configuration (); USART_Cmd(macESP8266_USARTx, ENABLE); } /** * @brief 配置 ESP8266 USART 的 NVIC 中断 * @param 无 * @retval 无 */ static void ESP8266_USART_NVIC_Configuration ( void ) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x ); /* Enable the USART2 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /* * 函数名:ESP8266_Rst * 描述 :重启WF-ESP8266模块 * 输入 :无 * 返回 : 无 * 调用 :被 ESP8266_AT_Test 调用 */ void ESP8266_Rst ( void ) { #if 0 ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 ); #else macESP8266_RST_LOW_LEVEL(); Delay_ms ( 500 ); macESP8266_RST_HIGH_LEVEL(); #endif } /* * 函数名:ESP8266_Cmd * 描述 :对WF-ESP8266模块发送AT指令 * 输入 :cmd,待发送的指令 * reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系 * waittime,等待响应的时间 * 返回 : 1,指令发送成功 * 0,指令发送失败 * 调用 :被外部调用 */ bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ) { strEsp8266_Fram_Record .InfBit .FramLength = 0; //从新开始接收新的数据包 printf ( "%srn", cmd ); if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //不需要接收数据 return true; Delay_ms ( waittime ); //延时 strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = ''; printf ( "%s", strEsp8266_Fram_Record .Data_RX_BUF ); strEsp8266_Fram_Record .InfBit .FramLength = 0; //清除接收标志 strEsp8266_Fram_Record.InfBit.FramFinishFlag = 0; if ( ( reply1 != 0 ) && ( reply2 != 0 ) ) return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) || ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); else if ( reply1 != 0 ) return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ); else return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); } /* * 函数名:ESP8266_AT_Test * 描述 :对WF-ESP8266模块进行AT测试启动 * 输入 :无 * 返回 : 无 * 调用 :被外部调用 */ //void ESP8266_AT_Test ( void ) //{ // macESP8266_RST_HIGH_LEVEL(); // // Delay_ms ( 1000 ); // // while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) ESP8266_Rst (); //} void ESP8266_AT_Test ( void ) { char count=0; macESP8266_RST_HIGH_LEVEL(); Delay_ms ( 2000 ); while ( count < 10 ) { if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return; ESP8266_Rst(); ++ count; } } /* * 函数名:ESP8266_Net_Mode_Choose * 描述 :选择WF-ESP8266模块的工作模式 * 输入 :enumMode,工作模式 * 返回 : 1,选择成功 * 0,选择失败 * 调用 :被外部调用 */ bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode ) { switch ( enumMode ) { case STA: return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 ); case AP: return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 ); case STA_AP: return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 ); default: return false; } } /* * 函数名:ESP8266_JoinAP * 描述 :WF-ESP8266模块连接外部WiFi * 输入 :pSSID,WiFi名称字符串 * :pPassWord,WiFi密码字符串 * 返回 : 1,连接成功 * 0,连接失败 * 调用 :被外部调用 */ bool ESP8266_JoinAP ( char * pSSID, char * pPassWord ) { char cCmd [120]; sprintf ( cCmd, "AT+CWJAP="%s","%s"", pSSID, pPassWord ); return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 ); } /* * 函数名:ESP8266_BuildAP * 描述 :WF-ESP8266模块创建WiFi热点 * 输入 :pSSID,WiFi名称字符串 * :pPassWord,WiFi密码字符串 * :enunPsdMode,WiFi加密方式代号字符串 * 返回 : 1,创建成功 * 0,创建失败 * 调用 :被外部调用 */ bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode ) { char cCmd [120]; sprintf ( cCmd, "AT+CWSAP="%s","%s",1,%d", pSSID, pPassWord, enunPsdMode ); return ESP8266_Cmd ( cCmd, "OK", 0, 1000 ); } /* * 函数名:ESP8266_Enable_MultipleId * 描述 :WF-ESP8266模块启动多连接 * 输入 :enumEnUnvarnishTx,配置是否多连接 * 返回 : 1,配置成功 * 0,配置失败 * 调用 :被外部调用 */ bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx ) { char cStr [20]; sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) ); return ESP8266_Cmd ( cStr, "OK", 0, 500 ); } /* * 函数名:ESP8266_Link_Server * 描述 :WF-ESP8266模块连接外部服务器 * 输入 :enumE,网络协议 * :ip,服务器IP字符串 * :ComNum,服务器端口字符串 * :id,模块连接服务器的ID * 返回 : 1,连接成功 * 0,连接失败 * 调用 :被外部调用 */ bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id) { char cStr [100] = { 0 }, cCmd [120]; switch ( enumE ) { case enumTCP: sprintf ( cStr, ""%s","%s",%s", "TCP", ip, ComNum ); break; case enumUDP: sprintf ( cStr, ""%s","%s",%s", "UDP", ip, ComNum ); break; default: break; } if ( id < 5 ) sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr); else sprintf ( cCmd, "AT+CIPSTART=%s", cStr ); return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 ); } /* * 函数名:ESP8266_StartOrShutServer * 描述 :WF-ESP8266模块开启或关闭服务器模式 * 输入 :enumMode,开启/关闭 * :pPortNum,服务器端口号字符串 * :pTimeOver,服务器超时时间字符串,单位:秒 * 返回 : 1,操作成功 * 0,操作失败 * 调用 :被外部调用 */ bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver ) { char cCmd1 [120], cCmd2 [120]; if ( enumMode ) { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum ); sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver ); return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) && ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) ); } else { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum ); return ESP8266_Cmd ( cCmd1, "OK", 0, 500 ); } } /* * 函数名:ESP8266_Get_LinkStatus * 描述 :获取 WF-ESP8266 的连接状态,较适合单端口时使用 * 输入 :无 * 返回 : 2,获得ip * 3,建立连接 * 3,失去连接 * 0,获取状态失败 * 调用 :被外部调用 */ uint8_t ESP8266_Get_LinkStatus ( void ) { if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ) { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2rn" ) ) return 2; else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3rn" ) ) return 3; else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4rn" ) ) return 4; } return 0; } /* * 函数名:ESP8266_Get_IdLinkStatus * 描述 :获取 WF-ESP8266 的端口(Id)连接状态,较适合多端口时使用 * 输入 :无 * 返回 : 端口(Id)的连接状态,低5位为有效位,分别对应Id5~0,某位若置1表该Id建立了连接,若被清0表该Id未建立连接 * 调用 :被外部调用 */ uint8_t ESP8266_Get_IdLinkStatus ( void ) { uint8_t ucIdLinkStatus = 0x00; if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ) { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) ) ucIdLinkStatus |= 0x01; else ucIdLinkStatus &= ~ 0x01; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) ) ucIdLinkStatus |= 0x02; else ucIdLinkStatus &= ~ 0x02; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) ) ucIdLinkStatus |= 0x04; else ucIdLinkStatus &= ~ 0x04; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) ) ucIdLinkStatus |= 0x08; else ucIdLinkStatus &= ~ 0x08; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) ) ucIdLinkStatus |= 0x10; else ucIdLinkStatus &= ~ 0x10; } return ucIdLinkStatus; } /* * 函数名:ESP8266_Inquire_ApIp * 描述 :获取 F-ESP8266 的 AP IP * 输入 :pApIp,存放 AP IP 的数组的首地址 * ucArrayLength,存放 AP IP 的数组的长度 * 返回 : 0,获取失败 * 1,获取成功 * 调用 :被外部调用 */ uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength ) { char uc; char * pCh; ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 ); pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,"" ); if ( pCh ) pCh += 6; else return 0; for ( uc = 0; uc < ucArrayLength; uc ++ ) { pApIp [ uc ] = * ( pCh + uc); if ( pApIp [ uc ] == '"' ) { pApIp [ uc ] = ''; break; } } return 1; } /* * 函数名:ESP8266_UnvarnishSend * 描述 :配置WF-ESP8266模块进入透传发送 * 输入 :无 * 返回 : 1,配置成功 * 0,配置失败 * 调用 :被外部调用 */ bool ESP8266_UnvarnishSend ( void ) { if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) ) return false; return ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 ); } /* * 函数名:ESP8266_ExitUnvarnishSend * 描述 :配置WF-ESP8266模块退出透传模式 * 输入 :无 * 返回 : 无 * 调用 :被外部调用 */ void ESP8266_ExitUnvarnishSend ( void ) { Delay_ms ( 1000 ); macESP8266_Usart ( "+++" ); Delay_ms ( 500 ); } /* * 函数名:ESP8266_SendString * 描述 :WF-ESP8266模块发送字符串 * 输入 :enumEnUnvarnishTx,声明是否已使能了透传模式 * :pStr,要发送的字符串 * :ulStrLength,要发送的字符串的字节数 * :ucId,哪个ID发送的字符串 * 返回 : 1,发送成功 * 0,发送失败 * 调用 :被外部调用 */ bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId ) { char cStr [20]; bool bRet = false; if ( enumEnUnvarnishTx ) { macESP8266_Usart ( "%s", pStr ); bRet = true; } else { if ( ucId < 5 ) sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 ); else sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 ); ESP8266_Cmd ( cStr, "> ", 0, 1000 ); bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 ); } return bRet; } /* * 函数名:ESP8266_ReceiveString * 描述 :WF-ESP8266模块接收字符串 * 输入 :enumEnUnvarnishTx,声明是否已使能了透传模式 * 返回 : 接收到的字符串首地址 * 调用 :被外部调用 */ char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx ) { char * pRecStr = 0; strEsp8266_Fram_Record .InfBit .FramLength = 0; strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0; while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag ); strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = ''; if ( enumEnUnvarnishTx ) pRecStr = strEsp8266_Fram_Record .Data_RX_BUF; else { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) ) pRecStr = strEsp8266_Fram_Record .Data_RX_BUF; } return pRecStr; }

2.ESP8266.h 

复制代码
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
#ifndef __BSP_ESP8266_H #define __BSP_ESP8266_H #include "stm32f10x.h" #include "common.h" #include <stdio.h> #include <stdbool.h> #if defined ( __CC_ARM ) #pragma anon_unions #endif /******************************* ESP8266 数据类型定义 ***************************/ typedef enum{ STA, AP, STA_AP } ENUM_Net_ModeTypeDef; typedef enum{ enumTCP, enumUDP, } ENUM_NetPro_TypeDef; typedef enum{ Multiple_ID_0 = 0, Multiple_ID_1 = 1, Multiple_ID_2 = 2, Multiple_ID_3 = 3, Multiple_ID_4 = 4, Single_ID_0 = 5, } ENUM_ID_NO_TypeDef; typedef enum{ OPEN = 0, WEP = 1, WPA_PSK = 2, WPA2_PSK = 3, WPA_WPA2_PSK = 4, } ENUM_AP_PsdMode_TypeDef; /******************************* ESP8266 外部全局变量声明 ***************************/ #define RX_BUF_MAX_LEN 1024 //最大接收缓存字节数 extern struct STRUCT_USARTx_Fram //串口数据帧的处理结构体 { char Data_RX_BUF [ RX_BUF_MAX_LEN ]; union { __IO u16 InfAll; struct { __IO u16 FramLength :15; // 14:0 __IO u16 FramFinishFlag :1; // 15 } InfBit; }; } strEsp8266_Fram_Record; extern struct STRUCT_USARTx_Fram strUSART_Fram_Record; /******************************** ESP8266 连接引脚定义 ***********************************/ #define macESP8266_CH_PD_APBxClock_FUN RCC_APB2PeriphClockCmd #define macESP8266_CH_PD_CLK RCC_APB2Periph_GPIOB #define macESP8266_CH_PD_PORT GPIOB #define macESP8266_CH_PD_PIN GPIO_Pin_8 #define macESP8266_RST_APBxClock_FUN RCC_APB2PeriphClockCmd #define macESP8266_RST_CLK RCC_APB2Periph_GPIOB #define macESP8266_RST_PORT GPIOB #define macESP8266_RST_PIN GPIO_Pin_9 #define macESP8266_USART_BAUD_RATE 115200 #define macESP8266_USARTx USART3 #define macESP8266_USART_APBxClock_FUN RCC_APB1PeriphClockCmd #define macESP8266_USART_CLK RCC_APB1Periph_USART3 #define macESP8266_USART_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd #define macESP8266_USART_GPIO_CLK RCC_APB2Periph_GPIOB #define macESP8266_USART_TX_PORT GPIOB #define macESP8266_USART_TX_PIN GPIO_Pin_10 #define macESP8266_USART_RX_PORT GPIOB #define macESP8266_USART_RX_PIN GPIO_Pin_11 #define macESP8266_USART_IRQ USART3_IRQn #define macESP8266_USART_INT_FUN USART3_IRQHandler /*********************************************** ESP8266 函数宏定义 *******************************************/ #define macESP8266_Usart( fmt, ... ) USART_printf ( macESP8266_USARTx, fmt, ##__VA_ARGS__ ) #define macPC_Usart( fmt, ... ) printf ( fmt, ##__VA_ARGS__ ) //#define macPC_Usart( fmt, ... ) #define macESP8266_CH_ENABLE() GPIO_SetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN ) #define macESP8266_CH_DISABLE() GPIO_ResetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN ) #define macESP8266_RST_HIGH_LEVEL() GPIO_SetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN ) #define macESP8266_RST_LOW_LEVEL() GPIO_ResetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN ) /****************************************** ESP8266 函数声明 ***********************************************/ void ESP8266_Init ( void ); void ESP8266_Rst ( void ); bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ); void ESP8266_AT_Test ( void ); bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode ); bool ESP8266_JoinAP ( char * pSSID, char * pPassWord ); bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode ); bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx ); bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id); bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver ); uint8_t ESP8266_Get_LinkStatus ( void ); uint8_t ESP8266_Get_IdLinkStatus ( void ); uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength ); bool ESP8266_UnvarnishSend ( void ); void ESP8266_ExitUnvarnishSend ( void ); bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId ); char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx ); #endif

3、如何使用

(1)初始化

(2) 进入主程序

二、如何给平台发消息

1.发消息

代码如下(示例):

首先使用一个字符串拼接设备数据

再使用ESP8266_SendString()函数发送给云平台

复制代码
1
2
sprintf ( LED3, "POST /devices/735480495/datapoints?type=5 HTTP/1.1napi-key:FN8vCnpwAjyjTV2m1y=zpL451i4=nHost:api.heclouds.comnContent-Length:8nn,;led3,%d",ucLed3Status); ESP8266_SendString ( ENABLE, LED3, 2, Single_ID_0 );

三、补充

1 common.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
#include "common.h" #include "stm32f10x.h" #include <stdarg.h> static char *                 itoa                                ( int value, char * string, int radix ); /*  * 函数名:USART2_printf  * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库  * 输入  :-USARTx 串口通道,这里只用到了串口2,即USART2  *             -Data   要发送到串口的内容的指针  *               -...    其他参数  * 输出  :无  * 返回  :无   * 调用  :外部调用  *         典型应用USART2_printf( USART2, "rn this is a demo rn" );  *                     USART2_printf( USART2, "rn %d rn", i );  *                     USART2_printf( USART2, "rn %s rn", j );  */ void USART_printf ( USART_TypeDef * USARTx, char * Data, ... ) {     const char *s;     int d;        char buf[16];          va_list ap;     va_start(ap, Data);     while ( * Data != 0 )     // 判断是否到达字符串结束符     {                                                   if ( * Data == 0x5c )  //''         {                                                   switch ( *++Data )             {                 case 'r':                                      //回车符                 USART_SendData(USARTx, 0x0d);                 Data ++;                 break;                 case 'n':                                      //换行符                 USART_SendData(USARTx, 0x0a);                     Data ++;                 break;                 default:                 Data ++;                 break;             }                      }                  else if ( * Data == '%')         {                                      //             switch ( *++Data )             {                                 case 's':                                          //字符串                 s = va_arg(ap, const char *);                                  for ( ; *s; s++)                  {                     USART_SendData(USARTx,*s);                     while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );                 }                                  Data++;                                  break;                 case 'd':                                 //十进制                 d = va_arg(ap, int);                                  itoa(d, buf, 10);                                  for (s = buf; *s; s++)                  {                     USART_SendData(USARTx,*s);                     while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );                 }                                  Data++;                                  break;                                  default:                 Data++;                                  break;                              }                  }                  else USART_SendData(USARTx, *Data++);                  while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET );              } } /*  * 函数名:itoa  * 描述  :将整形数据转换成字符串  * 输入  :-radix =10 表示10进制,其他结果为0  *         -value 要转换的整形数  *         -buf 转换后的字符串  *         -radix = 10  * 输出  :无  * 返回  :无  * 调用  :被USART2_printf()调用  */ static char * itoa( int value, char *string, int radix ) {     int     i, d;     int     flag = 0;     char    *ptr = string;     /* This implementation only works for decimal numbers. */     if (radix != 10)     {         *ptr = 0;         return string;     }     if (!value)     {         *ptr++ = 0x30;         *ptr = 0;         return string;     }     /* if this is a negative value insert the minus sign. */     if (value < 0)     {         *ptr++ = '-';         /* Make the value positive. */         value *= -1;              }     for (i = 10000; i > 0; i /= 10)     {         d = value / i;         if (d || flag)         {             *ptr++ = (char)(d + 0x30);             value -= (d * i);             flag = 1;         }     }     /* Null terminate the string. */     *ptr = 0;     return string; } /* NCL_Itoa */



2 common.h

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef __COMMON_H #define __COMMON_H #include "stm32f10x.h" /******************************* 宏定义 ***************************/ #define macNVIC_PriorityGroup_x NVIC_PriorityGroup_2 /********************************** 函数声明 ***************************************/ void USART_printf ( USART_TypeDef * USARTx, char * Data, ... ); #endif /* __COMMON_H */

四、文章系列链接

第一节 模块介绍https://blog.csdn.net/herui_2/article/details/123964721

五、下载链接 

硬件代码https://download.csdn.net/download/herui_2/85078622

最后

以上就是时尚春天最近收集整理的关于物联网毕设(基于stm32的智能家居系统)第二节 硬件端实现前言一、配置ESP8266二、如何给平台发消息三、补充四、文章系列链接五、下载链接 的全部内容,更多相关物联网毕设(基于stm32的智能家居系统)第二节内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部