记录使用ESP32做WiFi模块使用的学习

2023-10-29

这里使用ESP32作为WiFi模块,使用STA模式或者AP模式

目录

前言

二、配置WiFi模式

1.STA模式

2.AP模式

3.AP+STA模式

三、实现ESP32与电脑端通信

 ESP32的数据接收与传输

ESP32的完整代码


前言

因为幅频特性题目的任务中要求制作使用WiFi传输的上位机,所以开始学习WiFi模块。这里使用了platform来进行开发,一开始使用了ESP8266但是8266每次掉电代码并不保存,这意味着我每次上电都要重新烧录代码,所以本人转而使用ESP32,二者的写法大同小异。


一、WiFi的三种工作模式

ESP32有三种工作模式:AP模式、STA模式以及AP+STA模式。

简单来说AP模式就是ESP32产生一个WiFi信号,让电脑来连接;STA模式就是ESP32去连接一个已有的WiFi(注意,ESP32和电脑要处于同一局域网下);AP+STA模式就是既产生WiFi又连接WiFi。

二、配置WiFi模式

1.STA模式

代码如下(示例):

#include <WiFi.h>
//STA版
void connect_wifi_STA(){
  
  Serial.begin(115200);
  WiFi.begin(wifi_ssid_STA, wifi_password_STA);         //连接WIFI
  Serial.print("Connected");
  //循环,直到连接成功
  while(WiFi.status() != WL_CONNECTED){
    Serial.println(".");
    delay(500);
  }
  led_es_on();//我的自定义函数:让led亮
  IPAddress local_IP = WiFi.localIP();
  Serial.print("WIFI is connected,The local IP address is "); //连接成功提示
  Serial.println(local_IP); 
}

2.AP模式

代码如下(示例):

#include <WiFi.h>
//AP版
void connect_wifi_AP(){
    
    Serial.begin(115200);
    /*可以再配置其他串口,这里只配置了USB线连接的串口*/
    WiFi.softAP(wifi_ssid_AP,wifi_password_AP);
    while (WiFi.softAPgetStationNum()==0) { // 等待连接WIFI 直到连接成功 退出循环
        Serial.println("Loading...");
        delay(50);
    }
    led_es_on();//我的自定义函数:让led亮
    IPAddress local_IP = WiFi.localIP();
    Serial.print("WIFI is connected,The local IP address is "); //连接成功提示
    Serial.println(local_IP);
}

3.AP+STA模式

代码如下(示例):

#include <WiFi.h>
//AP和STA共存版
void connect_wifi_APandSTA(){
  Serial.begin(115200);
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAPConfig(AP_local_ip, AP_gateway, AP_subnet);       //配置软件访问点的网络设置,使其拥有指定的IP地址、网关和子网掩码。
                                                                //其他设备就可以连接到该访问点,并与ESP32进行通信。
  /**
   * 参数一:软AP的本地IP地址。它是一个`IPAddress`类型的变量,表示访问点的IP地址。
   * 参数二:软AP的网关地址。它也是一个`IPAddress`类型的变量,表示访问点的网关地址。网关是一个设备,用于将数据从一个网络传输到另一个网络。
   * 参数三:软AP的子网掩码。它也是一个`IPAddress`类型的变量,表示访问点的子网掩码。子网掩码用于指定一个IP地址的网络部分和主机部分。
  **/
  WiFi.softAP(wifi_ssid_AP,wifi_password_AP);
  WiFi.begin(wifi_ssid_STA,wifi_ssid_STA);
  Serial.println("connecting...");
  while(WiFi.status()!=WL_CONNECTED){
    Serial.println("Waiting...");
    delay(50);
  }
  led_es_on();
  IPAddress local_IP = WiFi.localIP();
  Serial.print("WIFI is connected,The local IP address is "); //连接成功提示
  Serial.println(local_IP);                                   //输出本地IP地址

}

三、实现ESP32与电脑端通信

