首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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 闪灯

对于最开始的设计,先演示一下闪灯操作。闪灯也是最直观看到程序效果的方法,犹如机器的心跳,能够用眼睛看到程序的运行。这也就是最基本的入门程序。

目的

让开发板上的灯闪烁起来!

程序如下

代码语言:javascript
复制
#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 按键

按键作为外部输入设备,可以作为外界的感应给设备。那么究竟如何使用这个按键呢?下面通过按键来进行点灯操作。

扫描方式

扫描就是每隔一定时间去查看一下按键的状态,如果按键达到了需求的状态则进行相关的操作。

代码语言:javascript
复制
#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);
}

中断方式

中断就相当于闹钟,平时它什么事情也不做,当按键事件到来时,就触发了相应的操作。

代码语言:javascript
复制
#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的调节。

目标:呼吸灯

呼吸灯就是按照特定的频率明暗变化的闪灯方式,犹如人体肺部吸入和呼出空气一样慢慢的变化。

代码语言:javascript
复制
#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。

从原理上来说,我们接下来的实验是要实现一个接入点,也就是路由器一样的功能。

代码语言:javascript
复制
#include <ESP8266Wifi.h>
#include <ESP8266WebServer.h>
//自定义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", "<h1>You are connected</h1>");
}

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程序如下

代码语言:javascript
复制
#include <ESP8266WiFi.h>
//连接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信息,和手机上扫描热点一样。下面来实现一下这个功能

代码语言:javascript
复制
#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进行基本的操作,演示了基本的用法和功能,更加高级的用法后面再做研究。好的东西用起来的效果就是不一样。前面的实验对于初学者来说,可以全面的了解这个模块的功能,如果是大神可以直接忽略,因为太过简单。后面再慢慢深入研究该模块的使用。

下一篇
举报
领券