行业知识
使用STM32+ESP8266(ESP-01S)+点灯科技(手机端Blinker)实现远程控制智能家居
���件准备:STM32单片机、ESP8266(ESP-01S)、CH340C下载烧录器
软件准备:STM32CubeMX、Keil uVision5、Arduino IDE、 点灯科技(手机端APP Blinker)点灯科技 (diandeng.tech)点击进入
值得注意的是:ESP-01S只有一个串口,也就是UART(Universal Asynchronous Receiver/Transmitter ),它包括RXD和TXD两个引脚,分别用于接收和发送数据。由于ESP-01S只有一个串口,因此需要进行多路复用,以实现不同的功能。
我也是用的这一个串口进行的STM32与ESP8266通信,因为只有一个串口所以会对程序调试方面造成一些麻烦,但是我都解决了,后面细说。
程序我只写了个大概的框架,通信方面的解决了,实现温湿度显示、点灯 什么的,后面只需要填功能代码就可以了,,最近在学Linux,有时间再完善。
先开始STM32给ESP8266发送数据包的主要代码,使用Keil uVision5编写:
为什么要发送数据包,因为可以避免干扰和消除错误数据
先定义结构体
/*串口收发数据结构体*/typedef struct { uint8_t Data[256]; //接收数据存储区uint8_t RxBuf; //接收缓冲区 uint8_t Count; uint8_t Flag;} USART_DataStruct;USART_DataStruct UART2_Tx_Buffer = {0xAA, 0x55, 0x00, 0x00, 0x66}; while()循环里,我设置的是两秒发送一次温湿度数据,建议自行修改适合自己的参数
UART2_Tx_Buffer.Data[2] = temperature;UART2_Tx_Buffer.Data[3] = humidity;if(TIM6_delay.flag_2s == 1){HAL_UART_Transmit_IT(&huart2,UART2_Tx_Buffer.Data,5);TIM6_delay.flag_2s = 0;} 完成以上步骤就完成了简单的数据包发送,接下来是ESP8266接收数据包,使用Arduino IDE编写
#define Rx_Buffer_Len 5/*串口收发数据结构体*/struct USART_DataStruct{ int Data[20]; //接收数据存储区 int RxBuf; //接收缓冲区 int Count; int Flag;} ;struct USART_DataStruct Tx_Buffer = {0x55,0xAA,0x00,0x00,0x00,0x00,0x66};/* 接收STM32串口发送来的数据包 */void Read_STM32_Data(void) { if(Serial.available() > 0) // 如果缓冲区中有数据,则读取并输出 { Rx_Buffer.Data[Rx_Buffer.Count] = Serial.read();//读取传入或到达的数据字节 Rx_Buffer.Count ++; //计数自增 /*进行包头校验*/ if(Rx_Buffer.Flag == 0)//置位接收开始标志 { if(1 == Rx_Buffer.Count) { if(0xAA != Rx_Buffer.Data[0])//0xAA数据包头1 Rx_Buffer.Count = 0; } else if(2 == Rx_Buffer.Count) { if(0xAA == Rx_Buffer.Data[1])//0xAA数据包头1 Rx_Buffer.Count = 1; else if(0x55 != Rx_Buffer.Data[1])//0x55数据包头2 Rx_Buffer.Count = 0; } else { /*进行包尾校验*/ if(0x66 == Rx_Buffer.Data[Rx_Buffer_Len - 1])//0x66数据包尾 { /*获取接收到的数据包中的重要信息*/ temperature = Rx_Buffer.Data[2];//获取温度数据 humidity = Rx_Buffer.Data[3];//获取湿度数据 Rx_Buffer.Count = 0;//计数清零 Rx_Buffer.Flag = 1;//置位接收完成标志 } } } }}void setup(){ // 初始化串口 Serial.begin(115200);}void loop() { Read_STM32_Data(); if(Rx_Buffer.Flag == 1)//接收完成标志 { Rx_Buffer.Flag = 0;//接收完成标志清零 /*获取接收到的数据包中的重要信息*/ temperature = Rx_Buffer.Data[2];//获取温度数据 humidity = Rx_Buffer.Data[3];//获取湿度数据 for(int i = 0;i 完成以上步骤就实现了STM32->ESP8266通信
下面实现ESP8266发送给STM32数据包,使用Arduino IDE编写
/* 发送ESP8266的数据包给STM32 */void Write_STM32_Data(int Data_Len){ for(int i = 0;i 注意:因为ESP8266就只有一个串口,所以要把别的像Serial.print("xxxxxx");这样的函数屏蔽掉,不然会有干扰
下面实现STM32接收ESP8266发送的数据包,使用Keil uVision5编写:
main()函数里加上这样一句代码,先开启串口接收中断
HAL_UART_Receive_IT(&huart2,&UART2_Rx_Buffer.RxBuf,1); //打开串口接收中断
/* USER CODE BEGIN 1 */USART_DataStruct UART2_Rx_Buffer;void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart ->Instance == USART2){if(UART2_Rx_Buffer.Flag == 0) //置位接收开始标志{UART2_Rx_Buffer.Data[UART2_Rx_Buffer.Count] = UART2_Rx_Buffer.RxBuf;UART2_Rx_Buffer.Count ++;/*进行包头校验*/if(1 == UART2_Rx_Buffer.Count){if (0x55 != UART2_Rx_Buffer.Data[0]) UART2_Rx_Buffer.Count = 0;}else if(2 == UART2_Rx_Buffer.Count){if(0x55 == UART2_Rx_Buffer.Data[1])UART2_Rx_Buffer.Count = 1; else if(0xAA != UART2_Rx_Buffer.Data[1]) UART2_Rx_Buffer.Count = 0; else;}else {if(0x66 == UART2_Rx_Buffer.Data[6]) {UART2_Rx_Buffer.Count = 0;UART2_Rx_Buffer.Flag = 1; //置位接收完成标志 }}}}HAL_UART_Receive_IT(&huart2,&UART2_Rx_Buffer.RxBuf,1); //打开串口接收中断}/* USER CODE END 1 */ 完成以上步骤就实现了ESP8266STM32通信,双向通信,是不是很简单,下面开始点灯科技(Blinker)的学习,点灯科技 (diandeng.tech),点击进入学习,我就不在赘述了,官方教程永远是最好的。
是不是很酷,我会把完整代码整理后放在github,这需要一些时间,和之前的平衡小车一样,全部开源,有需要的自行下载,我将持续输出!!!!!!
下面是github链接,点击跳转(●^o^●)
GitHub - 999jump999/STM32_ESP8266_Blinker: C#
下一篇:私人服务器怎么用?