ESP32 ThingSpeak – Cách hiển thị dữ liệu cảm biến cực đơn giản

Trong hướng dẫn về chủ đề ESP32 ThingSpeak lần này, mình sẽ hướng dẫn bạn cách gửi dữ liệu đọc được từ cảm biến lên ThingSpeak và hiển thị trực quan hơn. Trong bài dưới, mình sử dụng cảm biến nhiệt độ BME280 để phục vụ dự án, nhưng bạn có thể chọn bất kỳ cảm biến nào bạn thích đều được nhé!

ESP32 ThingSpeak - Cách hiển thị dữ liệu cảm biến cực đơn giản

ThingSpeak là một nền tảng cho phép chúng ta xuất bản dữ liệu từ cảm biến lên Website và hiển thị dưới dạng biểu đồ, có các cột mốc thời gian rất trực quan. Bạn có thể truy cập vào Website này để đọc dữ liệu đo được từ cảm biến tại mọi nơi, chỉ cần có kết nối Internet.

Chuẩn bị phần cứng

Để thực hiện dự án ESP32 ThingSpeak này, bạn cần chuẩn bị:

  • Mạch ESP32
  • Cảm biến nhiệt độ BME280
  • Breadboard
  • Dây Jumper

Cài thư viện trên Arduino IDE

Thư viện ThingSpeak

Có rất nhiều cách để gửi dữ liệu lên ThingSpeak. Trong hướng dẫn này, mình sẽ gợi ý cách đơn giản nhất – sử dụng thư viện ThingSpeak-Arduino.

Bạn có thể mở Arduino IDE và click theo thứ tự: Sketch >> Include Library >> Manage Libraries… và tìm kiếm từ khóa “ThingSpeak”, rồi tiến hành cài đặt thư viện ThingSpeak từ MathWorks nhé!

Cài thư viện phục vụ dự án ESP32 ThingSpeak
Cài thư viện phục vụ dự án ESP32 ThingSpeak

Thư viện BMT280

Như đã đề cập, mình sẽ lấy kết quả đo được từ cảm biến nhiệt độ BME280 để hiển thị lên ThingSpeak. Do đó, bạn cần cài đặt các thư viện sau để ESP32 có thể làm việc với cảm biến:

Hoặc ngoài ra, bạn cũng có thể mở Sketch >> Include Library >> Manage Libraries… và tìm kiếm tên thư viện, sau đó cài đặt bình thường.

Thư viện trên VS Code + PlatformIO

Nếu bạn thực hiện dự án ESP32 ThingSpeak này với VS Code và tiện ích mở rộng PlatformIO, bạn hãy copy đoạn code sau vào file platformio.ini để cài đặt các thư viện nhé:

lib_deps = mathworks/ThingSpeak@^2.0.0
            adafruit/Adafruit Unified Sensor @ ^1.1.4
            adafruit/Adafruit BME280 Library @ ^2.1.2  

Kết nối phần cứng

Mình sẽ kết nối BME280 với ESP32 thông qua giao tiếp I2C, cụ thể là nối với cổng GPIO 22 (SCL) và GPIO 21 (SDA) của ESP32 như hình:

Kết nối phần cứng cho dự án ESP32 ThingSpeak
Kết nối phần cứng cho dự án ESP32 ThingSpeak

Lưu ý: Bạn nên tham khảo sơ đồ chân GPIO của mạch ESP32 bạn đang dùng, để kết nối sao cho phù hợp nhé!

Làm việc với ThingSpeak

Bạn hãy truy cập ThingSpeak qua đường link bên dưới, và click vào “Get Started For Free” để tạo tài khoản mới và sử dụng. Tài khoản này được liên kết với tài khoản Mathworks, nên nếu bạn đã có tài khoản Mathworks thì bạn đăng nhập vào trực tiếp bằng tài khoản đó để dùng nhé!

https://thingspeak.com/

Tạo kênh (channel) mới

Sau khi có tài khoản, bạn đăng nhập vào, mở tab Channels và chọn My Channels:

Tạo kênh mới cho dự án ESP32 ThingSpeak

Click nút New Channel để tạo kênh mới:

Tạo kênh mới cho dự án ESP32 ThingSpeak

Bạn nhập tên và mô tả cho kênh của mình. Trong dự án ESP32 ThingSpeak này, mình xuất bản các dữ liệu về nhiệt độ nên mình sẽ cài đặt như bên dưới.

Nếu bạn muốn xuất bản thêm các thông số khác như độ ẩm, áp suất,… bạn có thể bật thêm nhiều trường thông tin khác tùy theo nhu cầu.

Tạo kênh mới cho dự án ESP32 ThingSpeak

Click vào Save Channel để lưu kênh vừa tạo.

Tùy chỉnh biểu đồ

Bạn có thể chuyển sang tab Private View và click vào biểu tượng chỉnh sửa, để tùy chỉnh biểu đồ của mình nhé:

Tùy chỉnh biểu đồ cho dự án IoT ESP32 ThingSpeak
Tùy chỉnh biểu đồ cho dự án IoT ESP32 ThingSpeak

Bạn có thể thay đổi tiêu đề, tùy chỉnh màu nền biểu đồ, trục x hoặc trục y,…. tùy thích:

Tùy chỉnh biểu đồ cho dự án IoT ESP32 ThingSpeak

Sau khi điền xong các thông tin, bạn nhấn Save.

API Key

Để gửi dữ liệu đọc được từ ESP32 đến ThingSpeak, chúng ta cần có một Write API Key. Bạn hãy mở tab “API Keys”, copy phần Write API Key và lưu lại. Chúng ta sẽ dùng đến chúng trong đoạn code của dự án ESP32 ThingSpeak này.

Lấy API Key cho dự án IoT ESP32 ThingSpeak

Code cho dự án ESP32 ThingSpeak

Bạn copy đoạn code sau vào Arduino IDE (hoặc copy vào file main.cpp nếu bạn dùng PlatformIO nhé). Lưu ý rằng bạn cần thay đổi một số thông tin thành của bạn như hướng dẫn ngay dưới đoạn code, thì code ESP32 ThingSpeak này mới chạy được.

#include <WiFi.h>
#include "ThingSpeak.h"
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";   // tên mạng WiFi của bạn 
const char* password = "REPLACE_WITH_YOUR_PASSWORD";   // mật khẩu mạng WiFi của bạn 
WiFiClient  client;

unsigned long myChannelNumber = X;
const char * myWriteAPIKey = "XXXXXXXXXXXXXXXX";

// Biến thời gian
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;

// Variable to hold temperature readings
float temperatureC;
//uncomment if you want to get temperature in Fahrenheit
//float temperatureF;

// Create a sensor object
Adafruit_BME280 bme; //BME280 connect to ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL)

void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

void setup() {
  Serial.begin(115200);  //Initialize serial
  initBME();
  
  WiFi.mode(WIFI_STA);   
  
  ThingSpeak.begin(client);  // Initialize ThingSpeak
}

void loop() {
  if ((millis() - lastTime) > timerDelay) {
    
    // Connect or reconnect to WiFi
    if(WiFi.status() != WL_CONNECTED){
      Serial.print("Attempting to connect");
      while(WiFi.status() != WL_CONNECTED){
        WiFi.begin(ssid, password); 
        delay(5000);     
      } 
      Serial.println("\nConnected.");
    }

    // Get a new temperature reading
    temperatureC = bme.readTemperature();
    Serial.print("Temperature (ºC): ");
    Serial.println(temperatureC);
    
    //uncomment if you want to get temperature in Fahrenheit
    /*temperatureF = 1.8 * bme.readTemperature() + 32;
    Serial.print("Temperature (ºC): ");
    Serial.println(temperatureF);*/
    
    
    // Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
    // pieces of information in a channel.  Here, we write to field 1.
    int x = ThingSpeak.writeField(myChannelNumber, 1, temperatureC, myWriteAPIKey);
    //uncomment if you want to get temperature in Fahrenheit
    //int x = ThingSpeak.writeField(myChannelNumber, 1, temperatureF, myWriteAPIKey);

    if(x == 200){
      Serial.println("Channel update successful.");
    }
    else{
      Serial.println("Problem updating channel. HTTP error code " + String(x));
    }
    lastTime = millis();
  }
}

Để code ESP32 ThingSpeak trên hoạt động, bạn cần chèn thông tin mạng WiFi của bạn vào đoạn code sau:

const char* ssid = "REPLACE_WITH_YOUR_SSID";   
const char* password = "REPLACE_WITH_YOUR_PASSWORD";  

Bạn cũng cần chèn số thứ tự của kênh trên ThingSpeak mà bạn muốn hiển thị dữ liệu. Nếu bạn chỉ có 1 kênh duy nhất trên ThingSpeak, số kênh sẽ là 1. Bạn có thể theo dõi số kênh ở tab Private View trên ThingSpeak.

unsigned long myChannelNumber = 1;

Cuối cùng, bạn cần chèn Write API Key mà bạn đã lưu lại lúc nãy:

const char * myWriteAPIKey = "XXXXXXXXXXXXXXXX";

Demo dự án ESP32 ThingSpeak

Vậy là xong, chúng ta đã hoàn thành dự án ESP32 ThingSpeak! Bạn hãy nạp đoạn code trên vào mạch EPS32 của mình, hệ thống sẽ kết nối thành công và gửi các thông tin đọc được từ cảm biến lên ThingSpeak.

Demo dự án ESP32 ThingSpeak

Lời kết

Trong bài viết trên, mình đã hướng dẫn bạn cách thực hiện dự án ESP32 ThingSpeak cực kỳ đơn giản, nhằm hiển thị dữ liệu từ cảm biến một cách trực quan. Chúc bạn thành công!

Trên Web IoTZone còn khá nhiều bài viết khác về ESP32, bạn có thể tham khảo nếu thích nhé:

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *