当前位置: 首页 > news >正文

基于stm32的esp8266的WIFI控制风扇实验

实验案例WIFI控制风扇

项目需求

电脑通过esp8266模块远程遥控风扇。

项目框图

风扇模块封装 

#include "sys.h"
#include "fan.h"void fan_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin  = GPIO_PIN_6;gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;gpio_initstruct.Pull = GPIO_PULLUP;//上拉需要给一个下降沿gpio_initstruct.Speed= GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,&gpio_initstruct);//关闭LEDfan1_off();
}
void fan1_on(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);}
//熄灭LED1的函数void fan1_off(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);}//获取继电器的状态uint8_t fan_status_get(void)
{return (uint8_t)HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6);//要么返回0,要么返回1}


esp8266功能代码封装 

头文件

#include "sys.h"
#include "esp8266.h"
#include "string.h"
#include "delay.h"
#include "stdarg.h"uint8_t esp8266_tx_buf[ESP8266_TX_BUF_SIZE];
uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE]; uint16_t esp8266_cnt = 0 ,esp8266_cntPre = 0; /* esp8266接收缓冲区 */UART_HandleTypeDef esp8266_handle;             /* esp8266句柄 */

esp8266串口初始化配置

void esp8266_uart_init(uint32_t baudrate)//正常会有启动的流程只是作为一个串口的初始化
{/*esp8266 初始化设置*/esp8266_handle.Instance = USART2;                               /* USART1 */esp8266_handle.Init.BaudRate = baudrate;                        /* 波特率 */esp8266_handle.Init.WordLength = UART_WORDLENGTH_8B;            /* 字长为8位数据格式*/esp8266_handle.Init.StopBits = UART_STOPBITS_1;                 /* 一个停止位 */esp8266_handle.Init.Parity = UART_PARITY_NONE;                  /* 无奇偶校验位 */esp8266_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;            /* 无硬件流控 */esp8266_handle.Init.Mode = UART_MODE_TX_RX;                     /* 收发模式 */HAL_UART_Init(&esp8266_handle);                                 /*会使能esp8266 */                 
}

接收缓冲区配置

void esp8266_rx_clear(void)
{memset(esp8266_rx_buf, 0, sizeof(esp8266_rx_buf)); /* 清空接收缓冲区 */esp8266_cnt = 0;                                   /* 接收计数器清零 */
}

中断服务函数

void USART2_IRQHandler(void)
{uint8_t receive_data = 0;   if(__HAL_UART_GET_FLAG(&esp8266_handle, UART_FLAG_RXNE) != RESET){/* 获取接收RXNE标志位是否被置位 */if(esp8266_cnt >= sizeof(esp8266_rx_buf))                     /* 如果接收的字符数大于接收缓冲区大小, */esp8266_cnt = 0;                                          /* 则将接收计数器清零 */HAL_UART_Receive(&esp8266_handle, &receive_data, 1, 1000);    /* 接收一个字符 */esp8266_rx_buf[esp8266_cnt++] = receive_data;    /* 将接收到的字符保存在接收缓冲区 */}if (__HAL_UART_GET_FLAG(&esp8266_handle, UART_FLAG_IDLE) != RESET) /* 获取接收空闲中断标志位是否被置位 */{printf("recv: %s\r\n", esp8266_rx_buf);                  /* 将接收到的数据打印出来 */esp8266_rx_clear();__HAL_UART_CLEAR_IDLEFLAG(&esp8266_handle);              /* 清除UART总线空闲中断 */}
}

等待接收函数

uint8_t esp8266_wait_receive(void)
{if(esp8266_cnt == 0)return ESP8266_ERROR;if(esp8266_cnt == esp8266_cntPre){esp8266_cnt = 0;return ESP8266_EOK;}esp8266_cntPre = esp8266_cnt;return ESP8266_ERROR;
}

发送指令并期待返回值

uint8_t esp8266_send_command(char *cmd,char *res)//发送一个指令去   在指定时间内返回回来 否则没有接收到一个返回值
{uint8_t timeout_out = 250;esp8266_rx_clear(); //防止忍心内的数据影响HAL_UART_Transmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);//发送命令 cmd在这里是一个uint8_t的数据 长度 阻塞的值//等待while(timeout_out--)//不停的等待{if(esp8266_wait_receive() == ESP8266_EOK){if(strstr((const char*)esp8266_rx_buf, res) != NULL)//判断是否又有期待的字符串return ESP8266_EOK;}delay_ms(10);}return ESP8266_ERROR;//否则接收错误}

接收数据

//接收的函数
void esp8266_receiv_data(void)
{if(esp8266_wait_receive() == ESP8266_EOK){printf("esp8266 recv: %s\r\n", esp8266_rx_buf);esp8266_rx_clear();}
}

发送不定长数据

//发送的函数  不定长数据 参数不固定
void esp8266_send_data(char *fmt, ...)
{va_list ap;uint16_t len;va_start(ap,fmt);vsprintf((char *)esp8266_tx_buf,fmt, ap);va_end(ap);len = strlen((const char*)esp8266_tx_buf);HAL_UART_Transmit(&esp8266_handle, esp8266_tx_buf, len,100);//发送
}

设置a模块是否存在测试

uint8_t esp8266_at_test(void)
{return esp8266_send_command("AT\r\n", "OK");//记得加回车换行才能作为指令发送期待返回值为OK  直接作为返回值发送}

设置模式

uint8_t esp8266_set_mode(uint8_t mode)//s四个函数
{switch(mode){case ESP8266_STA_MODE:return esp8266_send_command("AT+CWMODE=1\r\n","OK");case ESP8266_AP_MODE:return esp8266_send_command("AT+CWMODE=2\r\n","OK");case ESP8266_STA_AP_MODE:return esp8266_send_command("AT+CWMODE=3\r\n","OK");default:return ESP8266_EINVAL;//如果指令不存在}
}

加入AP


uint8_t esp8266_join_ap(char *ssid,char *pwd)//账号密码
{char cmd[64];sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//\"HUAWEIAP-1\",=\"%s\  就指令带引号直接写不行,我们需要如此就不会将“”认为是配对的return esp8266_send_command(cmd,"WIFI GOT IP");;//调用指令函数
}

连接模式

	
uint8_t esp8266_connect_mode(uint8_t mode)//设置单路连接的模式(透传只能用此模式)
{char cmd[64];sprintf(cmd, "AT+CIPMUX=%d\r\n",mode);//作为模式传输进入return esp8266_send_command(cmd,"OK");;//调用指令函数
}
//连接TCP服务器

esp8266_连接模式

uint8_t esp8266_connect_mode(uint8_t mode)//设置单路连接的模式(透传只能用此模式)
{char cmd[64];sprintf(cmd, "AT+CIPMUX=%d\r\n",mode);//作为模式传输进入return esp8266_send_command(cmd,"OK");;//调用指令函数
}

 esp8266连接tpc服务器ip和端口

uint8_t esp8266_connect_tcp_server(char *server_ip,char*server_port)
{char cmd[64];sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",server_ip,server_port);//作为模式传输进入return esp8266_send_command(cmd,"CONNECT");;//调用指令函数
}

进入透传模式

uint8_t esp8266_enter_unvarnished(void)//发送的模式
{uint8_t ret;//取巧的方式定义一个返回值//两次返回值都等于0,如果有一个不为0就为不为零的情况ret  = esp8266_send_command("AT+CIPMODE=1\r\n","OK");;//调用指令函数ret += esp8266_send_command("AT+CIPSEND\r\n",">");;//调用指令函数if(ret == ESP8266_EOK)return ESP8266_EOK;elsereturn ESP8266_ERROR;		
}

建立tcp服务器

uint8_t esp8266_build_tcp_server(void)
{return esp8266_send_command("AT+CIPSERVER=1\r\n","OK");//发送AT+CIPSEVER=1,期待回复OK
}

初始化esp8266


void esp8266_init(uint32_t baudrate)//所以增加新添加一个
{printf("esp8266初始化开始...\r\n");esp8266_uart_init(baudrate);printf("1. 测试esp8266是否存在\r\n");while(esp8266_at_test())//esp8266_at_test();也是可以的不过一直不成功那就一直等待更为保险delay_ms(500);printf("2. 设置工作模式为AP...\r\n");while(esp8266_set_mode(ESP8266_AP_MODE))delay_ms(500);printf("3. 设置多路链接模式\r\n");while(esp8266_connect_mode(ESP8266_MULTI_CONNECTION))delay_ms(500);printf("4. 建立TCP服务器...\r\n");while(esp8266_build_tcp_server())delay_ms(500);		printf("esp8266初始化完成...\r\n");//esp8266的其他初始化
}

esp8266初始化测试

//测试函数
void esp8266_test(void)
{esp8266_send_data("this is from esp8266\r\n");esp8266_receiv_data();
}

main函数

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"
#include "fan.h"
#include "string.h"
int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();	/* LED初始化 */uart1_init(115200);esp8266_init(115200);fan_init();printf("helloworld!\r\n");char recv_data[ESP8266_RX_BUF_SIZE];//接收传入参数while(1){ esp8266_receive_data(recv_data);//接收到数据tcp服务器传输过来的字符串if(strstr(recv_data, "ON") != NULL)//判断字符串有ON,打开风扇fan1_on();else if(strstr(recv_data, "OFF") != NULL)fan1_off();delay_ms(10);}
}

相关文章:

基于stm32的esp8266的WIFI控制风扇实验

实验案例WIFI控制风扇 项目需求 电脑通过esp8266模块远程遥控风扇。 项目框图 ​ 风扇模块封装 #include "sys.h" #include "fan.h"void fan_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟…...

java中的ScheduledExecutorService介绍和使用案例

ScheduledExecutorService 是 Java 并发包 java.util.concurrent 中的一个接口,它提供了一种机制,允许我们安排一个任务在给定的延迟后运行,或者定期地执行。 主要特点 单次调度:可以安排任务在一定的延迟后执行一次。周期性调度…...

4天涨粉14万!这个AI小众赛道粉丝涨疯了吧?保姆级教程免费教会你!

测一下你的搞钱灵敏度有多高,看下面两张截图,有没有发现什么异常值? 发现了吧? 第一张是10月17号截的,第二张是21号,4天时间粉丝从2.8万飙到16.6万,涨粉14万! 这个号我几天之前就发…...

RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测

随着人工智能和大数据时代的到来,传统嵌入式处理器中的CPU和GPU逐渐无法满足日益增长的深度学习需求。为了应对这一挑战,在一些高端处理器中,NPU(神经网络处理单元)也被集成到了处理器里。NPU的出现不仅减轻了CPU和GPU…...

itext 转换word文档转pdf

itext 转换word文档转pdf <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version><scope>compile</scope></dependency> <dependency><groupId>org.a…...

WSL-默认root登录

WSL-默认root登录 使用管理员&#xff0c;打开powershell PS C:\WINDOWS\system32> wsl -l 适用于 Linux 的 Windows 子系统分发版: Ubuntu-22.04 (默认) PS C:\WINDOWS\system32> ubuntu2204.exe config --default-user root PS C:\WINDOWS\system32>修改之后&…...

ASIO网络调试助手之四:浅谈QTcpServer性能

网络上有些质疑Qt Network模块性能的声音,本文将从理论和压测两个方面对比ASIO tcp server和QTcpServer在Windows上的性能,最后给出结论。 一.理论 QTcpServer在Windows上的实现是基于select模型,源码位置:5.12.6\Src\qtbase\src\network\socket\qnativesocketengine_win…...

快手 日常实习一面面经

官网投递&#xff0c;三天约面 线上面试 &#xff08;60mins&#xff09;&#xff1a; 1. 自我介绍 2. 问实习 介绍自己做的业务上一段实习的公司框架和开源的 RPC 框架的区别负责的业务与核心业务的依赖关系场景题 -> 设计高并发下的负载均衡 3. 项目拷打 手写 双检锁…...

Cursor零基础小白教程系列 - 创建你的第一个Cursor 项目

最适合小白零基础的Cursor教程 网站lookai.top相同作者&#xff0c;最新文章会在网站更新&#xff0c;欢迎收藏书签 创建你的第一个Cursor 项目 实操视频 概述 开始使用Cursor进行编程的第一步是创建或导入一个项目。本指南将帮助您了解如何在Cursor中创建新项目、导入现有项…...

通用序列化和反序列化实现思路

本文简单的记录一下采用模板来实现序列化与反序列的思路&#xff0c; 同时采用C20标准的concept和requires来简化模板函数的选择。 首先了解一下自定义类支持序列化的两种方式&#xff1a; 一、序列化自定义类型&#xff08;侵入式&#xff09; struct Test {std::string na…...

书生营第四期L0G2000 Python 基础知识

闯关任务 Leetcode 383(笔记中提交代码与leetcode提交通过截图) class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:note [0]*26maga [0]*26for s in ransomNote:note[ord(s)-ord(a)] 1for s in magazine:maga[ord(s)-ord(a)] 1for i in…...

Day12-数据库服务冗余架构

Day-12-数据库服务高可用集群 1、数据库MGR组复制实践2、数据库高可用MHA应用介绍3、数据库高可用MHA环境准备4、数据库高可用MHA原理机制5、数据库高可用MHA功能配置 1、数据库MGR组复制实践 &#xff08;强一致性主从同步) 2、数据库高可用MHA应用介绍 3、数据库高可用MHA环境…...

js监听div尺寸,ResizeObserver

示例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><style>.observedDiv {width: 40vw;height: 50vh;background-color: lightblue;}</style></head><body><div id"…...

STM32与openmv的串口通信

OpenMV与STM32的通信是嵌入式系统和物联网领域中的一项重要技术。OpenMV是一种开源的微型机器视觉模块&#xff0c;基于ARM Cortex-M7微控制器&#xff0c;支持多种图像处理功能&#xff0c;如颜色识别、形状检测等。而STM32是STMicroelectronics公司推出的基于ARM Cortex内核的…...

C#基于SkiaSharp实现印章管理(11)

PdfSharpCore支持类似GDI方式在PDF页面绘制文字、矩形、圆形、多边形、路径、图片等内容&#xff0c;本文学习基于PdfSharpCore将结构化印章数据导出为PDF文件的基本用法&#xff0c;评估其使用可行性。   PdfSharpCore创建PDF文件很方便&#xff0c;调用PdfDocument类创建实…...

Spring使用@Async出现循环依赖原因以及解决方案

场景复现 1、首先项目需要打开spring的异步开关&#xff0c;在application主类上加EnableAsync 2、创建一个包含了Async方法的异步类MessageService&#xff1a; Service public class MessageService {Resource private TaskService taskService; Async public void…...

如何训练 RAG 模型

训练 RAG&#xff08;Retrieval-Augmented Generation&#xff09;模型涉及多个步骤&#xff0c;包括准备数据、构建知识库、配置检索器和生成模型&#xff0c;以及进行训练。以下是一个详细的步骤指南&#xff0c;帮助你训练 RAG 模型。 1. 安装必要的库 确保你已经安装了必…...

鸿蒙网络编程系列34-Wifi热点扫描及连接示例

1. Wifi热点简介 Wifi热点是移动设备接入网络的重要形式&#xff0c;特别是在不具备固定网络接入点的情况下&#xff0c;可以通过Wifi热点灵活方便的接入网络&#xff0c;因此在日常生活中具有广泛的应用。鸿蒙系统也提供了方便的Wifi管理API&#xff0c;支持热点扫描&#xf…...

LVS三种模式工作原理

常用负载均衡设备 实现负载均衡的技术的方式有哪些&#xff1a;硬件层面有F5负载均衡器&#xff0c;网络层层面有LVS(Linux Virtual Server)&#xff0c;应用层层面就是nginx、Haproxy等。 lvs工作在网络层&#xff0c;nginx工作在应用层。 LVS有三种工作模式 lvs是由章文崇…...

【二轮征稿启动】第三届环境工程与可持续能源国际会议持续收录优质稿件

第三届环境工程与与可持续能源国际会议&#xff08;EESE 2024&#xff09;由中南林业科技大学主办&#xff0c;湖南农业大学协办&#xff0c;将于2024年12月20日-22日在湖南长沙召开。 大会邀请到国家杰出青年科学基金获得者、华中科技大学能源与动力工程学院冯光教授&#xf…...

Delphi开发者必备:CEF4Delphi最新版安装与跨平台应用开发实战

Delphi开发者必备&#xff1a;CEF4Delphi最新版安装与跨平台应用开发实战 引言 作为一名长期深耕Delphi生态的开发者&#xff0c;你是否曾为跨平台应用开发中的浏览器嵌入需求而头疼&#xff1f;传统方案往往面临兼容性差、性能瓶颈或功能受限等问题。CEF4Delphi的出现彻底改…...

CUDA知识汇总2——cuFFT

cuFFT作为CUDA最基础的库之一&#xff0c;是NVIDIA提供的GPU加速的Fourier变换FFT库&#xff0c;能极大提升涉及FFT计算的科学计算、信号处理和深度学习等任务的速度。一、傅里叶变换和快速傅里叶变换​ Fourier变换是数字信号处理领域一个很重要的数学变换&#xff0c;它用来实…...

侧信道安全(Side-Channel Security)

第一章 背景 1.1 什么是侧信道攻击&#xff1f; 核心定义&#xff1a;侧信道攻击&#xff08;Side-Channel Attack, SCA&#xff09;是一种不直接攻击密码算法的数学结构&#xff0c;而是通过观察系统在执行密码运算时泄露的物理信息&#xff08;时间、功耗、电磁辐射、声音等…...

电源防反接电路设计与实现方案

电源防反接电路的工程实现方案1. 电源防反接技术背景在工业控制和自动化设备中&#xff0c;电源接线错误是常见的操作失误。当电源极性接反时&#xff0c;轻则导致设备无法工作&#xff0c;重则烧毁关键元器件。传统的保险丝保护方案存在响应速度慢、需要人工更换等缺点&#x…...

DRV2667压电触觉驱动器原理与Arduino嵌入式实践

1. DRV2667 压电触觉驱动器深度技术解析与嵌入式集成实践 1.1 芯片级功能定位与工程价值 DRV2667 是德州仪器&#xff08;TI&#xff09;推出的高集成度压电触觉驱动芯片&#xff0c;专为需要高电压、低功耗、精准波形控制的触觉反馈系统设计。其核心价值不在于简单地“驱动压…...

FLUX.小红书极致真实V2实战应用:为小红书笔记自动生成封面+内页配图

FLUX.小红书极致真实V2实战应用&#xff1a;为小红书笔记自动生成封面内页配图 重要提示&#xff1a;本文介绍的FLUX.小红书极致真实V2工具为本地部署方案&#xff0c;无需网络连接&#xff0c;所有图像生成均在本地完成&#xff0c;确保数据隐私和安全。 1. 工具简介&#xff…...

突破性数据增强:如何用Time-Series-Library解决时间序列稀疏性难题

突破性数据增强&#xff1a;如何用Time-Series-Library解决时间序列稀疏性难题 【免费下载链接】Time-Series-Library A Library for Advanced Deep Time Series Models. 项目地址: https://gitcode.com/GitHub_Trending/ti/Time-Series-Library 在时间序列分析领域&…...

王道C语言督学营课后习题OJ题解:手把手教你如何高效刷题

王道C语言OJ题解实战指南&#xff1a;从刷题到精通的系统化路径 在编程学习的道路上&#xff0c;OJ&#xff08;Online Judge&#xff09;系统就像一位严格的考官&#xff0c;它能准确检验我们对C语言的理解深度和算法应用能力。很多学习者虽然掌握了基础语法&#xff0c;却在面…...

从官方Demo到项目集成:海康MV-EB435i RGBD相机C++采集与OpenCV图像处理实战

1. 环境准备与SDK安装 第一次接触海康MV-EB435i这款RGBD相机时&#xff0c;我花了两天时间才把开发环境搭好。现在回想起来&#xff0c;其实只要抓住几个关键点就能少走弯路。先说说硬件准备&#xff1a;这款相机支持USB3.0和千兆网口两种连接方式&#xff0c;实测USB连接更稳定…...

HunyuanVideo-Foley快速上手:开箱即用镜像部署、WebUI调用与API封装

HunyuanVideo-Foley快速上手&#xff1a;开箱即用镜像部署、WebUI调用与API封装 1. 镜像概述与核心优势 HunyuanVideo-Foley是一款集视频生成与AI音效合成于一体的创新工具&#xff0c;本镜像针对RTX 4090D 24GB显卡进行了深度优化&#xff0c;让用户能够快速部署并投入实际使…...