热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ESP8266+安信可微信智能配网

文章目录ESP8266一.前言二.环境三.代码讲解1.讲解2.示例3.blinker添加智能配网四.开始配网1.微信配网2.EspTouch软件五.总结ESP8266一.前言ES


文章目录

  • ESP8266
    • 一.前言
    • 二.环境
    • 三.代码讲解
      • 1.讲解
      • 2.示例
      • 3.blinker添加智能配网
    • 四.开始配网
      • 1.微信配网
      • 2. EspTouch软件
    • 五.总结


ESP8266


一.前言

在这里插入图片描述
ESP8266模块深受发大电子爱好者的追捧,但是ESP8266连接网络是个问题,相信好多朋友都是将wifi名称和密码写死在代码中的,就像我这样

char ssid[] = "IT老翟"; //你的WiFi热点名称
char pswd[] = "123456789"; //你的WiFi密码

但是问题来啦,当我们的设备或一个地方或是wifi名称变了,那还得我们拆开设备来,重新改代码烧程序,作为客户来这样使用,估计换做谁都无法接受。今天给大家说用如何用微信或者软件,一键给我们的wifi模块配网


二.环境


  • 我们使用 Arduin IDE 来编译我们的程序
  • 微信 安信可 公众号
  • EspTouch 安卓软件

三.代码讲解


1.讲解

当我们模块上电,先来检测看望了有没有连接成功,如果连接成功就不需要再继续配网,如果5s后没有连接成功,之间进入微信配网

/*连接网络*/
void ESP_Connect()
{Serial.println("\r\n正在连接WIFI...");while(WiFi.status()!=WL_CONNECTED)//判断是否连接WIFI成功{if(WIFI_Status){Serial.print(".");digitalWrite(LED_BUILTIN, HIGH); delay(500); digitalWrite(LED_BUILTIN, LOW); delay(500); count++;if(count>=5)//5s{WIFI_Status = false;Serial.println("WiFi连接失败,请用手机进行配网"); } }else{smartConfig(); //微信智能配网}}Serial.println("连接成功"); Serial.print("IP:");Serial.println(WiFi.localIP());
}

下面是微信配网的程序,配置成功的
wif名称为: WiFi.SSID().c_str()
密码为: WiFi.psk().c_str()

/* 微信智能配网 */
void smartConfig()
{WiFi.mode(WIFI_STA);//设置STA模式Serial.println("\r\nWait for Smartconfig...");//打印log信息WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码while(1){Serial.println(".");digitalWrite(LED_BUILTIN,HIGH);//指示灯闪烁delay(1000);digitalWrite(LED_BUILTIN,LOW);//指示灯闪烁delay(1000);if(WiFi.smartConfigDone())//配网成功,接收到SSID和密码{Serial.println("SmartConfig Success");Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());break; }}
}

2.示例

//智能配网
#include //WIFI库,配网必需int count = 0; //时间计数
bool WIFI_Status = true; //WIFI状态标志位/* 微信智能配网 */
void smartConfig()
{WiFi.mode(WIFI_STA);//设置STA模式Serial.println("\r\nWait for Smartconfig...");//打印log信息WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码while(1){Serial.println(".");digitalWrite(LED_BUILTIN,HIGH);//指示灯闪烁delay(1000);digitalWrite(LED_BUILTIN,LOW);//指示灯闪烁delay(1000);if(WiFi.smartConfigDone())//配网成功,接收到SSID和密码{Serial.println("SmartConfig Success");Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());break; }}
}/*连接网络*/
void blinkerConnect()
{Serial.println("\r\n正在连接WIFI...");while(WiFi.status()!=WL_CONNECTED)//判断是否连接WIFI成功{if(WIFI_Status){Serial.print(".");digitalWrite(LED_BUILTIN, HIGH); delay(500); digitalWrite(LED_BUILTIN, LOW); delay(500); count++;if(count>=5)//5s{WIFI_Status = false;Serial.println("WiFi连接失败,请用手机进行配网"); } }else{smartConfig(); //微信智能配网}}Serial.println("连接成功"); Serial.print("IP:");Serial.println(WiFi.localIP());
}void setup() {// 初始化有LED LED_BUILTIN 为开发板的指示灯管脚pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, HIGH);//网络连接blinkerConnect();
}void loop() {
}

