单片机---------WIFI模块

1.ESP-12F模组基础知识

ESP12-F模组(安信可(Ai-Thinker)ESP8266系列模组)是一款基于乐鑫(Espressif)公司ESP8266芯片的Wi-Fi无线通信模块,广泛应用于物联网(IoT)领域。它体积小巧,集成度高,内置Wi-Fi功能和32位处理器,支持802.11 b/g/n无线标准。ESP12-F模组内置4MB Flash存储,拥有丰富的GPIO(通用输入输出)、UART、SPI、I2C、PWM、ADC等接口,方便与各种传感器和外设连接。ESP12-F模组功耗低,支持深度休眠,非常适合智能家居、远程控制、无线传感器、数据采集等应用场景。使用时需要注意其所有引脚电平为3.3V,不能直接接5V电源或信号,否则可能损坏芯片。

可以理解成ESP-12F是最小系统版,ESP8266是芯片

最终想要实现:

U5(采集温湿度以及可以控制设备)----------->WIFI-------------------->展示在QT服务器端

QT服务器端发送命令(点击按钮)---------------->WIFI-------------------->控制设备开关

如果要实现上述效果,WIFI组件需要将U5发送过来的数据正确发送给服务器端;将服务器发送的指令正确识别并发送给U5。但WIFI组件本身不具备这样的能力,需要烧入程序(也就是所说的固件)?那如何烧入固件?又如何与U5芯片连接来实现通信呢?

如何烧入固件?

GPIO0:控制WIFI模式,GPIO0为低电平是下载模式,高电平为运行模式

运行和下载模式

运行模式:此时串口为正常的通信功能--->接收AT指令

下载模式:此时串口为下载固件的功能

2.WIFI设备与其他设备之间的连接
1.将电脑端通过USB接口(底板type-c接口)与WIFI相连

22号引脚 TXD为WIFI模组的串口发送引脚

21号引脚 RXD为WIFI模组的串口接收引脚

【注意】为什么不直接将WIFI与USB相连?

WIFI是TTL电平信号,USB是差分信号,使用CH340进行电平转换TTL---->USB

2.U5与WIFI相连

wifi-----U5引脚--------U5内部

RX--- ---PD2----------串口5-TX

TX-------PC12---------串口5-RX

3.运行模式--->①与PC直接相连,也就是串口调试助手
3.1 AT指令

(1) 复位:AT+RST

这个指令就是复位指令,也可以通过按板子上的reset复位键进行复位,复位后会断开之前的连接,相当于重启。

(2) 设置WiFi模式:AT+CWMODE=

查询/设置 Wi-Fi 模式 (Station/SoftAP/Station+SoftAP)

0: 无 Wi-Fi 模式,并且关闭 Wi-Fi RF

1: Station 模式---------可以连接其他热点

2: SoftAP 模式---------变身成为一个路由器,可以发射wifi信号成为一个热点

3: SoftAP+Station------模式 混合模式

这里我们要联网,所以选择模式1,连接热点。

(3) 连接WiFi热点:AT+CWJAP="热点名字","热点密码"

这里我们用电脑开热点,因为大多数WiFi模组(比如我使用的ESP12-F模组 )只兼容2.4GHz频段;且ESP12-F模组是低功耗模组,而2.4G模组功耗更低,信号穿透能力更强,覆盖范围更广,复杂环境下稳定性更高。

(4) 连接服务器:AT+CIPSTART="TCP","服务器IP",服务器端口

(5) 发送数据:AT+CIPSEND=5 //发送五个字节给服务器

【注意】

这种方式只能实现单次固定长度数据的发送

输入后会出现箭头,表示等待串口向服务器发送五个字节的数据。

3.2什么是透传模式

(1)简介:

透传模式(Transparent Transmission)是一种数据传输方式,设备或系统在通信过程中不对数据内容进行解析或处理,仅作为通道将原始数据完整、无修改地传递给目标端。常见于串口通信、网络协议、物联网设备等场景。

也就是ESP8266作为一个搬运共,不去辨别串口发送过来的数据是什么,只是无脑的发送给服务器。

(2) 设置透传

1.设置透传模式:AT+CIPMODE=1

2.使能透传发送:AT+CIPSEND

之后就可以连续发送数据;

想退出透传模式可以发送"+++",就会退出透传模式:

4.使用单片机控制WIFI模块
1. 关键开关设置:
  • S2/S3:拨向 MCU方向(连接ESP8266与STM32)
  • S4:拨到 运行模式(使能ESP8266正常工作)
  • Type-C:插入核心板(供电+调试通信)
2. 整体流程

1. PC通过串口调试助手(USART1)发送指令给STM32。

2. STM32通过空闲中断接收完整指令,解析指令。

3. STM32通过UART5向ESP8266发送相应的AT指令或数据。