这里我制作的是在电脑上使用网络调试助手发送相应指令控制stm32上板载led灯亮灭。(ESP32通过串口与STM32进行连接)

 ESP32的数据接收与传输

我使用ESP32作为客户端,将要连接的电脑做服务端。(这里emm其实WiFi模式和客户端模式服务端模式没什么关系,所以写法都是一样的)

首先要创建客户端对象,将客户端与服务端连接

WiFiClient client = server.available();//创建客户端对象
  
  while (!client.connected())//若未连接到服务端,则客户端进行连接。
    {
        if (!client.connect(host, tcpPort))//实际上这一步就在连接服务端,如果连接上,该函数返回true
        {
            Serial.println("connection....");//串口输出
            delay(500);
 
        }
    }

连接后判断服务端有没有发送数据,或者说客户端有没有接收到数据,如果接收到了数据,则对接收到的数据进行处理。这里为了方便STM32的判断我先把一次读到的数据存到数组里面后面再一起打印。

if (client.connected()){
    Serial.println("Connected to client !!! ");
    while (client.connected()){
      while (client.available()>0) {
        data[ind++] = client.read();//将读取到的数据存入字符串
      }
      ind =0;
      if(data[ind]>0){//如果开头不为空则将读取到的字符串打印
        lint = data;
        client.print(lint);//WiFi打印
        Serial.print(lint);
        data[ind]=0;
      }
      
    }
  }

最后是stm32进行数据接收。就是非常简单的串口接收字符串后对字符串进行判断是哪条预设指令,并且执行指令。

ESP32的完整代码

#include <WiFi.h>
//#include <WiFiClient.h>

const char* ssid = "FlowerPrayer";//WiFi名称
const char* password = "87663210";//WiFi密码
const char* host = "192.168.73.89";//连接热点后分配给ESP32的IP地址

WiFiServer server(8041);  //端口号,范围  0-65535
const int tcpPort = 8041;
//WiFiClient client = server.available();

void setup() {
  // put your setup code here, to run once:
  int j = 0 ;
  Serial.begin(115200);//初始化波特率
  delay(1000);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid,password);
  Serial.print("\r\nConnecting to ");//serial:串口函数,serial.print:经由串口的打印函数
  Serial.print(ssid);
  Serial.println("...");

  while(WiFi.status()!= WL_CONNECTED){//返回值由WiFi连接状态决定
    delay(1000);//while循环每一秒检查一次
    Serial.print("Waiting for ");
    Serial.print(j++);
    Serial.println("s...");
  }
  //delay(1000);
  Serial.println("Mode:STA");
  Serial.println("WIFI connected !");
  Serial.println("IP adress:");
  Serial.println(WiFi.localIP());

}
int ind=0;
char data[100];
String lint="";


void loop() {
  // put your main code here, to run repeatedly:
  WiFiClient client = server.available();//创建客户端对象
  
  while (!client.connected())//若未连接到服务端,则客户端进行连接。
    {
        if (!client.connect(host, tcpPort))//实际上这一步就在连接服务端,如果连接上,该函数返回true
        {
            Serial.println("connection....");//串口输出
            delay(500);
 
        }
    }

  if (client.connected()){
    Serial.println("Connected to client !!! ");
    while (client.connected()){
      while (client.available()>0) {
        data[ind++] = client.read();
       //Serial.write(client.read());
       //client.print(data);
       //Serial.print(data);
      }
      ind =0;
      if(data[ind]>0){
        lint = data;
        client.print(lint);//WiFi打印
        Serial.print(lint);
        data[ind]=0;
      }
      
    }
  }     
}

总结

