ESP8266 và IOT (Part 1): Làm quen với ESP8266

banner_28

Giới thiệu

ESP8266 là một wifi SOC (system on a chip) được phát triển bởi Espressif Systems . ESP8266 được tích hợp với đầy đủ các tính năng về internet với kích thước rất nhỏ gọn với mức giá khiêm tốn (tầm 2$). Đây là sự lựa chọn tuyệt vời cho những ai triển khai dự án IOT, thiết bị cầm tay, mobile…

Trong những Toturials này, chúng tôi cố gắng cung cấp nhiều nhất kiến thức về Module ESP8266, đồng thời xây dựng các bài hướng dẫn về các ứng dụng IOT của ESP8266.

Tổng quan về ESP8266

Tổng quan

ESP8266 là dòng chip Low-power và là một wifi SOC nên cần rất ít linh kiện ngoài (tầm 7 thành phần) Hoạt động trong dãi nhiệt -40°C to +125°C

Mạch tích ở High Level

ESP8266EX là một trong những dòng chip tích hợp Wifi trong lĩnh vực công nghiệp. Với kích thước chỉ 5mmx5mm, ESP8266EX cần rất ít linh kiện hỗ trợ ngoài

ESP8266EX được tích hợp 32-bit Tensilica MCU, các ngoại vi cơ bản, antenna switches, RF balun, khuếch đại công suất, khuếch đại nhận nhiễu thấp (low noise), bộ lọc và các modules quản lý nguồn.

32-bit Tensilica MCU

ESP8266EX tích hợp vi xửa lý Tensilica L106 32-bit (MCU) là dòng chip low-power, 16-bit RSIC, tốc độ clock cao nhất là 160 MHz. Nếu hệ thống hoạt động với Real Time Operation System (RTOS) và Wi-Fi stack thì ta có khoảng 80% khả năng xử lý cho ứng dụng người dùng.

Low Power Management

Với những ứng dụng cho mobile, thiết bị điện tử cẩm tay và Internet of Things (IoT), ESP8266EX hoạt động với mức tiệu thụ năng lượng rất thấp với nhưng công nghệ độc quyền. Tính năng tiết kiệm năng lượng với 3 chế độ hoạt động – active mode, sleep mode và deep sleep mode, vì vậy cho phép hiện thực những thiết bị với thời lượng Pin rất lớn.

Là thiết kế bền vững

Hoạt động với dãi nhiệt khá rộng  -40°C to +125°C (trong công nghiệp), ESP8266EX có thể hoạt động tốt trong môi trường công nghiệp. Với sự tích hợp cao, dòng chip này hoạt động với rất ít linh kiện ngoài làm tăng độ tin cậy, chặt chẽ và ổn định cao.

Module ESP8266

Là mạch được thiết kế với các components khác (flash memory, antenna, LEDs…). Dựa trên kích thước và số lượng chân ra, có nhiều phiên bản cho Module này:  ESP-01, ESP-02, ESP-03… Phổ biến nhất là ESP-12.

ESP-12
ESP-12
schematic_esp-12e
Nguyên lý Module ESP-12

Đây là chân ngõ ra của phiên bản ESP-12

esp-12 pinout
Chân ngõ ra của ESP-12

Thiết lập phần cứng với Module ESP8266

Chúng tôi thiết lập thêm một số linh kiện để module có thể hoạt động được.

Đầu tiên, bạn cần cấp nguồn cho chip. Dòng chip này hoạt động ở 3.3V, bạn phải cẩn thận nếu bạn kết nối ESP8266 với các thiết bị 5V.

Tiếp theo, bạn cần 1 Module  USB to TTL (USB-UART) để nạp chip. Kêt nối TX và RX pins của module USB-UART  với RX và TX pins của ESP8266

Chân GPIO 2 nên set lên high lúc boot. Chân GPIO 0 phải được set low trong lúc upload 1 chương trình mới, và high lúc boot. Nếu bạn sử dụng model ESP-12, chân GPIO 15 nên là low lúc boot. Các đường kết nối nên sử dụng các điện trở, ở đây tôi dùng điện trở 2.2K. Chân CH_PD  (chip-enable) bạn nên luôn để mức high.

Bạn nên mắc 1 nút reset module cho tiện trong lúc thao tác với module.

Chúng ta có mạch như sau:

ESP8266_12E-FTDI_bb
Cách lắp mạch trên Breadboard

Sử dụng Arduino IDE

ESP8266 được hỗ trợ bởi Arduino IDE, nếu bạn chưa cài đặt, bạn có thể dowload tại đây (Đảm bảo phiên bản là 1.6.4 hoặc cao hơn).  Lý do chính cho việc sử dung Arduino IDE cho ESP8266 thay cho SDK của Espressif là vì nó đơn giản và có công động lớn.

Bây giờ bạn cần thêm một extension vào Arduino IDE để có thể sử dụng để lập trình ESP8266. Vào File > Preferences và trong Additional Boards Managers URLs, nhập URL cho ESP8266 pagekage: http://arduino.esp8266.com/stable/package_esp8266com_index.json . Sau đó vào Tools > Board và mở Boards Manager. Tìm esp8266 (ESP8266 community) và Install nó. Vào Tools > Board và chọn board tương ứng (Generic ESP8266 nếu bạn đang sử dụng model ESP-01). Bạn đã sẵn sàng để upload chương trình đầu tiên. Chọn một chương trình đơn giản (ví dụ Blink) từ File > Examples và upload để chắc chắn rằng bạn đã thiết lập mọi thứ hoàn toàn.  Việc upload mất khoảng một lúc để hoàn thành, cửa sổ dưới sẽ như thế này:

Window
Window

 

Trên đây tôi chỉ giải thích cách đơn giản nhất những gì phải làm để bắt đầu và chạy ESP8266, và chúng khá vắn tắt vì tôi mặc định rằng bạn có một ít kinh nghiệm về điện tử và vi điều khiển. Nếu bạn thiếu một số thông tin hoặc có vấn đề nào đó, hãy comment câu hỏi bên dưới bài này.

Thingspeak

Sau khi upload và chạy thành công chương trình blink, chúng ta sẽ làm gì đó khó hơn. Bạn có thể kết nối với internet và truyền nhận dữ liệu. Khi bạn add extension của ESP8266 vào Arduino IDE, vào File > Examples và bạn sẽ thấy hàng chục ví dụ. Tôi đề nghị bạn nên thử một vài chương trình để làm quen với những hàm cơ bản để kết nối (connecting) với một server, thiết lập một client hoặc webserver, gửi HTTP request… ESP8266 là dòng chip đa năng, với số lượng lớn các ứng dụng. Nó có thể hoạt động như một station kết nối với local access point, hoặc như một asscess point, hoặc cả 2 cùng một lúc. Bạn có thể những tính năng khó hơn trong những bài viết của Neil Kolban.

Nếu bạn tìm ESP8266 tutorials online, bạn có thể gặp rất nhiều tutorials giới thiệu về cách nào kết nối với ESP8266 với platform gọi là Thingspeak. Đó là một open source IOT platform cho phép bạn kết nối với thiết bị của bạn, thu thập và hiển thị dữ liệu. Các kết nối được tiến hành thông qua HTTP protocol. Nó cho phép bạn viết Matlab code để hiện thực việc nhận dữ liệu, rất tiện lợi. Bạn có thể dễ dàng lấy bất cứ dữ liệu nào từ webpage. Có rất nhiều resources cho nó, nên chúng tôi không đưa hết chúng ở đây, thay vào đó, tôi sẽ hướng dẫn bạn một ví dụ về việc gửi POST request với các giá trị ADC (Analogue to Digital Converter) được đẩy lên Thingspeak channel của bạn (lưu ý là ADC trên ESP8266 là 10-bit với max là 1V). Chúng tôi đã kết nối một biến trở (potentiometer) với ADC cho mục đích này (Sử dụng 1k potentiometer với 2 điện trở 1k trong khoảng maximum output)

ESP8266_12E-FTDI_bb-potentiometer

Thingspeak cung cấp khả năng để thiết lập các phản ứng khi có một tác động từ sự thay đổi dữ liệu. Ví dụ, bật máy làm lạnh khi nhiệt độ tăng vượt ngưỡng trên. Vì nó là opensource, nên có giới hạn về thời lượng trao đổi dữ liệu.

Sau khi bạn tạo một account tại https://thingspeak.com, vào Channels > My Channels và click vào New Channel. Đặt một cái tên tương ứng vào phần mô tả (description) nếu cần. Sau đó check các box cho các field và đặt tên chung, ví dụ như ADC Value. Chúng ta chỉ cần 1 field cho Demo này. Có thêm một số options khác như tạo các channel public hoặc thêm kinh độ và vĩ độ. Sau khi điền những giá trị này, click Save Channel. Dưới Private View, bạn nên xem dồ thị tương ứng với field đầu tiên từ channel của chúng ta với tên là ADC Value. Bây giờ, vào API keys. Chúng ta muốn gửi một con số (ADC value) thông qua POST request. Vì chúng ta muôn viết vào một channel, chúng ta cần Write API Key (cái mà sẽ được đưa vào trong body của request). API Key này dùng cho mục đích định danh (authentication). Copy và lưu chuỗi ký tự này. Sau đó vào Data Import/Export. Phía bên phải, bạn sẽ thấy một danh sách các API khả dụng. Bạn có thể thấy một định dạng của một POST request chúng ta muốn gửi. Chúng ta phải xác định API key và giá trị field. Định dạng này được dùng trong code dưới đây:

#include <ESP8266WiFi.h>

//enter your values for ssid and password
const char* ssid     = "";
const char* password = "";
const char* host = "api.thingspeak.com";

//enter write API key 
String api_key = "";

void setup() {

Serial.begin(115200);

// We start by connecting to a WiFi network
  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() {

int ADC_value = analogRead(A0); 
  
  // 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 = "/update.json";
  
  String content = String("api_key=") + api_key + "&" + "field1=" + ADC_value;
  int content_length = content.length();
           
  Serial.print("Requesting URL: ");
  Serial.println(url);
    
  client.print(String("POST ") + url + " HTTP/1.1" + "\r\n" +
  "Host: " + String(host) + "\r\n"
  "Content-Length: " + content_length + "\r\n\r\n" + 
  content + "\r\n\r\n"
  );

int _time = millis();
 
  while(!client.available()){
    delay(1);
    if(millis()-_time>3000){ //wait 3 seconds max for response
      Serial.println("No response.");
      break;
    }
  }
                
  while(client.available()){
    String line = client.readStringUntil('\r'); //print response
    Serial.print(line);
  }
       
  client.stop();
  Serial.println("closing connection"); 
  delay(15000); //thingspeak limit
}

Sau khi upload chương trình này, bạn nên xem các điểm trên dồ thị hiển thị giá trị ADC. Ở đây, khoảng thời gian nhỏ nhất cho 2 lần request là 15s.

ADC values
ADC values

Bây giờ bạn có để gắn một sensor vào kênh ADC để hiển thị vài gía trị vật lý, ví dụ như cảm biến nhiệt. Tôi khuyên bạn nên vào App và dạo vòng vòng để xem cái nào có thể mở rộng hệ thống của bạn. Thêm Matlab code để sử dụng dữ liệu (hiển thị, lưu, chuyển đổi, tính toán ý nghĩa dữ liệu…) hoặc làm một số việc khi có một thay đổi từ giá trị cảm biến.

Việc quản lý năng lượng rất quan trong trong Internet of Things. Thật may là có một cách để giảm việc tiệu thụ năng lượng trên ESP8266. Nó hỗ trợ vài chế độ sleep (modem, light và deep). Hiệu quả nhất là deep sleep mode và sóng radio bị tắt khi chi vào chế độ này. Mức tiêu thu sẽ rớt một cách đáng kể xuống 10uA (khoảng 70mA trong chế độ thường).

Nếu chúng ta muốn chip vào chế độ deep sleep mode. Chúng ta viết dòng code ESP : deepSleep(15000000, WAKE_RF_DEFAULT) thay cho delay(15000). Lưu ý rằng trong fuction này được set với đơn vị microseconds. Sau 15s, chúng ta muốn chip phải wake up. Chúng ta phải sử một điển nhỏ trong hardware. Bạn phải đật một tụ (tôi dùng tụ 10uF) giữa RST và GPIO 16, chúng ta sẽ giảm mức tiêu thụ năng lượng đáng kể

ESP8266_12E-FTDI_bb-potentiometer-cap

Bạn vừa built ứng dụng IOT đầu tiên! Trong bài kế tiếp, chúng ta sẽ cùng hiện thực các chuẩn giao tiếp và IBM Bluemix platform cái mà sẽ cho phép chung ta build nhiều hệ thống phức tạp

Các bài cùng Series

(Part 1): Làm quen với ESP8266
(Part 2): ESP8266 với MQTT
(Part 3): Kết nối ESP8266 với IBM Bluemix
(Part 4): Dùng Cloudant DB trong IBM Bluemix để lưu trữ dữ liệu
(Part 5): Gửi Email và SMS thông báo khi bị trigger từ dữ liệu cảm biến
(Part 6): Hiển thị dữ liệu cảm biến với IBM Bluemix
(Part 7): Vị trí Devices trên Map
(Part 8): Nhận Motion Alarm Notifications trong Slack
(Part 9): Điều khiển thiết bị trong nhà bằng Slack

Tham khảo: Codingo

Comments

linhkienbachkhoa

Comments