4. ESP8266执行操作(如连接服务器、发送数据等)。

5. ESP8266将服务器返回的数据通过UART5传给STM32。

6. STM32将结果通过USART1格式化输出到PC串口调试助手。

3. 2.wifi驱动代码
#include "wifi.h"int connect_flag = 0; // 是否连接成功的标志
int tt_flag = 0;	  // 是否有网络发过来的透传数据标志char WIFI_Config0(int time) // 找到ready 返回 没有找到返回1
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;while (time--){HAL_Delay(100);if (strstr((char *)WiFi_RX_BUF, "ready")){break;}// u1_USART ("WIFI_Config0:=%s",WiFi_RX_BUF);}if (time > 0)return 0;elsereturn 1;
}char WIFI_Config(int time, char *cmd, char *response) // 等待时间 发送内容 判断返回的内容
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;ESP8266_USART("%s\r\n", cmd);while (time--){HAL_Delay(100);if (strstr((char *)WiFi_RX_BUF, response)){break;}// u1_USART("%d ", time);}if (time > 0)return 0;elsereturn 1;
}char WIFI_Router(int time) // 配置WIFI名和密码
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;//	ESP8266_USART("AT+CIPMUX=0");//	HAL_Delay(100);ESP8266_USART("AT+CWJAP=\"%s\",\"%s\"\r\n", ID, PASSWORD);while (time--){HAL_Delay(1000);if (strstr((char *)WiFi_RX_BUF, "OK")){break;}u1_USART("连接路由倒计时: %d\r\n ", time);}if (time > 0)return 0;elsereturn 1;
}char WIFI_ConnectTCP(int time) // 配置TCP
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;ESP8266_USART("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ServerIP, ServerPort);while (time--){HAL_Delay(100);if (strstr((char *)WiFi_RX_BUF, "OK")){break;}u1_USART("正在建立TCP连接 :%d ", time);}if (time > 0)return 0;elsereturn 1;
}enum WIFI_STATE
{WIFI_READY = 0,WIFI_CONFIG1,WIFI_ROUTER,WIFI_CONFIG2,  //进入透传模式WIFI_CONNECT, //连接服务器WIFI_CONFIG3,WIFI_COMPLETE	//连接完成};#define WAIT_TIME 1000void WIFI_Connect()//状态机
{int state = WIFI_READY;  //默认等待复位while (1){if(state == WIFI_COMPLETE){u1_USART("连接服务器完成并开启透传!\r\n");memset(WiFi_RX_BUF,0,1024);//WIFI_SendData("hello world");break;  //这里直接跳出while(1)循环即可}switch (state){case WIFI_READY://检测是否手动复位了/*0、按键复位*/u1_USART("0、准备按键复位!\r\n");if (WIFI_Config0(100))//判是否收到ready{u1_USART("按键复位失败!\r\n");HAL_Delay(WAIT_TIME);}else//成功了 找到了{u1_USART("按键复位成功!\r\n");state = WIFI_CONFIG1;}break;case WIFI_CONFIG1:/*1、配置WIFI模式*/u1_USART("1、准备配置WIFI模式!\r\n");if (WIFI_Config(50, "AT+CWMODE=1\r\n", "OK"))//发送命令 检测OK{u1_USART("配置WIFI模式失败!\r\n");HAL_Delay(WAIT_TIME);break;}else//成功u1_USART("配置WIFI模式成功!\r\n");u1_USART("\r\n");/*2、重启(命令方式)*/u1_USART("2、准备复位!\r\n");if (WIFI_Config(50, "AT+RST\r\n", "ready")){u1_USART("复位失败!\r\n");HAL_Delay(WAIT_TIME);break;}elseu1_USART("复位成功!\r\n");u1_USART("\r\n");/*3、取消自动连接*/u1_USART("3、准备取消自动连接\r\n");if (WIFI_Config(50, "AT+CWAUTOCONN=0\r\n", "OK"))//取消热点自动连接 检测OK{u1_USART("取消自动连接失败!\r\n");HAL_Delay(WAIT_TIME);break;}elseu1_USART("取消自动连接成功!\r\n");WiFi_RxCounter = 0;state = WIFI_ROUTER;break;case WIFI_ROUTER:/*4、连接路由器*/u1_USART("4、准备连接路由器\r\n");if (WIFI_Router(50))//连接热点并检测是否连接成功{u1_USART("连接路由器失败!\r\n");HAL_Delay(WAIT_TIME);}else{u1_USART("连接路由器成功!\r\n");state = WIFI_CONFIG2;}break;case WIFI_CONFIG2:/*5、配置单路连接模式*/u1_USART("5、准备配置单路连接模式!\r\n");if (WIFI_Config(50, "AT+CIPMUX=0\r\n", "OK"))//配置单路连接{u1_USART("配置单路连接模式失败!\r\n");HAL_Delay(WAIT_TIME);break;}else{u1_USART("配置单路连接模式成功!\r\n");}u1_USART("\r\n");/*6、开启透传模式*/u1_USART("6、准备开启透传模式\r\n");if (WIFI_Config(50, "AT+CIPMODE=1\r\n", "OK")){u1_USART("开启透传模式失败!\r\n");HAL_Delay(WAIT_TIME);break;}else{u1_USART("开启透传模式成功!\r\n");}state = WIFI_CONNECT;break;case WIFI_CONNECT:/*7、建立TCP连接*/u1_USART("7、准备建立TCP连接\r\n");if (WIFI_ConnectTCP(50))//连接TCP{u1_USART("建立TCP连接失败!\r\n");HAL_Delay(WAIT_TIME);}else{u1_USART("建立TCP连接成功!\r\n");state = WIFI_CONFIG3;}break;case WIFI_CONFIG3:/*8、进入透传模式*/u1_USART("8、准备进入透传模式\r\n");if (WIFI_Config(50, "AT+CIPSEND\r\n", "\r\nOK\r\n\r\n>")){u1_USART("进入透传模式失败!\r\n");HAL_Delay(WAIT_TIME);}else{u1_USART("进入透传模式成功!\r\n");state = WIFI_COMPLETE;connect_flag = 1;break;}default:break;}}
}//int WIFI_SendData(const char *data)
//{
//	ESP8266_USART("%s", data);
//	//u1_USART("数据发送完成\r\n");
//	return 0;
//	if (WIFI_Config(10, "AT+CIPSEND=5\r\n", ">"))
//	{
//		ESP8266_USART("%s", data);
//		u1_USART("数据发送完成\r\n");
//		return 0;
//	}
//	else
//	{
//		u1_USART("数据发送失败!\r\n");
//		return -1;
//	}
//}

/r/n

/r:回到当前行行首;

/n:回到下一行的这个位置

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

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

相关文章

迅为RK3562开发板Android修改uboot logo

本文档配套资料在网盘资料“iTOP-3562 开发板\02_【iTOP-RK3562 开发板】开发资料\07_Android 系统开发配套资料\05_Android 修改 uboot logo 配套资料”路径下。1 准备 logo系统默认 uboot logo,如下图所示:我们如果想要替换这个 logo,首先要制作一个新…

反催收APP开发思路:用Flutter打造证据链管理工具

针对非法催收问题,熊哥分享了一款反催收APP的开发思路,旨在帮助“诚而不幸”的负债人收集骚扰证据,通过Flutter实现跨平台部署。本文整理其核心功能与技术方案,助力开发者快速上手!一、核心功能:证据收集与…

市政道路井盖缺失识别误报率↓82%!陌讯多模态融合算法实战优化与边缘部署

原创声明本文为原创技术解析文章,核心技术参数、架构设计及实战数据引用自 “陌讯技术白皮书”,文中算法实现与优化方案均基于实测验证,禁止未经授权转载或篡改内容。一、行业痛点:市政井盖识别的 “三大拦路虎”市政道路井盖作为…

navicat及SQLyog的下载和安装

navicat安装和使用navicat下载和安装navicat 下载navicat 的安装SQLyog下载和安装SQLyog 的下载SQLyog 的安装连接到MySQL数据库navicat下载和安装 navicat 下载 navicat下载地址 这两个都是满足我们需求的,均可 这样我们就得到了一个双击可执行的exe文件 navic…

在TencentOS3上部署OpenTenBase:从入门到实战的完整指南

文章目录前言初识OpenTenBase:不只是又一个分布式数据库OpenTenBase的核心特性环境准备系统环境检查安装必要的依赖包用户环境配置:安全第一创建专用用户配置SSH免密登录(单机部署也需要)源码编译:从零开始构建获取源码…

flink常见问题之超出文件描述符限制

引言Apache Flink 是一个强大且流行的流处理框架,它支持高吞吐量和低延迟的数据处理。在处理大规模数据流时,Flink 用户可能会遇到各种性能瓶颈,其中之一就是文件描述符的限制。文件描述符是操作系统用来表示打开文件或其他输入/输出资源的一…

雅菲奥朗SRE知识墙分享(一):『SRE对智能运维领域所产生的深远影响』

一、SRE推动了运维与开发的融合1、增强协作:SRE模式鼓励运维与开发团队之间的紧密合作,共享知识、资源和责任,共同解决系统稳定性和性能问题。2、共同目标:通过共同设定系统可靠性和性能目标,运维和开发团队能够协同工…

【JVM内存结构系列】一、入门:先搞懂整体框架,再学细节——避免从一开始就混淆概念

在Java开发中,你是否遇到过这些困惑:明明代码没写错,却突然抛出OutOfMemoryError?调优GC参数时,不知道-Xms和-XX:MetaspaceSize分别影响哪块内存?面试时被问“JVM内存结构和Java内存模型有啥区别”,只能含糊其辞? 其实,这些问题的根源都指向同一个核心——没搞懂JVM的…

《Dual Prompt Personalized Federated Learning in Foundation Models》——论文阅读

面向大规模预训练模型(ViT、BERT)的千万级设备场景,用“双提示(Dual Prompt)”机制实现高效、可扩展的个性化联邦学习(PFL)1.研究背景传统联邦学习在客户端数据异构(非独立同分布&am…

深度剖析Lua Table的运作方式

前言&#xff1a;本篇基于Lua-5.3.6源码并配合《Lua 解释器构建&#xff1a;从虚拟机到编译器》一书进行Table的运作解读。一、Table数据结构typedef struct Table {CommonHeader;lu_byte flags; /* 1<<p means tagmethod(p) is not present */lu_byte lsizenode; /* l…

PETR/PETRv2

PE: position embedding 一、PETR算法动机回归 1.1 DETR 输入组成&#xff1a;包含2D位置编码和Object Query 核心流程&#xff1a;通过Object Query直接索引2D特征图&#xff0c;结合位置编码迭代更新Query 特点&#xff1a;整体流程简洁&#xff0c;每个Query代表一个潜在目标…

计算机大数据毕业设计推荐:基于Spark的气候疾病传播可视化分析系统【Hadoop、python、spark】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二、…

英伟达显卡GPU驱动的本质

我们来深入、详细地探讨一下英伟达&#xff08;NVIDIA&#xff09;GPU驱动程序的本质。 普通用户眼中的驱动程序可能只是一个“让显卡工作的软件”&#xff0c;但它的本质远比这复杂和深刻。我们可以从几个层面来理解它。 核心比喻&#xff1a;翻译官、指挥官与优化大师 如果说…

算法 ---哈希表

一、哈希介绍 是什么 存储数据的容器 什么用 快速查找某个元素 什么时候用哈希表 频繁的查找某一个数的时候 怎么用哈希表 &#xff08;1&#xff09;容器&#xff08;哈希表&#xff09; &#xff08;2&#xff09;用数组模拟哈希表&#xff08;字符串的字符&#xf…

基于分布式环境的令牌桶与漏桶限流算法对比与实践指南

基于分布式环境的令牌桶与漏桶限流算法对比与实践指南 在高并发的分布式系统中&#xff0c;限流是保障服务可用性和稳定性的核心手段。本文聚焦于令牌桶算法与漏桶算法在分布式环境下的实现与优化&#xff0c;对多种解决方案进行横向对比&#xff0c;分析各自的优缺点&#xff…

WPF MVVM入门系列教程(TabControl绑定到列表并单独指定每一页内容)

在以前的开发过程中&#xff0c;对于TabControl控件&#xff0c;我一般是习惯直接定义TabItem&#xff0c;在TabItem下布局&#xff0c;并进行绑定。 类似这样 1 <TabControl ItemsSource"{Binding TabList}" SelectedIndex"0">2 <TabItem…

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

在物联网(IoT)蓬勃发展的今天,低功耗蓝牙(BLE)技术因其高效节能、低成本等特性,成为短距离无线通信的首选方案。作为 BLE 协议栈的核心组件,逻辑链路控制与适配协议(L2CAP)的面向连接信道(CoC)承担着数据传输的关键任务。本文将深入解析 L2CAP CoC 在 BLE 中的应用,…

医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(上)

摘要: 随着医疗信息化建设的深入,医院数据仓库(Data Warehouse, DW)作为医疗AI应用的核心数据底座,其效能直接决定智能化转型的深度与广度。本文聚焦医疗AI驱动下医院数据仓库的三大关键升级功能——异构采集支持数据库体检与智能SQL分析、评估引擎重构实现六大数据库精准…

2015-2018年咸海流域1km归一化植被指数8天合成数据集

数据集摘要数据集包含2015年-2018年咸海流域NDVI 8天均值数据。提取美国国家航空航天局中分辨率成像光谱仪MOD13A2产品第一波段作为归一化植被指数数据&#xff0c;乘以比例因子0.0001&#xff0c;叠加咸海流域边界数据&#xff0c;裁切后得到咸海流域范围内的NDVI月均值数据。…

Kafka消息持久化机制全解析:存储原理与实战场景

目录 引言​ 一、Kafka消息持久化的核心目标 二、底层存储机制深度剖析 1.【文件系统分层】——日志分组 日志段 核心结构 示例目录结构 2.【消息写入流程】——从内存到磁盘的旅程✈️ 3.【默认存储参数】——生产环境的黄金比例 三、典型应用场景与案例实战 案例1…