后面还要使用esp32进行上位机制作,学到了其他的再往上面贴(懒惰.jpg)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录使用ESP32做WiFi模块使用的学习 的相关文章

  • SQL增删改查语句

    修改表数据 UPDATE products SET category Android where category 1 创建表 create table 表名 列名1 数据类型1 列名2 数据类型2 列名n 数据类型n 转载 https b
  • Qt之QLayout 遍历所有子项

    在使用QLayout做窗口布局时 有时候我们需要对其进行遍历得到子项 一般的我们都是通过自带的函数children 得到一个链表 然后再对链表进行遍历 首先我设置布局如下 设置布局 QVBoxLayout pLayout new QVBox
  • unity点击物体场景跳转

    1 点击File Building settings 点击 add open scenes 添加两个场景 注意后面的数字 2 在对应的button的onclick下面点击 添加点击事件 将对应的button拖进去 并选择脚本里面定义的方法
  • 第6章 分布式文件存储

    mini商城第6章 分布式文件存储 一 课题 分布式文件存储 二 回顾 1 理解Oauth2 0的功能作模式 2 实现mini商城项目的权限登录 三 目标 1 了解文件存储系统的概念 2 了解常用文件服务器的区别 3 掌握Minio的应用
  • zsh和oh-my-zsh的一些好用的主题及插件

    zsh主题 zsh的默认主题为robbyrussell 用了一段时间发现并不是那么好用 比如它不会把当前的工作路径全部展示出来 例如现在处于路径 home zhu go src MyProject中 此主题就只是显示最后路径 即MyProj
  • verdaccio + docker搭建私有npm仓库(有手就行)

    一 环境准备 docker 二 步骤 运行verdaccio docker run d name verdaccio p 4873 4873 restart always verdaccio verdaccio 该命令执行完 一个本地的np
  • 连休8天!关于2020年国庆节、中秋节放假安排的通知!!!

    关于2020年国庆节 中秋节放假安排的通知 根据国务院办公厅通知精神 现将2020年国庆节 中秋节放假安排通知如下 10月1日 星期四 至8日 星期四 放假调休 共8天 9月27日 星期日 10月10日 星期六 上班 请广大市民提前安排好工

