使用STM32+ESP8266(ESP-01S)+点灯科技(手机端Blinker)实现远程控制智能家居

硬件准备:STM32单片机、ESP8266(ESP-01S)、CH340C下载烧录器

dd427d28183c464a9a9c2153781ab739.png

 软件准备: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 < Rx_Buffer_Len;i ++)Rx_Buffer.Data[i] = 0;//清空数组,这很重要
  } 
}

完成以上步骤就实现了STM32->ESP8266通信

下面实现ESP8266发送给STM32数据包,使用Arduino IDE编写

/* 发送ESP8266的数据包给STM32 */
void Write_STM32_Data(int Data_Len)
{
  for(int i = 0;i < Data_Len;i ++)
  {
    Serial.write(Tx_Buffer.Data[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 */

完成以上步骤就实现了ESP8266<=>STM32通信,双向通信,是不是很简单,下面开始点灯科技(Blinker)的学习,点灯科技 (diandeng.tech),点击进入学习,我就不在赘述了,官方教程永远是最好的。

0ae7b0dd18b241eea9e6b1273eb4634d.jpeg

 是不是很酷,我会把完整代码整理后放在github,这需要一些时间,和之前的平衡小车一样,全部开源,有需要的自行下载,我将持续输出!!!!!!

下面是github链接,点击跳转(●^o^●)

GitHub - 999jump999/STM32_ESP8266_Blinker: C#

 

  • 23
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
首先,ESP8266是一款具有Wi-Fi功能的微控制器模块,它可以与Arduino UNO R3进行通信和控制。而光照传感器用于检测环境的光照强度。下面我将用华而不实的例子来说明如何使用ESP8266和Arduino UNO R3进行光照传感器的闪烁灯实验。 首先,我们需要连接ESP8266和Arduino UNO R3。将ESP8266模块的VCC引脚连接到Arduino UNO R3的5V引脚,将GND引脚连接到Arduino UNO R3的GND引脚,将ESP8266的RX引脚连接到Arduino UNO R3的TX引脚,将ESP8266的TX引脚连接到Arduino UNO R3的RX引脚。 接下来,我们需要连接光照传感器。将光照传感器的VCC引脚连接到Arduino UNO R3的5V引脚,将GND引脚连接到Arduino UNO R3的GND引脚,将光照传感器的信号引脚连接到Arduino UNO R3的A0引脚。 接下来,我们需要编写Arduino代码。首先,导入ESP8266WiFi和SoftwareSerial库。然后,在setup函数中初始化串口通信和Wi-Fi连接。在loop函数中,读取光照传感器的数值,并根据数值控制ESP8266的GPIO引脚输出高低电平,以实现闪烁灯效果。 最后,将代码上传到Arduino UNO R3中,并将ESP8266连接到Wi-Fi网络。当光照传感器检测到较强的光照时,闪烁灯会快速闪烁;当光照传感器检测到较弱的光照时,闪烁灯会慢速闪烁。 总结来说,使用ESP8266、Arduino UNO R3和光照传感器可以实现一个具有可调节闪烁频率的光照传感器闪烁灯实验。这个实验可以用于对光照强度的实时监测和视觉提醒。相信这个简单的实验可以帮助大家更好地理解ESP8266和Arduino UNO R3的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值