ESP8266 是一款由樂(lè)鑫 Espressif 公司制作的低成本的 Wi-Fi 芯片,具有完整的 TCP / IP 協(xié)議棧和微控制器功能围来。它專為移動(dòng)設(shè)備跺涤、可穿戴電子產(chǎn)品和物聯(lián)網(wǎng)應(yīng)用設(shè)計(jì)匈睁,功耗很低且價(jià)格非常低廉。
我這里使用的 NodeMcu 開發(fā)板即搭載了這款芯片桶错。
Arduino IDE 是由 Arduino 官方提供的支持 C 語(yǔ)言的集成開發(fā)環(huán)境航唆,主要是針對(duì) Arduino 系列的開發(fā)板進(jìn)行編程。
通過(guò)簡(jiǎn)單的配置院刁,可以在原本的編程環(huán)境里添加上對(duì) ESP8266 開發(fā)板的支持糯钙。對(duì)于熟悉 Arduino 函數(shù)庫(kù)和開發(fā)流程的用戶,基本上沒(méi)有任何使用上的區(qū)別退腥。
一任岸、添加 ESP8266 支持
首先從 Arduino 官網(wǎng) 下載最新版本的 Arduino IDE 軟件并安裝。
安裝完成以后狡刘,進(jìn)入首選項(xiàng)(Preferences)享潜,找到附加開發(fā)板管理器地址(Additional Board Manager URLs),并在其后添加如下信息:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
之后點(diǎn)擊工具 - 開發(fā)板 - 開發(fā)板管理器嗅蔬,進(jìn)入開發(fā)板管理器界面:
找到 esp8266 并安裝:
安裝完成后剑按,重啟 Arduino IDE 軟件。在工具 - 開發(fā)板選項(xiàng)中即會(huì)看到 ESP8266 開發(fā)板的選項(xiàng):
二澜术、測(cè)量溫濕度
本例中使用 DHT11 溫濕度傳感器測(cè)量室內(nèi)溫度和濕度艺蝴,再把測(cè)量所得的結(jié)果輸出至 Arduino IDE 的串口監(jiān)視器中。
源代碼
在 Arduino IDE 中新建項(xiàng)目并寫入如下代碼:
#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 庫(kù)并不是 Arduino IDE 內(nèi)置的庫(kù)文件瘪板,需要先點(diǎn)擊項(xiàng)目 - 加載庫(kù) - 管理庫(kù)進(jìn)入庫(kù)管理器吴趴,搜索安裝如下兩個(gè)依賴庫(kù)(Adafruit Unified Sensor 和 DHT sensor library):
線路連接
該測(cè)試項(xiàng)目只需要連接好 NodeMcu 開發(fā)板與 DHT11 溫濕度模塊(或者單獨(dú)的 DHT11 元件配合 5kΩ 的上拉電阻),無(wú)需額外的傳感器模塊和電子組件侮攀。
線路連接示意圖如下:
NodeMcu | DHT11 |
---|---|
3V3 | VCC(Pin1) |
GND | GND(Pin4) |
D1 | DATA(Pin2) |
3V3 | 5k 電阻 - DATA(Pin2) |
編譯運(yùn)行
Arduino IDE 實(shí)際上支持非常多的基于 ESP8266 芯片設(shè)計(jì)的開發(fā)板锣枝,如 Adafruit Feather HUZZAH ESP8266、LOLIN (WEMOS) D1 mini 等兰英∑踩可以根據(jù)自己購(gòu)買的開發(fā)板的具體型號(hào),在編譯前選擇對(duì)應(yīng)的開發(fā)板選項(xiàng)(工具 - 開發(fā)板)畦贸。
我這里使用的是開源的 NodeMcu v1.0 開發(fā)板陨闹,編譯代碼前確保選擇正確:
最終的運(yùn)行效果如下:
呃,薄坏,南方的冬天趋厉,外面在下雨。室內(nèi)胶坠,沒(méi)開空調(diào)君账。。沈善。(后面溫濕度升高是因?yàn)橄缡覍?duì)著傳感器哈氣了椭蹄。。净赴。)
注意事項(xiàng)
可以看到绳矩,源代碼中的 DHTPIN
(即傳感器 DATA 引腳需要連接的開發(fā)板引腳 )定義為 5
,但開發(fā)板實(shí)際連接的是 D1
引腳(而不是 D5
)玖翅。
ESP8266 芯片有自己的引腳(GPIO)布局翼馆,但是基于該芯片設(shè)計(jì)的眾多開發(fā)板,對(duì)于芯片上 GPIO 的引出方式卻有自己的規(guī)則烧栋。
即源代碼中的 5
指的并不是開發(fā)板的引腳 D5
写妥,而是 ESP8266 的引腳 GPIO 5
,對(duì)應(yīng)到開發(fā)板上即是 D1
引腳审姓。
相關(guān)的引腳布局如下圖所示:
三、Wi-Fi 連接
ESP8266 最大的特性就是其超低成本的 Wi-Fi 實(shí)現(xiàn)祝峻。
這里簡(jiǎn)單貼出其連接 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() {
}
運(yùn)行結(jié)果如下:
四魔吐、aREST
aREST 框架可以為一些常見(jiàn)的嵌入式開發(fā)板提供 RESTful 接口,支持通過(guò)串口莱找、Wi-Fi酬姆、以太網(wǎng)、藍(lán)牙等硬件發(fā)送命令至開發(fā)板奥溺,激發(fā)特定的操作辞色,并將數(shù)據(jù)以 JSON 的格式返回給控制端用戶。
使用 aREST 框架既可以在本地網(wǎng)絡(luò)環(huán)境中控制聯(lián)網(wǎng)設(shè)備浮定,也可以借助云端平臺(tái)進(jìn)行遠(yuǎn)程操作或監(jiān)控相满。
結(jié)合之前的溫濕度項(xiàng)目,可以將連接 Wi-Fi 后的 NodeMcu 開發(fā)板作為一個(gè)實(shí)現(xiàn)了 REST API 的本地服務(wù)器桦卒,通過(guò)訪問(wèn)其 IP 地址來(lái)獲取相應(yīng)的溫濕度數(shù)據(jù)(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);
}
運(yùn)行效果:
以上只是一些基礎(chǔ)的使用介紹吧,方灾,建蹄,后續(xù)比如更加復(fù)雜的網(wǎng)絡(luò)服務(wù)、對(duì)接公共的物聯(lián)網(wǎng)云平臺(tái)及 MQTT 協(xié)議等內(nèi)容裕偿,有時(shí)間再看看洞慎。我去,光著腳嘿棘,12℃劲腿。凍死我了。蔫巩。谆棱。