ESP8266 or ESP32 一键配网







#include <EEPROM.h>
#
#include <DNSServer.h>

#include <dummy.h>


#include <ESP8266WebServer.h>

String sta_ssid,sta_password,SSIDA,PASSA;

const char* home_html= " <!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <h1>无线配网8266</h1> </head> <body><form name='input' action='/' method='POST'>路由器名称: <br><input type='text' name='ssid'><br>wifi密码:<br><input type='text' name='password'><br><input type='submit' value='保存'></form></body></html>";

const char*AP_NAME = "无线配网8266"; //8266wifi名字
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++

IPAddress apIP(192, 168, 4, 1); //配网IP地址
ESP8266WebServer server(80);//创建80端口服务器

const byte DNS_PORT = 53; //dns端口
DNSServer dnsServer;
//++++++++++++++++++++++++++
//构建初始化函数

void initBasic(void) {
  Serial.begin(115200); //设置串口波特率
  WiFi.hostname("esp8266");//设置设备名称(路由器可查)
}

//+++++++++++++++++++
//AP模式设置

void initSoftAP(void)
{
  WiFi.mode(WIFI_AP);//设置WIFI模式为AP模式(热点模式)
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); //配置AP网络设置 apIP=192.168.4.1 (ip地址,网关ip地址,子网掩码)

  if (WiFi.softAP(AP_NAME)) {
    Serial.println("ap star");
  }
}

//+++++++++++
//获取配网主页数据 函数handleRoot 功能描述:响应root请求,也就是ip请求

void handleRoot()
{
  server.send(200, "text/html", home_html);
  //第一个参数是返回的 HTTP 代码,200 表示一切正常
  //第二个参数是 mime-type 类型,浏览器通过这个来判断发来的是什么文件
  //第三个参数是 HTML 源码
}

//+++++++++++++++
//发出post请求并调用请求处理程序 函数handleRootPort

void handleRootPost() {
  Serial.println("handleRootPost");//串口打印函数以提示运行
  //+++++++++++++++++
  //判断是否输入路由器名字
  if (server.hasArg("ssid"))
  {


    Serial.println("路由器名字 ssid:");
    sta_ssid=server.arg("ssid");
//strcpy (sta_ssid,server.arg("ssid").c_str()); //拷贝数据到STA 模式中(联网模式SSID) strcpy(a,b)b赋值到a
 
    Serial.println(sta_ssid);//串口打印ssid数据
  }
  else {
    server.send(200, "text/html", "<meta charset='UTF-8'>error,not found ssid"); //判断无输入 返回错误页面
    return;//返回函数
  }
  //++++++++++++++++++++++++
  //判断是否输入路由器密码
  if (server.hasArg("password"))
  {


    Serial.println("路由器密码 password:");
    sta_password=server.arg("password");
//strcpy (sta_password,server.arg("password").c_str()); //拷贝数据到STA 模式中(联网模式password)

    
    Serial.println(sta_password);//串口打印password数据
    
  }
  else {
    
    server.send(200, "text/html", "<meta charset='UTF-8'>error,not found password"); //判断无输入 返回错误页面
    return;//返回函数
  }
  
  server.send(200, "text/html", "<meta charset='UTF-8'>保存成功"); //返回成功提示
  delay(2000);//延时2秒
  writeeeprom();//调用写eeprom
  delay(2000);//延时2秒
  connectNewWiFi();//链接wifi(自定义函数)
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//定义web服务

void initWebServer(void) {
//  server.on("/", HTTP_GET, handleRoot); //以HTTP_GET方式访问根目录,执行handleRoot函数
  server.on("/", HTTP_POST,handleRootPost); //以HTTP_POST方式访问根目录,执行handleRootPost函数
  server.onNotFound(handleRoot);//无法响应回调handleroot
  server.begin();//启动web服务器
  Serial.println("WebServer start");//串口打印提示已打开服务

}

//+++++++++++++++++++++++
//强制弹出登陆界面

void initDNS(void) {
  if (dnsServer.start(DNS_PORT, "*", apIP))
  {
    //判断地址映射8266是否成功并输出提示
    Serial.println("DNS start");

  } else Serial.println("DNS Not found");//反之输出失败提示

}

//++++++++++++++++++++++++++++++++++

//定义STA模式联网函数connectNewWiFi

void connectNewWiFi(void) {
  Serial.println("Connect to Wifi");
       readeeprom();//检测数据是否可用
  WiFi.mode(WIFI_STA);//打开STA模式
  WiFi.setAutoConnect(true);//设置自动连接
  
  WiFi.begin(sta_ssid,sta_password);//连接wifi
  Serial.println(WiFi.getMode());
  Serial.println("Connect to Wifi"); // 输出提示正在连接

  int count = 0; //定义变量count
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);//如果wifi没连接 延时1秒
    count ++; //count +1 变量增加
    if (count > 30) {
      //当循环到count递增大于10 重启配网步骤
        
      initSoftAP();
      initWebServer();
      initDNS();
   
 
      break;//跳出while 循环(防止bug)

    }
    Serial.println("."); //输出等待

  }
  Serial.println("");
  if (WiFi.status() == WL_CONNECTED) {
    //判断连接成功
    Serial.println(sta_ssid);
    Serial.println("IP address:");
    Serial.println(WiFi.localIP());//输出wifi ip地址
    server.stop();//关闭配网web服务

  }

}

//++++++++++++++++++++++++++++++
//掉电保存函数writeeeprom  and readeeprom
byte SSID_ADDR=0; //数据地址
byte PASSWORD_ADDR=0;//数据地址
byte SSID_NUM=0; //wifi名称
byte PASSWORD_NUM=0;//wifi密码

void writeeeprom(){
SSID_NUM=sta_ssid.length();//获取名称长度
PASSWORD_NUM=sta_password.length();//获取密码长度

 EEPROM.write(SSID_ADDR,SSID_NUM);//申请储存名称
  EEPROM.write(PASSWORD_ADDR,PASSWORD_NUM);//申请储存密码
 for (int i=0;i<SSID_NUM;i++){
  EEPROM.write(SSID_ADDR+1,SSID_NUM);}
 for (int x=0;x<PASSWORD_NUM;x++){
   EEPROM.write(PASSWORD_ADDR+1,PASSWORD_NUM);//申请储存密码
  }
  
  
 EEPROM.commit();//保存到eeprom
 
  //写函数
  }

void readeeprom(){

 
  if(EEPROM.read(SSID_ADDR) !=0)
  {
    //如果有数据执行赋值
    for (int a=0;a<SSID_ADDR;a++){
    sta_ssid +=char(EEPROM.read(SSID_NUM+a));}

Serial.println(sta_ssid);
Serial.println(" YOU SSID@!");
 for (int b=0;b<PASSWORD_ADDR;b++){
    sta_password +=char(EEPROM.read(PASSWORD_NUM+b));}

Serial.println(sta_password);
  Serial.println("NO FUND ");
 
    WiFi.mode(WIFI_STA);
     WiFi.begin(sta_ssid,sta_password);//连接wifi
  }else{ Serial.println("NO FUND YOU SSID@!");}//尝试连接wifi  
  }

//=========================================
//串口中断
//void serialEvent(){
//  if(Serial.available()>0){
//    Serial.println("ssssssssss");
//    
//    }
//  
//  
//  }




void setup() {
  EEPROM.begin(1024);//初始化EEPROM申请内存
  initBasic();//调用函数初始化
  

  connectNewWiFi();//尝试连接wifi

}

void loop() {
  server.handleClient();//调用函数handleClient检查http服务器访问
  dnsServer.processNextRequest();//调用函数
}

ESP8266 or ESP32 一键配网