随机推荐

  • springcloud微服务实战:(一)微服务重点内容

    微服务重点内容就是两大特性和三大功能 两大特性 高可用性 高扩展性 三大功能 服务间通信 服务容错 异常排查 分布式能力建设 三大功能是指微服务核心组件的功能维度 由浅入深层次递进 而两大特性是构建在每个服务组件之上的高可用性和高可扩展性
  • Windows 11 将使 AMD 芯片性能下降 15%!

    整理 孙胜 出品 CSDN ID CSDNnews 10月5日 微软终于发布了Windows 11正式版本 尽管Windows 11被微软称为 10年以来最重要的版本更新之一 说实话Windows 11还是有点令人失望 暂且不论Window
  • 基于CC2530的串口通信(可用与STM32通信)

    材料准备 CC2530芯片与底板一个 方便调试与下载 这是我淘宝买的一个小小的zigbee开发板 CC2530 配置串口的一般步骤 1 配置 IO 使用外部设备功能 此处配置 P0 2 和 P0 3 用作串口 UART0 2 配置相应串口的
  • 解决:error: ‘XXX’ is not a class template

    解决方法 首先去写 普通类模板 然后再实现 全特化 此问题在测试 模板全特化 的时候发现 如果首先去写 全特化 然后再实现 普通类模板 编译器就会提醒 error XXX is not a class template 全特化 templa
  • IDEA好用的插件推荐

    目录 1 Translation 2 GsonFormat 3 VisualVM Launcher 4 CodeGlance Pro 5 Key Promoter X 6 GenerateAllSetter 7 ignore 8 MyBat
  • 大白话Vue之publicPath

    1 下看一下publicPath字段出现的位置 vue config js webpack config js 2 官网中的解释 可以忽略 3 用人话解释publicPath 场景说明 每次打包build完后 都单独生成一个 dist文件夹
  • HTML基于mvc的项目实例,一个简单MVC5 + EF6示例分享

    本文所使用的软件及环境 Visual Studio Ultimate 2013 MVC5 EF6 NET Framework 4 5 LocalDB Windows 7 x64 Professional 说明 1 在EF Entity Fr
  • android的消息处理机制(图+源码分析)——Looper,Handler,Message

    http www cnblogs com codingmyworld archive 2011 09 14 2174255 html
  • 2019下半年上午题

    2019下半年上午题 b 选a c 最后统一单位 计算需要多少片芯片 流水线 也就是 对于这一道题 c ssl 安全套接层 https 安全通道 PGP 电子邮件加密 d b a b b 受委托方和委托方 c d 试题是考试系统中的一部分
  • 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】

    还愁没有练手的项目 我已经给你准备好了 需要评论区留下你的想法吧 1 引言 1 1 文档版本 版本 作者 审批 备注 V1 0 XXXX 创建测试方案文档 1 2 项目情况 项目名称 XXX 项目版本 V1 0 项目经理 XX 测试人员 X
  • 安川机器人io对照表_安川机器人信号

    逻辑编号针号 名称 信号 逻辑编号 针号 名称 信号 20010 B1 外部启动 in 20024 B1 in 20011 A1 in 20025 A1 in 20012 B2 调出主程序 in 20026 B2 抓手 搬运防碰撞 in 2
  • SVD实现数字水印

    SVD方法的基本原理是将水印嵌入到原始图像的奇异值中 具体流程如下 1 设输入图像为mxn矩阵A 对其进行SVD分解 2 设水印图像为mxn矩阵W 嵌入到到原图像奇异值中S aW a为加权系数 对其进行SVD分解的到含有水印的奇异值 3 用
  • Nginx SSL模块配置提供HTTPS支持(Ngx_http_ssl_module)

    Ngx http ssl module 此模块为Nginx提供HTTPS支持 官方文档 http nginx org en docs http ngx http ssl module html 相关指令 ssl on off SSL功能启用
  • 作为一个上班族,靠Python副业兼职,也能月入1W+

    不知道大家从事的是IT行业还是其他行业 想通过Python兼职首先就需要掌握这项专业技能 如果有Python技术基础 那能兼职的项目可就多了 我靠Python做兼职已经有三四年了 见过身边很多朋友同事陆续学Python 有学成的 也有中途放
  • python错误与异常、调试

    错误 语法错误 逻辑错误 系统错误 异常 程序执行过程中出现的未知错误 语法和逻辑都是正常的 程序业务逻辑不完善引起的程序漏洞 错误 与 异常的区别 异常可以被捕获和处理 错误一般是编码错误 逻辑错误 系统错误 常见的异常类型 除零类型 名
  • vue环境配置文件

    配置文件 在vue项目目录下 我们可以看到诸如package json gitignore package lock json等等能配置项目的结构 引用的库 运行的方式 版本控制等等的都称为配置文件 2 环境配置文件就是能根据项目运行的环境
  • MATLAB数字图像处理(三)——图像轮廓提取与边缘检测

    文章目录 二值图像轮廓提取 灰度图像边缘检测 含噪图像边缘检测 均值滤波函数 二值图像轮廓提取 根据掏空内部点算法 运用Matlab编程实现二值图像的轮廓提取 以二值图像circles为例 I imread circles png subp
  • 几何变换详解

    几何变换详解 在三维图形学中 几何变换大致分为三种 平移变换 Translation 缩放变换 Scaling 旋转变换 Rotation 以下讨论皆针对DirectX 所以使用左手坐标系 平移变换 将三维空间中的一个点 x y z 1 移
  • Centos7更新glibc2.18

    Centos7更新glibc2 18 查看glibc版本 下载解压glibc2 18 编译安装 结果验证 查看glibc版本 查看glibc版本 ldd version 下载解压glibc2 18 参考 https blog csdn ne
  • 记录使用ESP32做WiFi模块使用的学习

    这里使用ESP32作为WiFi模块 使用STA模式或者AP模式 目录 前言 二 配置WiFi模式 1 STA模式 2 AP模式 3 AP STA模式 三 实现ESP32与电脑端通信 ESP32的数据接收与传输 ESP32的完整代码 前言 因