Arduino IDE 搭建 ESP8266 開發環境及項目演示

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 SensorDHT 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 ESP8266LOLIN (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℃。凍死我了。。。

參考資料

Internet of Things with ESP8266 (English Edition)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章