天天看點

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。如下圖所示

8266wifi子產品開發詳解(二)基本用法

基本上就是這個樣子。一句話概括。NodeMCU,是一個開源的物聯網平台。淘寶上14元左右即可拿下。

8266wifi子產品開發詳解(二)基本用法

2.2 引腳分布

NodeMCU引腳分布如下圖所示。其中使用者按鍵FLASH 為GPIO16,LED為GPIO16。

8266wifi子產品開發詳解(二)基本用法

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。

8266wifi子產品開發詳解(二)基本用法

從原理上來說,我們接下來的實驗是要實作一個接入點,也就是路由器一樣的功能。

#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的範疇。

8266wifi子產品開發詳解(二)基本用法

在講今天的程式之前,可以看看裝置是如何聯網的。

首先AP在不斷的向周圍發出信号,也就是信标幀(beacon)。STA如果開啟WiFi也會每隔一定的事件發送探測幀(probe)。這樣其實有一個問題,就是會有不良的使用者制作WIFI探針。今年的315上報道了WIFI探針的問題。也就是自帶WIFI功能的手機,即使在不連接配接WIFI的情況下,隻要開啟了WIFI的功能,那麼資訊就有可能被截獲到。

其整個流程如下:

8266wifi子產品開發詳解(二)基本用法

連接配接WIFI程式如下

#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()
{

}
           

複制

序列槽列印資訊如下

8266wifi子產品開發詳解(二)基本用法

并且可以在路由器管理中看到裝置,表示連接配接成功。

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); 
} 
           

複制

通過序列槽可以看到序列槽消息如下

8266wifi子產品開發詳解(二)基本用法

表示列出附件的WiFi的相關資訊。

4. 總結

本次分享的文章主要是對8266進行基本的操作,示範了基本的用法和功能,更加進階的用法後面再做研究。好的東西用起來的效果就是不一樣。前面的實驗對于初學者來說,可以全面的了解這個子產品的功能,如果是大神可以直接忽略,因為太過簡單。後面再慢慢深入研究該子產品的使用。