MODULE ARDUINO & THƯ VIỆN

ESP8266 – Tổng hợp tất cả các ví dụ và code

Ngày nay các thiết bị, được sản xuất để sử dụng thường xuyên hơn dựa trên công nghệ truyền thông không dây. Và việc mua một thiết bị không dây trở nên tự nhiên đối với tất cả mọi người và giá cả cho thiết bị WiFi ngày càng giảm theo thời gian. Hướng dẫn này sẽ giúp bạn tìm hiểu một trong những module WiFi rẻ nhất tương thích với arduino – ESP8266.

1. Giải pháp wifi giá rẻ dành cho các dự án IOT – ESP8266

Module tương thích với phần mềm arduino –  ESP8266 là chip Wi-Fi giá rẻ với khả năng kết nối TCP / IP và MCU (Vi xử lý) tích hợp cho phép điều khiển Digital I / O thông qua code Arduino. Thiết bị này được sản xuất bởi Espressif Systems.

ESP8266 lần đầu tiên được công bố vào tháng 8 năm 2014, với phiên bản ESP8266-01. Module này cho phép MCU kết nối với mạng WiFi và tạo các kết nối TCP / IP đơn giản.

Với giá thành rất thấp và kích thước nhỏ đáng kinh ngạc đã thu hút nhiều chuyên gia khám phá và sử dụng nó trong hàng loạt các dự án lớn khác nhau. Tiếp nối thành công này, Espressif sản xuất nhiều phiên bản có kích thước và thông số kỹ thuật khác nhau. Một trong những đàn em kế nhiệm là ESP32.

2. Thông số kỹ thuật module ESP8266

  • 32-bit CPU theo kiến trúc RISC: Tần số hoạt động 80 MHz **
  • 96 KiB RAM
  • Bộ nhớ Flash ngoài QSPI – Từ 512 KiB đến 4 MiB* (Lên đến 16 MiB)
  • Giao tiếp wifi chuẩn IEEE 802.11 b/g/n
  • Tích hợp TR switch, balun, LNA, khuếch đại công suất
  • Hỗ trợ xác thực WEP hoặc WPA/WPA2
  • 16 chân GPIO **
  • Giao tiếp SPI, I²C,
  • Giao tiếp I²S với DMA (Dùng chung GPIO)
  • Kết nối UART
  • 1 kênh ADC 10-bit

** Tốc độ CPU và flash có thể tăng lên qua việc ép xung trong một số thiết bị và 16 I/O có thể thay đổi trong một số module.

Module Arduino ESP8266 đi kèm với ăng-ten trên PCB. Phiên bản khác có thể có ăng-ten WiFi ở bên ngoài. ESP8266-01 chỉ có 6 chân, mặc dù MCU có thể hỗ trợ tới 16 I / O. Kích thước board: 14,3 x 24,8 mm.

Hiện nay có 2 phiên bản ESP8266-01 đang được bán trên thị trường. Chúng có hình dáng gần giống nhau nhưng bộ nhớ flash khác nhau. Bạn có thể sẽ gặp lỗi nếu sử dụng code cần bộ nhớ lớn.

3. Sơ đồ chân module esp8266

Chân trên esp8266 được chia làm 2 hàng, mỗi hàng có 4 chân. Hàng 4 chân ở phía trên module bao gồm các chân chức năng như sau:

  1. GND (Chân nối mass cấp nguồn)
  2. GPIO2 (Chân Digital I/O có thể lập trình được)
  3. GPIO0 (Chân Digital I/O có thể lập trình được đồng thời dùng cho BOOT mode)
  4. RX – Chân nhận tín hiệu UART

4 chân ở hàng dưới bao gồm:

  1. TX – Chân truyền tín hiệu UART
  2. CH_PD (Chân enable/kích mức thấp, thường được kéo lên với hiệu điện thế 3.3v trực tiếp hoặc qua điện trở)
  3. REST  – reset/kích mức cao (3v3)
  4. VCC  – Cấp nguồn 3v3

4. Cấp nguồn và định mức tiêu hao năng lượng của esp8266

Tất cả các module Esp8266 phải được cấp nguồn bằng nguồn điện DC có hiệu điện thế 3,3V và dòng tối thiểu là 250mA. Ngoài ra, tín hiệu logic hoạt động ở mức 3,3v và kênh RX phải được bảo vệ bằng cách chia điện áp xuống 3,3v. Bạn nên cẩn thận khi sử dụng module này với Arduino hoặc các bo mạch khác có I/O và được cấp nguồn 5v, vì module này thường không được bảo vệ quá áp và có thể dễ dàng bị hỏng.

Dưới đây là bảng định mức tiêu hao năng lượng từ Espressif:

Parameters Typical Unit
Tx802.11b, CCK 11Mbps, P OUT=+17dBm 170 mA
Tx 802.11g, OFDM 54Mbps, P OUT =+15dBm 140 mA
Tx 802.11n, MCS7, P OUT =+13dBm 120 mA
Rx 802.11b, 1024 bytes packet length , -80dBm 50 mA
Rx 802.11g, 1024 bytes packet length, -70dBm 56 mA
Rx 802.11n, 1024 bytes packet length, -65dBm 56 mA
Modem-Sleep 15 mA
Light-Sleep 0.9 mA
Deep-Sleep 10 uA
Power Off 0.5 uA

Nếu bạn muốn sử dụng module esp8266 được cấp nguồn bằng pin hoặc năng lượng mặt trời, bạn cần hiểu rõ Sleep mode của nó. Phiên bản hiện tại cho phép chúng ta thực hiện 3 phương pháp sleep mode khác nhau bằng cách thay đổi code chương trình. Thư viện ESP8266WiFi cung cấp cho chúng ta dòng lệnh với tham số có thể thay đổi được tương ứng với từng sleep mode ví dụ như là module tự thức dậy khi nhận được tín hiệu.

Mode quan trọng nhất là Deep-Sleep bởi vì nó tiêu thụ mức năng lượng thấp nhất. Deep sleep mode thường được sử dụng trong các dự án đo đạc thông tin khi mà bạn có khoảng thời gian nghỉ dài giữa các lần đo.

Để có thể sử dụng mode này, bạn cần nối thêm dây từ chân RESET và chân GPIO16 như hình bên dưới.

Sau khi nối dây, bạn sử dụng hàm sau để trigger deep sleep mode:

ESP.deepSleep(sleepTimeInSeconds * 1000000);

Chú ý rằng ESP8266-01 thường có hai đèn LED, một màu đỏ cho nguồn cấp và một màu xanh để hiện thị việc truyền dữ liệu. Đèn LED màu đỏ luôn sáng khi module được cấp nguồn và đèn led xanh nhấp nháy khi truyền dữ liệu. Đối với các phiên bản mới hơn, nhà sản xuất đã bỏ đèn LED đỏ để giảm thiểu năng lượng tiêu thụ. Vì vậy bạn chỉ nên mua module chỉ có LED màu xanh nếu bạn sẽ sử dụng pin để nuôi mạch.

Ở hình bên trái có 2 đèn LED trong khi hình bên phải chỉ có 1 đèn LED. Thiết kế PCB có thể khác biêt vì một số nhà sản xuất thay đổi linh kiện để cắt giảm chi phí sản xuất.

5. Lập trình với ESP8266 (AT / LUA / Arduino)

ESP8266 cung cấp nhiều phương thức giao tiếp thông qua UART (TX/RX) hoặc qua wifi (OTA – Over The Air). Các phương thức giao tiếp này có thể khác nhau phụ thuộc vào phần cứng và firmware được nạp bên trong vi xử lý. Mặc cho firmware đang sử dụng trên module là loại nào, bạn vẫn có thể nạp lại firmware bằng cách làm theo hướng dẫn của nhà sản xuất.

Module esp8266 có thể lập trình sử dụng LUA code, Arduino code hoặc qua AT commands. Ngoài ra, có một số firmware có thể lập trình sử dụng python nhưng chưa được nhiều người sử dụng. Trong ví dụ này chúng ta sử dụng Arduino code vì đây là loại phổ biến nhất hiện nay.

Để test module mới vừa mua về, bạn có thể sử dụng AT commands (tập lệnh AT) để kiểm tra. Bạn nên sử dụng ESPlorer để test module esp8266 với link download dưới dây:

Download ESPlorer

Một số câu lệnh AT đơn giản:

  • AT – response OK
  • AT+CWLAP – List tất cả các WiFi networks
  • AT+GMR – Kiểm tra firmware version
  • AT+CWJAP=”<access_point_name>”,”<password>” – Kết nối WiFi sử dụng username và password
  • AT+CIFSR – Trả về giá trị IP hiện tại

Bạn có thể tham khảo thêm: danh sách tập lệnh AT.

Bạn có thể kết nối để giao tiếp esp8266 thông qua board Arduino theo hình bên dưới. Nhưng trước tiên, bạn cần load chương trình “rỗng” vào board arduino.

UNO ESP-01
RX RX
TX TX
3.3v VCC
GND GND
RST 3.3v / float
CH_PD 3.3v

Sau đó, bạn sẽ nhận và truyền tập lệnh AT trong “Serial Monitor” bằng cách chọn cổng COM Arduino, đặt tốc độ baudrate phù hợp. Giá trị mặc định là 115200 và cài đặt NL & CR.

Giải pháp Firmware Over The Air (FOTA) cung cấp cho bạn khả năng mở rộng một cách dễ dàng. Do bạn có thể upload firmware từ xa thông qua kết nối Wi-Fi thay vì sử dụng cổng Serial. Đầu tiên, bạn cần upload firmware hỗ trợ OTA thông qua cổng serial và những firmware sau đó bạn có thể upload thông qua wifi. Vì bạn có thể upload firmware qua wifi nên module của bạn có thể bị hack từ xa. Do đó, bạn cần custom lại port và đặt password cho module của mình. Bạn có thể tham khảo giải pháp OTA thông qua thư viện sau đây:

Thư viện esp8266 Arduino OTA

Cách thứ 2 để các bạn có thể kết nối với esp8266 là thông qua module chuyển đổi giao tiếp từ USB sang TTL/FTDI sử dụng chip CH340GCP2102 hoặc FT232RL.

ESP-01 TTL / FTDI
RX TX
TX RX
VCC 3.3v
GND GND
RST 3.3v / float
CH_PD 3.3v

Chúng ta không nên sử dụng nguồn cấp 3v3 từ nguồn TTL 3.3v vì hầu hết chúng không thể cung cấp đủ năng lượng cho esp8266. Bộ hạ áp sử dụng trên các module này có hiệu suất tương đối thấp. Nếu bạn sử dụng nguồn ngoài, bạn cần phải nối GND chung.

Một số module có thể giao tiếp ở mức điện áp 3v3 nhưng nếu không, bạn cần phải hạ áp chân RX như hình bên dưới.

Ngoài ra, bạn có thể mua một số module hỗ trợ nạp firmware cho esp8266

Để có thể viết chương trình cho esp8266 thông qua phần mềm Arduino, bạn cần làm một số bước sau:

  1. Kết nối ESP8266-01 với PC thông qua module Serial
  2. Mở phần mềm Arduino IDE
  3. Click chọn File -> Preferences
  4. Thêm link này vào Additional Board Manager
  5. Click chọn Tools -> Board Manager
  6. Tìm ESP8266 board set và activate nó
  7. Chọn Generic ESP8266 board ở phần Tools->Boards
  8. Chọn cổng COM mà esp8266 đang kết nối

Bây giờ, để có thể upload chương trình vào module esp8266, bạn cần đặt module ở chế độ BOOT thích hợp. ESP8266-01 có các BOOT MODE sau:

MTDO / GPIO15 GPIO0 GPIO2 Mode Description
L L H UART Download code from UART
L H H Flash Boot from SPI Flash
H X X SDIO Boot from SD-card

Lưu ý: L = LOW (Nối với GND / -3.3v) và H = HIGH (nối với 3.3v)

Sau khi reset module trong BOOT MODE UART, bạn sẽ nhận một thông báo từ Serial Monitor là: “boot mode:[1,6]”, trong trường hợp setup đúng baudrate. Nếu setup baudrate sai sẽ hiển thị các ký tự vô nghĩa hoặc không có hiển thị. Sau đó, bạn có thể upload code của mình vào ESP8266. Khi upload hoàn tất, module sẽ tự reset. Đừng quên kéo mức H cho GPI0. Nếu không, module sẽ lại ở chế độ BOOT MODE và sẽ không hoạt động. Module có thể khởi động lại bằng cách kéo chân REST xuống mức L.