出了一点小问题。EEPROM断电保存貌似读取有误。其他功能正常

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在上一期:高性价比WIFI图传方案快速入门教程 我们可以看到确实这个图传模块可以实现高性价比的图传方案,但是问题又来了,上一期的wifi摄像头连上的是局域网的热点,并且局域网的热点和密码是写死在程序里面的,所以让这个图传模块连上网络似乎比较头疼。 有一篇CSDN的博客论述了WIFI模块各种常见的配网方式说明及其比较,证明了最好的配网方式是WEB配网,反正个人觉得微信配网很麻烦,因为要使用微信,没有微信就没有办法了。在这一期项目中:将要实现一个WEB配网方式,通过ESP32-CAM先创建一个知道账号和密码的AP热点“daodanjishui”,然后用手机WIFI通过输入密码asdfghjkl连上这个热点,再用该手机打开浏览器,在浏览器网址输入栏输入192.168.4.1(热点的IP是固定的,如果想在局域网实现DNS域名解析,请看我:ESP32-CAM、ESP8266、WIFI、蓝牙、单片机、热点创建嵌入式DNS服务器(姐妹篇)),输入网址之后就可以看到保存在ESP32配网主页(如果想编写监控主页的话,请看我:ESP32-CAM、ESP8266、WIFI、蓝牙、摄像头设备实现嵌入式服务器点灯(原理图+源码)),在主页输入要链接的无线WIFI账号和密码 ,点击连接即可。连上Internet之后,自然可以轻松地发送get请求,最后请求"心知天气"的服务器(如果想自己搭建私人服务器的话,请看我:ESP8266作为客户端发送get请求和post请求的电路方案设计(原理图+程序))返回北京的天气预报(如果想实现私人天气报警的话,请看我:基于stm32、Android和Html的温湿度监控系统的设计(原理图+源码);如果想实现上传天气参数给私人服务器的话,请看我:ESP8266上传DHT11数据给私人javaweb服务器实现网页查询数据的电路方案(电路图+源码))给ESP32模块,最后ESP32-CAMM模块通过串口打印出来天气情况(如果想把串口打印的消息输出到网页,请看我:ESP32-CAM高性价比温湿度监控系统 和 ESP32-CAM无线监控智能网关的设计与实现)。 下面是实际演示过程: (1)模块上电,通过ESP32-CAM先创建一个知道账号和密码的AP热点“daodanjishui”,再输入密码连上去。 (2)打开该手机的随便一个浏览器,在浏览器输入IP:192.168.4.1(这个热点IP是不会变的,所以不用看串口打印的IP地址就可以写对),确定就跳转到一个配网主页。 (3)在配网主页输入需要连接路由器wifi和密码,点击连接 (4)如果密码正确,ESP32会在串口打印出有关网络信息(箭头1),并且利用该网络发送get请求(箭头2)。用户可以修改为LED指示灯也是没有问题的。 (5)互联网上的“心知天气”服务器收到该ESP32-CAM发送的get请求,就会把json格式的天气预报信息返回给ESP32-CAM,ESP32-CAM再将该信息打印到串口上(不想让程序复杂化,这里我没有做json字符串解析) 项目真源码截图: 总结:这套代码可以学到图传摄像头ESP32-CAM WEB配网、AP模式发布配网主页到手机浏览器、嵌入式服务器获取表单数据、STA模式连上Internet、发送GET请求给远程服务器获取天气预报。免费版的代码是没有注释的,收费版是有详细注释的,随君选择。本项目涉及到的有关项目都是原创为主,不是什么51单片机点灯之类程序,挑选的是比较新的前沿的设备进行创作。程序源码都经过严格测试,教程也详细到位,从而保证了含金,也欢迎广大电子爱好者和同学们采用相关的方案做电子设计、毕业设计或diy创作。 在本项目中放入的快捷链接,同样是精心准备的电路设计方案,都是软件和硬件结合联合调试的结晶,欢迎买家免费观看和了解。 后期将加入一些娱乐、玩耍和科幻创作的元素,敬请期待。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值