ESP8266 是一款由樂鑫 Espressif 公司製作的低成本的 Wi-Fi 芯片,具有完整的 TCP / IP 協議棧和微控制器功能。它專爲移動設備、可穿戴電子產品和物聯網應用設計,功耗很低且價格非常低廉。
我這裏使用的 NodeMcu 開發板即搭載了這款芯片。
Arduino IDE 是由 Arduino 官方提供的支持 C 語言的集成開發環境,主要是針對 Arduino 系列的開發板進行編程。
通過簡單的配置,可以在原本的編程環境裏添加上對 ESP8266 開發板的支持。對於熟悉 Arduino 函數庫和開發流程的用戶,基本上沒有任何使用上的區別。
一、添加 ESP8266 支持
首先從 Arduino 官網 下載最新版本的 Arduino IDE 軟件並安裝。
安裝完成以後,進入首選項(Preferences),找到附加開發板管理器地址(Additional Board Manager URLs),並在其後添加如下信息:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
之後點擊工具 - 開發板 - 開發板管理器,進入開發板管理器界面:
找到 esp8266 並安裝:
安裝完成後,重啓 Arduino IDE 軟件。在工具 - 開發板選項中即會看到 ESP8266 開發板的選項:
二、測量溫溼度
本例中使用 DHT11 溫溼度傳感器測量室內溫度和溼度,再把測量所得的結果輸出至 Arduino IDE 的串口監視器中。
源代碼
在 Arduino IDE 中新建項目並寫入如下代碼:
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT11
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE, 15);
void setup() {
// Start Serial
Serial.begin(115200);
// Init DHT
dht.begin();
}
void loop() {
// Reading temperature and humidity
float h = dht.readHumidity();
float t = dht.readTemperature();
// Display data
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
// Wait a few seconds between measurements.
delay(2000);
}
由於源代碼中首行引入的 DHT 庫並不是 Arduino IDE 內置的庫文件,需要先點擊項目 - 加載庫 - 管理庫進入庫管理器,搜索安裝如下兩個依賴庫(Adafruit Unified Sensor 和 DHT sensor library):
線路連接
該測試項目只需要連接好 NodeMcu 開發板與 DHT11 溫溼度模塊(或者單獨的 DHT11 元件配合 5kΩ 的上拉電阻),無需額外的傳感器模塊和電子組件。
線路連接示意圖如下:
NodeMcu | DHT11 |
---|---|
3V3 | VCC(Pin1) |
GND | GND(Pin4) |
D1 | DATA(Pin2) |
3V3 | 5k 電阻 - DATA(Pin2) |
編譯運行
Arduino IDE 實際上支持非常多的基於 ESP8266 芯片設計的開發板,如 Adafruit Feather HUZZAH ESP8266、LOLIN (WEMOS) D1 mini 等。可以根據自己購買的開發板的具體型號,在編譯前選擇對應的開發板選項(工具 - 開發板)。
我這裏使用的是開源的 NodeMcu v1.0 開發板,編譯代碼前確保選擇正確:
最終的運行效果如下:
呃,,南方的冬天,外面在下雨。室內,沒開空調。。。(後面溫溼度升高是因爲,我對着傳感器哈氣了。。。)
注意事項
可以看到,源代碼中的 DHTPIN
(即傳感器 DATA 引腳需要連接的開發板引腳 )定義爲 5
,但開發板實際連接的是 D1
引腳(而不是 D5
)。
ESP8266 芯片有自己的引腳(GPIO)佈局,但是基於該芯片設計的衆多開發板,對於芯片上 GPIO 的引出方式卻有自己的規則。
即源代碼中的 5
指的並不是開發板的引腳 D5
,而是 ESP8266 的引腳 GPIO 5
,對應到開發板上即是 D1
引腳。
相關的引腳佈局如下圖所示:
三、Wi-Fi 連接
ESP8266 最大的特性就是其超低成本的 Wi-Fi 實現。
這裏簡單貼出其連接 Wi-Fi 的示例代碼:
// Import required libraries
#include <ESP8266WiFi.h>
// WiFi parameters
const char* ssid = "your_wifi_name";
const char* password = "your_wifi_password";
void setup(void)
{
// Start Serial
Serial.begin(115200);
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Print the IP address
Serial.println(WiFi.localIP());
}
void loop() {
}
運行結果如下:
四、aREST
aREST 框架可以爲一些常見的嵌入式開發板提供 RESTful 接口,支持通過串口、Wi-Fi、以太網、藍牙等硬件發送命令至開發板,激發特定的操作,並將數據以 JSON 的格式返回給控制端用戶。
使用 aREST 框架既可以在本地網絡環境中控制聯網設備,也可以藉助雲端平臺進行遠程操作或監控。
結合之前的溫溼度項目,可以將連接 Wi-Fi 後的 NodeMcu 開發板作爲一個實現了 REST API 的本地服務器,通過訪問其 IP 地址來獲取相應的溫溼度數據(JSON 格式)。
代碼如下:
// Import required libraries
#include "ESP8266WiFi.h"
#include <aREST.h>
#include "DHT.h"
// DHT11 sensor pins
#define DHTPIN 5
#define DHTTYPE DHT11
// Create aREST instance
aREST rest = aREST();
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE, 15);
// WiFi parameters
const char* ssid = "wifi-name";
const char* password = "wifi-pass";
// The port to listen for incoming TCP connections
#define LISTEN_PORT 80
// Create an instance of the server
WiFiServer server(LISTEN_PORT);
// Variables to be exposed to the API
float temperature;
float humidity;
void setup(void)
{
// Start Serial
Serial.begin(115200);
// Init DHT
dht.begin();
// Init variables and expose them to REST API
rest.variable("temperature",&temperature);
rest.variable("humidity",&humidity);
// Give name and ID to device
rest.set_id("1");
rest.set_name("esp8266");
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());
}
void loop() {
// Reading temperature and humidity
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// Handle REST calls
WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
delay(1);
}
rest.handle(client);
}
運行效果:
以上只是一些基礎的使用介紹吧,,,後續比如更加複雜的網絡服務、對接公共的物聯網雲平臺及 MQTT 協議等內容,有時間再看看。我去,光着腳,12℃。凍死我了。。。