使用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#

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/456577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业界真实的推荐系统(小红书)-用户行为序列建模:LastN、DIN、SIM

课程特点&#xff1a;系统、清晰、实用&#xff0c;原理和落地经验兼具 b站&#xff1a;https://www.bilibili.com/video/BV1HZ421U77y/?spm_id_from333.337.search-card.all.click&vd_sourceb60d8ab7e659b10ea6ea743ede0c5b48 讲义&#xff1a;https://github.com/wangsh…

武汉灰京文化:RPG手游营造的奇幻世界

近年来&#xff0c;RPG手游在游戏市场上异军突起&#xff0c;成为年轻玩家追逐的焦点。这类游戏以其深度的游戏体验和吸引人的故事情节&#xff0c;吸引了大批玩家投入其中。那么&#xff0c;为何热衷于RPG手游&#xff1f;本文武汉灰京文化将从社交互动、沉浸式体验、成就感和…

压缩json字符串

GZIPOutputStream 需要关闭&#xff0c;而 ByteArrayOutputStream 不需要关闭。具体原因如下&#xff1a; GZIPOutputStream&#xff1a;GZIPOutputStream是一种过滤流&#xff0c;它提供了将数据压缩为GZIP格式的功能。当使用此类的实例写入数据时&#xff0c;它会对数据进行压…

C++ 网络编程学习五

C网络编程学习五 网络结构的更新单例模式懒汉单例模式饿汉单例模式懒汉式指针智能指针设计单例类 服务器优雅退出asio的多线程模型IOServiceasio多线程IOThreadPoolepoll 和 iocp的一些知识点 网络结构的更新 asio网络层&#xff0c;会使用io_context进行数据封装&#xff0c;…

pgsql常用索引简写

文章来源&#xff1a;互联网博客文章&#xff0c;后续有时间再来细化整理。 在数据库查询中&#xff0c;合理的使用索引&#xff0c;可以极大提升数据库查询效率&#xff0c;充分利用系统资源。这个随着数据量的增加得到提升&#xff0c;越大越明显&#xff0c;也和业务线有关…

数据库 04-02 实体属性修改,E-R图,强弱实体集

01.开始设计E-R图的时候&#xff0c;第一个步骤是选择实体&#xff0c;而后选择实体的属性 例子&#xff1a; 02.实体属性的冗余 例子1&#xff1a; 两个实体集&#xff1a; 一个联系集&#xff1a; 属性departname 效果&#xff1a; 例子2&#xff1a; 两个实体集&am…

MySQL中出现‘max_allowed_packet‘ variable.如何解决

默认情况下&#xff0c;MySQL的max_allowed_packet参数可能设置得相对较小&#xff0c;这对于大多数常规操作来说足够了。但是&#xff0c;当你尝试执行包含大量数据的操作&#xff08;如大批量插入或大型查询&#xff09;时&#xff0c;可能会超过这个限制&#xff0c;从而导致…

DVWA-master 存储型xss

什么是存储型xss 存储型xss意味着可以与数据库产生交互的&#xff0c;可以直接存在数据库中 先将DVWA安全等级改为低 先随便写点东西上传 我们发现上传的内容会被显示&#xff0c;怎么显示的呢&#xff1f; 它先是上传到数据库中&#xff0c;然后通过数据库查询语句将内容回显 …

史上最牛Linux详解,看完直接带你由入门到精通!

第一部分&#xff1a;入门 第二部分&#xff1a;成为一名linux高级用户&#xff1a; 第三部分&#xff1a;成为一名Linux系统管理员 第四部分&#xff1a;成为一名Linux服务器管理员 因文章内容过长&#xff0c;目录先放这些&#xff0c;因为接下来还要放一些内容 小编13年上海…

如何在Linux部署Docker Registry本地镜像仓库并实现无公网IP远程连接

文章目录 1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)…

DB算法原理与构建

参考&#xff1a; https://aistudio.baidu.com/projectdetail/4483048 Real-Time Scene Text Detection with Differentiable Binarization 如何读论文-by 李沐 DB (Real-Time Scene Text Detection with Differentiable Binarization) 原理 DB是一个基于分割的文本检测算…

如何在idea中配置tomcat服务器,然后部署一个项目

文章目录 前言第一步 先新建一个空项目第二步 添加框架支持第三步 添加配置及如何部署最后一步 运行及检查有没有问题总结 前言 本章学习的是在idea中配置tomcat服务器&#xff0c;然后部署一个项目 如果没有下载Tomcat服务器的可以在上一个博客观看下载及手动部署&#xff0c;…

pytorch之诗词生成3--utils

先上代码&#xff1a; import numpy as np import settingsdef generate_random_poetry(tokenizer, model, s):"""随机生成一首诗:param tokenizer: 分词器:param model: 用于生成古诗的模型:param s: 用于生成古诗的起始字符串&#xff0c;默认为空串:return: …

Kubernetes operator(十) kubebuilder 实战演练 之 开发多版本CronJob【更新中】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第十篇&#xff0c;本节会在前篇开发的Cronjob基础上&#xff0c;进行 多版本Operator 开发的实战 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.c…

豆瓣书影音存入Notion

使用Python将图书和影视数据存放入Notion中。 &#x1f5bc;️介绍 环境 Python 3.10 &#xff08;建议 3.11 及以上&#xff09;Pycharm / Vs Code / Vs Code Studio 项目结构 │ .env │ main.py - 主函数、执行程序 │ new_book.txt - 上一次更新书籍 │ new_video.…

13-Vue基础之路由

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

26-1 SQL 注入攻击 - delete注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、注入原理: 对于后台来说,delete操作通常是将对应的id传递到后台,然后后台会删除该id对应的数据。 如果后台没有对接收到的 id 参数进行充分的验证和过滤,恶意用户可能会…

一、NLP中的文本分类

目录 1.0 文本分类的应用场景 1.1 文本分类流程 ​编辑 1.2 判别式模型 1.3 生成式模型 1.4 评估 1.5 参考文献 NLP学习笔记系列&#xff0c;欢迎收藏交流&#xff1a; 零、自然语言处理开篇-CSDN博客 一、NLP中的文本分类-CSDN博客 二、NLP中的序列标注&#xff08;分…

scrcpy远程投屏控制Android

下载 下载后解压压缩包scrcpy-win64-v2.4.zip scrcpy连接手机 1. 有线连接 - 手机开启开发者选项&#xff0c;并开启USB调试&#xff0c;连接电脑&#xff0c;华为手机示例解压scrcpy&#xff0c;在scrcpy目录下打开终端&#xff0c;&#xff08;或添加scrcpy路径为环境变…

NVIDIA vGPU三种授权方式(个人玩家版)

NVIDIA vGPU三种授权方式(个人玩家版) 旧版本的License Server搭建(比较推荐)说明搭建所需文件创建一个Linux虚拟机(我创建的是Ubuntu 18.04.06)修改虚拟机的MAC地址关闭虚拟机的时间同步及修改系统时间安装java安装Apache Tomcat安装许可证服务器软件上传授权文件新版本…