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 <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程式如下
#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資訊,和手機上掃描熱點一樣。下面來實作一下這個功能
#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進行基本的操作,示範了基本的用法和功能,更加進階的用法後面再做研究。好的東西用起來的效果就是不一樣。前面的實驗對于初學者來說,可以全面的了解這個子產品的功能,如果是大神可以直接忽略,因為太過簡單。後面再慢慢深入研究該子產品的使用。