8266wifi模块开发详解(二)基本用法
扫描二维码
随时随地手机看文章
1. 文章说明2. 硬件电路2.1 外观介绍2.2 引脚分布3. 软件设计3.1 闪灯3.2 按键3.3 PWM3.4 SoftAP3.5 STA模式3.6 AP+STA3.7 Scan WiFi4. 总结
1. 文章说明
本文主要结合上面的工程环境,利用vscode+platformIO物联网开发环境,同时使用当下最流行的开源硬件系统Arduino学习与掌握对硬件的编程方法。对于物联网的江湖世界,Arduino犹如掀起一股浪潮的屠龙宝刀,将继续为这风起云涌的物联网时间贡献力量。文章就是就是采用Arduino。Talk is cheap!
2. 硬件电路
2.1 外观介绍
对于硬件的使用,采用的是NODEMCU。如下图所示
基本上就是这个样子。一句话概括。NodeMCU,是一个开源的物联网平台。淘宝上14元左右即可拿下。
2.2 引脚分布
NodeMCU引脚分布如下图所示。其中用户按键FLASH 为GPIO16,LED为GPIO16。
3. 软件设计
3.1 闪灯
对于最开始的设计,先演示一下闪灯操作。闪灯也是最直观看到程序效果的方法,犹如机器的心跳,能够用眼睛看到程序的运行。这也就是最基本的入门程序。
目的
让开发板上的灯闪烁起来!
程序如下
#define PIN_LED 16 //定义LED void setup() {
pinMode(PIN_LED,OUTPUT);
} void loop() {
digitalWrite(PIN_LED,LOW); //低电平点亮 delay(500);
digitalWrite(PIN_LED,HIGH);
delay(500);
}
非常的简单,将程序放入VSCode进行编译,然后下载到开发板就可以看到程序正常启动了。当然,这都是非常简单的操作。
3.2 按键
按键作为外部输入设备,可以作为外界的感应给设备。那么究竟如何使用这个按键呢?下面通过按键来进行点灯操作。
扫描方式
扫描就是每隔一定时间去查看一下按键的状态,如果按键达到了需求的状态则进行相关的操作。
#define PIN_LED 16 //定义LED #define KEY_FLASH 0 //定义按键 void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
pinMode(PIN_LED,OUTPUT);
pinMode(KEY_FLASH,INPUT);
} void keyScan() { int k = 0;
k = digitalRead(KEY_FLASH);
Serial.println("keyScan:");
Serial.write(k);
Serial.println(); if(k == 0)
{
digitalWrite(PIN_LED,HIGH);
} else {
digitalWrite(PIN_LED,LOW);
}
} void loop() {
keyScan();
delay(500);
}
中断方式
中断就相当于闹钟,平时它什么事情也不做,当按键事件到来时,就触发了相应的操作。
#include "Arduino.h" #define PIN_LED 16 //定义LED #define KEY_FLASH 0 //定义按键 volatile int state = HIGH; void stateChange(); void setup() {
Serial.begin(74880);
Serial.setDebugOutput(true);
pinMode(PIN_LED,OUTPUT);
pinMode(KEY_FLASH,INPUT);
attachInterrupt(KEY_FLASH,stateChange,RISING);//下降沿中断 digitalWrite(PIN_LED,HIGH);//低电平点亮 } void stateChange() {
state = !state;
Serial.printf("state:%d\n",state);
digitalWrite(PIN_LED,state);
} void loop() {
}
3.3 PWM
先讲一下什么是PWM,也就是脉冲宽度调制。本来数字电路就是输出高低电平来维持设备的正常工作,PWM就可以输出断断续续的电平,从而通过占空比来调节输出电压。典型的应用就是控制液晶显示屏的背光灯的亮度。或者控制电机的转速和角度。下面我们通过一个示例来讲解PWM的调节。
目标:呼吸灯
呼吸灯就是按照特定的频率明暗变化的闪灯方式,犹如人体肺部吸入和呼出空气一样慢慢的变化。
#define PIN_LED 16 void setup() {
pinMode(PIN_LED,OUTPUT);
analogWrite(PIN_LED,0);//信号模拟输出 } void loop() { for(int i = 0; i < 1024; i++)
{
analogWrite(PIN_LED,i);
delay(2);
} for(int i = 1024; i >= 0; i--)
{
analogWrite(PIN_LED,i);
delay(2);
}
}
程序如上所述,通过控制输出到LED上的PWM占空比,从而间接调节两端的电压。进一步让其输出明暗的效果。
3.4 SoftAP
既然是联网模块,那么就一定要涉及到网络部分才叫wifi模块。8266的网络支持功能是非常的强大的,这个也是该模块的特点。下面主要讲一下AP与STA。先来说说AP。AP就是Access Point 也就是访问接入点。一般就是网络的创建者,对于家庭或者办公室来说,一个无线路由器就是AP,而其他的外设就是STA。
从原理上来说,我们接下来的实验是要实现一个接入点,也就是路由器一样的功能。
#include #include //自定义AP的SSID与密码 const char *ssid = "BA_AP"; const char *password = "bigmagic"; //申明端口 ESP8266WebServer server(80); //设定 web 服务的成功响应信息 void handleRoot() {
Serial.print("\n123...\n");
server.send(200, "text/html", "
You are connected
");
} void setup() {
delay(1000);
Serial.begin(74880);
Serial.println();
Serial.print("Configuring access point..."); /*如果使用开放式 AP 模式,可以把下面语句的 password 参数省略 */ WiFi.softAP(ssid, password); //获取 AP 的 IP 地址,存入变量 myIP IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP); //调用 on 方法,给客户端发送响应信息,启动 web 服务,并在串口回显 server.on("/", handleRoot);
server.begin();
Serial.println("HTTP server started");
} //循环等待处理客户端的连接 void loop() {
delay(100);
Serial.print(".");
server.handleClient();
}
程序执行后,我们可以用手机收到名称为BA_AP的WIFI信息,同时连接上wifi后浏览器访问192.168.4.1即可看到网页上显示You are connected的信息。同时可以在串口控制台上看到123的输出。
3.5 STA模式
与AP模式相对应,STA就是连接到路由器上的设备。这种模式使用的最多。下图中路由器是AP,其他的手机,电脑,开发板都是属于STA的范畴。
在讲今天的程序之前,可以看看设备是如何联网的。
首先AP在不断的向周围发出信号,也就是信标帧(beacon)。STA如果开启WiFi也会每隔一定的事件发送探测帧(probe)。这样其实有一个问题,就是会有不良的使用者制作WIFI探针。今年的315上报道了WIFI探针的问题。也就是自带WIFI功能的手机,即使在不连接WIFI的情况下,只要开启了WIFI的功能,那么信息就有可能被截获到。
其整个流程如下:
连接WIFI程序如下
#include //连接AP账号 const char* ssid = "ChinaNet-pUas" const char* password = "zhao565658" void setup()
{
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
} void loop() {
}
串口打印信息如下
并且可以在路由器管理中看到设备,表示连接成功。
3.6 AP+STA
8266可以既作为AP也同时可以作为STA,这就需要内部有两个MAC地址。这种方式就像笔记本电脑既可以联网,也可以开启热点一样。作为数据直接转发功能。
3.7 Scan WiFi
8266可以扫描附件的WiFi信息,和手机上扫描热点一样。下面来实现一下这个功能
#include "ESP8266WiFi.h" void setup() {
Serial.begin(115200); //设定 WiFi 为 STA 模式,如果先前已连接上 AP,则与之断开 WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Setup done");
} void loop() {
Serial.println("scan start"); // WiFi.scanNetworks 可以返回扫描到的无线网络数目 int n = WiFi.scanNetworks();
Serial.println("scan done"); if (n == 0)
Serial.println("no networks found"); else {
Serial.print(n);
Serial.println(" networks found"); for (int i = 0; i < n; ++i)
{ /*在串口输出所发现的每一个无线网络的 SSID 和所接收的信号强度 RSSI */ Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")"); //判断 WiFi 网络是否加密,并输出结果 Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
delay(10);
}
}
Serial.println(""); //连续扫描的时间间隔 delay(3000);
}
通过串口可以看到串口消息如下
表示列出附件的WiFi的相关信息。
4. 总结
本次分享的文章主要是对8266进行基本的操作,演示了基本的用法和功能,更加高级的用法后面再做研究。好的东西用起来的效果就是不一样。前面的实验对于初学者来说,可以全面的了解这个模块的功能,如果是大神可以直接忽略,因为太过简单。后面再慢慢深入研究该模块的使用。