3.blinker添加智能配网

如果我们使用blinker点灯科技,也需要连接网络,blinker给的库函数为 Blinker.begin(auth,ssid,pswd) ,那我们如何配置可以看下面代码
这里以点灯程序为例

//智能配网
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT#include
#include //WIFI库,配网必需// 新建组件对象
BlinkerButton Button1("key");
BlinkerNumber Number1("num-abc");int counter = 0;int count = 0; //时间计数
bool WIFI_Status = true; //WIFI状态标志位#define led D3 //要操作的IO
char auth[] = "xxxxxxxxx"; //设备秘钥自己改/* 微信智能配网 */
void smartConfig()
{WiFi.mode(WIFI_STA);//设置STA模式Serial.println("\r\nWait for Smartconfig...");//打印log信息WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码while(1){Serial.println(".");digitalWrite(LED_BUILTIN,HIGH);//指示灯闪烁delay(1000);digitalWrite(LED_BUILTIN,LOW);//指示灯闪烁delay(1000);if(WiFi.smartConfigDone())//配网成功,接收到SSID和密码{Serial.println("SmartConfig Success");Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());break; }}
}/*连接网络*/
void blinkerConnect()
{Serial.println("\r\n正在连接WIFI...");while(WiFi.status()!=WL_CONNECTED)//判断是否连接WIFI成功{if(WIFI_Status){Serial.print(".");digitalWrite(LED_BUILTIN, HIGH); delay(500); digitalWrite(LED_BUILTIN, LOW); delay(500); count++;if(count>=5)//5s{WIFI_Status = false;Serial.println("WiFi连接失败,请用手机进行配网"); } }else{smartConfig(); //微信智能配网}}Serial.println("连接成功"); Serial.print("IP:");Serial.println(WiFi.localIP());
}// 按下按键即会执行该函数
void button1_callback(const String & state) {BLINKER_LOG("get button state: ", state);if(state == "on"){Button1.print("on");digitalWrite(led, HIGH);}else if(state == "off"){Button1.print("off");digitalWrite(led, LOW);}
}// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{BLINKER_LOG("Blinker readString: ", data);counter++;Number1.print(counter);
}void setup() {// 初始化串口Serial.begin(115200);#if defined(BLINKER_PRINT)BLINKER_DEBUG.stream(BLINKER_PRINT);#endif//初始化控制的led灯pinMode(led, OUTPUT);digitalWrite(led, LOW);// 初始化有LED的IOpinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, HIGH);//网络连接blinkerConnect();// 初始化blinkerBlinker.begin(auth,WiFi.SSID().c_str(),WiFi.psk().c_str()); //根据配网得到的WIFI信息和设备秘钥,连接到Blinker云Blinker.attachData(dataRead);Button1.attach(button1_callback);//注册按键回调函数
}void loop() {Blinker.run();
}

四.开始配网

我们将程序烧入我们的开发板,接下来就来配网,这里介绍两种方式一种是微信一种是app ,两种方式都是一样的,都是利用Arduino 封装好的 smartConfigDone() 函数来实现


1.微信配网

我们首先来关注微信公众号 “安信可科技”,注意配网时需要手机连接需要配置的 wifi热点,还需要开启定位
进入公众号需要点击右下角,进入配网
在这里插入图片描述


2. EspTouch软件

先下载软件,同样需要连接wifi热点,大家定位,我这没有连接热点所有SSID: 没有显示


下载地址:EspTouch 下载


在这里插入图片描述


五.总结

这种办法配置网络还是比较方便的,我们配置一次后我们的wifi名称和密码会被写入到flash中,所以下次开启后会自动连接网络,不会让我们继续配网,如何wifi名称和密码和之前的不一样,就需要我们配网

再说一下配网过程中,esp8266指示灯的一个变化
模块上电之后,自动进入配网判断,指示灯每0.5s闪闪一次,5s内网络配置成功,指示灯熄灭,如果超过5s,还没连接成功进入微信配网,每1s灯闪烁一次,一直循环,知道连接成功,指示灯停止闪烁

代码中的打印信息大家调试完可以屏蔽,这样可以提高代码的运行速度




推荐阅读
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
author-avatar
CJFONe
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有