使用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数据包头1Rx_Buffer.Count = 0;}else if(2 == Rx_Buffer.Count){if(0xAA == Rx_Buffer.Data[1])//0xAA数据包头1Rx_Buffer.Count = 1;else if(0x55 != Rx_Buffer.Data[1])//0x55数据包头2Rx_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#

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EfficientNetV2】《EfficientNetV2: Smaller Models and Faster Training》

google ICML-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4. 1 Understanding Training Efficiency4.2 Training-Aware NAS and Scaling4.3 Progressive learning 5 Experiments5.1 Datasets and Metrics5.2 ImageNet ILSVR…

力扣654 最大二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上…

【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍单一职责原则&#xff08;SRP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

力扣106 从中序与后续遍历序列构造二叉树

文章目录 题目描述解题思路代码 题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …

海豚调度系列之:认识海豚调度

海豚调度系列之&#xff1a;认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过…

使用 opencv 识别答题卡,生成填涂答案

一般答题卡设计时都在试卷4个角预留4个一样大小的黑块 仅能识别选择题判断题之类的填涂答题的题目&#xff0c;不能识别填空题应用题等其它主观题 使用 opencv 识别试卷图片中所有黑块&#xff0c;再根据黑块大小获取四个角的位置&#xff0c;根据四个黑块位置校正图像 将图…

Ubuntu下txt中文显示乱码问题常规解决方法

在正常使用ubuntu 文档时&#xff0c;突然发现txt文档出现&#xff0c;如下情况 无法正常观看&#xff0c;后来搜了一下发现是gedit 没有对应打开文件的编码格式&#xff0c;Ubuntu用的是utf-8,所以打开会有乱码&#xff01;初始没有GBK和GB2312&#xff0c;把GBK和GB2312添加…

vi 显示行号 显示色彩

首先进入当前用户目录下的.vimrc文件/.virc文件&#xff08;具体要看操作系统&#xff09; vi ~/.virc 显示行号 set number 显示色彩 highlight LineNr guifgred 效果

怎样才能选择一套好的ai智能语音系统呢?人工智能电话机器人系统各版本搭建

如今竞争激烈的市场环境下&#xff0c;企业需要不断创新&#xff0c;提高效率&#xff0c;以获得更多的市场份额和利润。而智能电销机器人&#xff0c;作为一种新型的营销工具&#xff0c;正逐渐成为越来越多企业的首选工具&#xff0c;接下来我们看看怎样才能选择一套好的ai智…

生态碳汇涡度相关监测与通量数据分析

朱老师&#xff08;副教授&#xff09;&#xff1a;来自国内重点高校&#xff0c;长期从事涡度通量观测与分析研究&#xff0c;发表SCI论文多篇&#xff0c;主持国家与地方科研项目多个&#xff0c;在生态环境数据处理与分析中具有丰富的实践项目经验。 本文基于MATLAB语言、以…

滑动窗口最大值(leetcode hot100)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输…

2024年初中生古诗文大会备考:多选题真题和独家解析(持续更新)

今天我们继续来做初中古诗文大会的一道难题&#xff1a;多选题&#xff0c;让大家了解初中生古诗文大会的考察内容和形式&#xff0c;并且提供了我独家的题目解析和答案&#xff0c;供初中的同学们学习和参考。 Tips&#xff1a;古诗文大会的许多题目都来自于中考、高考&#…

使用Barrier共享鼠标键盘,通过macos控制ubuntu系统

之前文章写过如何使用barrrier通过windows系统控制ubuntu系统&#xff0c;该文章将详细介绍如何使用barrier通过macos系统控制ubuntu系统 一、macOS安装barrier macOS版本barrier链接 1、双击点开安装包 2、将安装包里的barrier拷贝到macOS的达达->应用程序中 3、在达达…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

边框检测在 Python 中的应用

在游戏开发中&#xff0c;我们经常会回使用到边框检测。我们知道&#xff0c;边框检测是计算机视觉中常用的技术&#xff0c;用于检测图像中的边界和轮廓。在Python中&#xff0c;可以使用OpenCV库来实现边框检测。具体是怎么实现的&#xff1f;以下是一个简单的示例代码&#…

深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁

引言 在Java并发编程领域&#xff0c;有效管理对共享资源的访问显得尤为关键。为了保障线程安全&#xff0c;Java虚拟机&#xff08;JVM&#xff09;引入了一系列精妙的锁机制&#xff0c;这其中的核心概念就是Java对象头中的MarkWord。本文将详尽解析MarkWord的作用&#xff…

Vue.js+SpringBoot开发考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安调研

3月12日下午&#xff0c;由教育部网络安全教学指导委员会秘书长&#xff08;专家组组长&#xff09;封化民、工业和信息化部规划司原司长肖华、中国现代国际关系研究院原副院长张力等领导组成的国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安及湖南欧拉生态创新…

【Python】成功解决NameError: name ‘cv2‘ is not defined

【Python】成功解决NameError: name ‘cv2’ is not defined &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

mavon-editor实现支持md格式输入并自定义工具栏

需求说明 起源于我在做机器人报警推送的一个模块时&#xff0c;涉及到可以自定义报警的内容&#xff0c;其中内容支持md格式&#xff0c;同时还支持用户在指定光标处插入指定的字符串占位符。于是我在项目中引入mavon-editor库(支持Vue2、Vue3)&#xff0c;以支持用户输入md格…