Khi bắt đầu upload code vào esp8266, Arduino IDE sẽ tự động include thư viện mà chúng ta đã khai báo trong code. Thư viện thường được sử dụng nhiều nhất là ESP8266WiFi cung cấp các câu lệnh hỗ trợ WiFiClient, WiFiServer, WiFiAccessPoint,… Bạn có thể tìm thấy các dự án khác nhau sử dụng esp8266 tại đây.

Dưới đây là ví dụ Blink nhằm test module esp8266 xem có hoạt động hay không.

a. Ví dụ Blink với ESP8266
/*
 ESP8266 Arduino Blink by Simon Peter
 Blink the blue LED on the ESP-01 module
 This example code is in the public domain
 
 The blue LED on the ESP-01 module is connected to GPIO1 
 (which is also the TXD pin; so we cannot use Serial.print() at the same time)
 
 Note that this sketch uses LED_BUILTIN to find the pin with the internal LED
*/

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
                                    // but actually the LED is on; this is because 
                                    // it is acive low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}

Đương nhiên, bạn có thể thử một ví dụ phức tạp hơn bằng cách upload ví dụ về việc ESP8266 gửi dữ liệu qua WiFi đến nền tảng iot data.spakfun.com.

b. Dùng ESP8266 để gửi dữ liệu lên IOT nền tảng data.spakfun.com
/*
 *  This sketch sends data via HTTP GET requests to data.sparkfun.com service.
 *
 *  You need to get streamId and privateKey at data.sparkfun.com and paste them
 *  below. Or just customize this script to talk to other HTTP servers.
 *  ESP8266 Arduino example
 */

#include <ESP8266WiFi.h>

const char* ssid     = "your-ssid";
const char* password = "your-password";

const char* host = "data.sparkfun.com";
const char* streamId   = "....................";
const char* privateKey = "....................";

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

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

int value = 0;

void loop() {
  delay(5000);
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  // We now create a URI for the request
  String url = "/input/";
  url += streamId;
  url += "?private_key=";
  url += privateKey;
  url += "&value=";
  url += value;
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");
}

Hoặc bạn có thể tự tạo server với esp8266 bằng cách dùng ví dụ ESP8266 Arduino Wifi Server

c. ESP8266 Arduino Wifi Server
/*
 *  This sketch demonstrates how to set up a simple HTTP-like server.
 *  The server will set a GPIO pin depending on the request
 *    http://server_ip/gpio/0 will set the GPIO2 low,
 *    http://server_ip/gpio/1 will set the GPIO2 high
 *  server_ip is the IP address of the ESP8266 Arduino module, will be 
 *  printed to Serial when the module is connected.
 */

#include <ESP8266WiFi.h>

const char* ssid = "your-ssid";
const char* password = "your-password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // Connect to WiFi network
  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");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}
d. Dùng ESP8266 Arduino WiFi Access Point làm hosts web server:
/* Create a WiFi access point and provide a web server on it.
ESP8266 Arduino example
 */

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>

/* Set these to your desired credentials. */
const char *ssid = "ESPap";
const char *password = "thereisnospoon";

ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
 * connected to this access point to see it.
 */
void handleRoot() {
	server.send(200, "text/html", "<h1>You are connected</h1>");
}

void setup() {
	delay(1000);
	Serial.begin(115200);
	Serial.println();
	Serial.print("Configuring access point...");
	/* You can remove the password parameter if you want the AP to be open. */
	WiFi.softAP(ssid, password);

	IPAddress myIP = WiFi.softAPIP();
	Serial.print("AP IP address: ");
	Serial.println(myIP);
	server.on("/", handleRoot);
	server.begin();
	Serial.println("HTTP server started");
}

void loop() {
	server.handleClient();
}

6. Tổng kết

Trên đây là tất cả các ví dụ và cách sử dụng esp8266. Các bạn có thể tham khảo thêm các module và thư viện khác tại:

https://www.abcarduino.com/category/module-arduino-va-thu-vien/

Nguồn: https://www.geekstips.com/esp8266-arduino-tutorial-iot-code-example/