Vietduino ESP32 #02# Theo dõi nhiệt độ phòng với ThingSpeak

Mục tiêu:

Làm một dự án nhỏ – đọc nhiệt độ môi trường trong phòng bằng cảm biến nhiệt độ DS18B20, sau đó gửi dữ liệu nhiệt độ lên ThingSpeak bằng ESP32.

Giới thiệu – ThingSpeak:

ThingSpeak là một dịch vụ nền tảng phân tích IoT cho phép bạn tổng hợp, trực quan hóa và phân tích các luồng dữ liệu trực tiếp trên “đám mây” (cloud).

Collect:

Bạn có thể gửi dữ liệu của các cảm biến lên đám mây từ “thiết bị” (vd: ESP32) của mình.

Analyze:

Bạn có thể xem dữ liệu trực tiếp trên web. Cũng như thực hiện phân tích và “trực quan hóa” (biểu đồ – đồ thị) dữ liệu của bạn với MATLAB.

Act:

Bạn có thể cài đặt kích hoạt một phản ứng (vd: gửi cảnh báo), dựa theo kết quả phân tích dữ liệu.

Chuẩn bị phần cứng:

  1. Mạch Vietduino Wifi BLE ESP32 (link sản phẩm).
  2. Mạch MakerEdu Shield for Vietduino (link sản phẩm).
  3. Cảm biến nhiệt độ DS18B20 (link sản phẩm) + “kèm cáp MakerEDU XH2.54 – XH2.54 3Wires 20cm cable”.
  4. Cáp USB Type C (link sản phẩm).

Chuẩn bị phần mềm:

  1. Cài đặt IDE Arduino vào máy tính (hướng dẫn).
  2. Cài đặt Driver CH340 vào máy tính (hướng dẫn).
  3. Cài đặt gói thư viện ESP32 vào IDE Arduino (hướng dẫn).
  4. Thêm thư viện ThingSpeak vào IDE Arduino (hướng dẫn).
  5. Tương tự, thêm thư viện OneWireDallasTemperature vào IDE Arduino.

Đăng ký ThingSpeak.

  • Truy cập ThingSpeak và nhấn vào nút [Get Started For Free] để tạo tài khoản.

  • Sau khi tài khoản của bạn đã được xác thực, hãy đăng nhập, mở thẻ [Channels] → chọn [My Channels].

  • Ở mục “My Channels”, nhấn nút [New Channel] để tạo một kênh mới.

  • Đặt tên cho kênh của bạn và tên [Field 1]. Trong ví dụ này, chúng ta chỉ gửi mỗi một loại giá trị lên là nhiệt độ (°C), nên bạn chỉ cần kích hoạt một “trường” (filed) thôi.
    → Bạn có thể bổ sung thêm các thông tin khác, để cung cấp thông tin đầy đủ hơn cho kênh này.
    → Cuối cùng, nhấn nút [Save Channel] để tạo và lưu kênh của bạn.

  • Sau khi kênh được tạo, bạn vào lại thẻ [Channels] → chọn [My Channels] → chọn kênh của bạn (trong ví dụ này là “DS18B20 Readings”). Có 2 việc kế tiếp bạn cần làm.

Tùy chỉnh biểu đồ:

  • Bạn có thể tùy chỉnh cách biểu đồ hiển thị, bằng cách nhấp vào thẻ [Private View] và nhấp vào “biểu tượng Edit” này.

  • Trong ví dụ này, mình cấu hình biểu đồ như sau. Để hiểu hơn về các thông số cấu hình, bạn nhấp vào “biểu tượng Help” này.
    → Cấu hình xong, bạn nhớ nhấn nút [Save] để lưu lại.

Lấy mã API:

  • Để ESP32 có thể gửi các giá trị lên ThingSpeak, bạn cần có “Write API Key”, bằng cách nhấp vào thẻ [API Keys] và sao chép Key này ở nơi an toàn, vì bạn sẽ cần dùng đến nó khi chỉnh code trong ESP32.

Các bước thực hiện.

Bước 1:

  • Kết nối cảm biến DS18B20 vào Connector Domino 3P theo thứ tự như sau:
    • Dây màu đỏ (Red)5V
    • Dây màu đen (Black)GND
    • Dây màu vàng (Yellow)SIG
  • Note: Bạn cần đảm bảo phần dây điện của cảm biến kết nối đúng và tiếp xúc tốt với Domino.

Bước 2:

  • Gắn “MakerEdu Shield” lên bo mạch ESP32.
  • Sau đó dùng cáp “XH2.54” kết nối giữa module cảm biến với port D9 trên shield.
  • Note: port D9 này sử dụng chân IO13 của ESP32. Để biết các chân tương ứng với những port khác, bạn có thể xem thông tin mặt sau của bo mạch ESP32.

  • Dùng cáp USB-typeC để kết nối bo mạch với máy tính.

Bước 3:

  • Mở phần mềm Arduino lên, tạo 1 dự án mới (File → New) và cấu hình như hình dưới đây.
    Note: chọn đúng cổng COM (có thể mở Device Manager để xác nhận chắc hơn).
    Tip: chọn Upload Speed = 921600 (để tăng tốc độ nạp code vào bo mạch).

  • Copy đoạn code sau vào file dự án của bạn.
/* ----------------------------------------------------------- */
/*                           LIBRARY                           */
/* ----------------------------------------------------------- */

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

#include <OneWire.h>
#include <DallasTemperature.h>

/* ----------------------------------------------------------- */
/*                            DEFINE                           */
/* ----------------------------------------------------------- */

//// Wifi ////
#define SSID_WIFI "REPLACE_WITH_YOUR_SSID"     // Your network SSID (name)
#define PASS_WIFI "REPLACE_WITH_YOUR_PASSWORD" // Your network password

//// The ThingSpeak ////
#define CHANNEL_NUMBER 1                 // Number of the channel that you’re publishing
#define WRITE_API_KEY "XXXXXXXXXXXXXXXX" // Insert the Write API key
#define TIME_UPDATE 30000UL              // How frequently you want to publish readings (ms)

//// DS18B20 ////
#define ONE_WIRE_BUS 13 // Use pin IO13 of ESP32

/* ----------------------------------------------------------- */
/*                            OBJECT                           */
/* ----------------------------------------------------------- */

WiFiClient client;

// Timer variables
unsigned long lastTime = 0;

// Variable to hold temperature readings
float tempC;

// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature
DallasTemperature ds(&oneWire);

/* ----------------------------------------------------------- */
/*                            CONFIG                           */
/* ----------------------------------------------------------- */

void setup()
{
  Serial.begin(115200);     // Initialize Serial
  ds.begin();               // Initialize DS18B20
  WiFi.mode(WIFI_STA);      // Initialize Wifi
  ThingSpeak.begin(client); // Initialize ThingSpeak
}

/* ----------------------------------------------------------- */
/*                             MAIN                            */
/* ----------------------------------------------------------- */

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

    // Send the command to get temperatures
    Serial.print(F("Requesting temperatures..."));
    ds.requestTemperatures();
    Serial.println(F("DONE"));

    // Get a new temperature reading
    float tempC = ds.getTempCByIndex(0);

    // Check if reading was successful
    if (tempC != DEVICE_DISCONNECTED_C)
    {
      Serial.print(F("Temperature for the device 1 (index 0) is: "));
      Serial.println(tempC);
    }
    else
    {
      Serial.println(F("Error: Could not read temperature data"));
    }

    /**
     * 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(CHANNEL_NUMBER, 1, tempC, WRITE_API_KEY);
    if (x == 200)
    {
      Serial.println(F("Channel update successful."));
    }
    else
    {
      Serial.print(F("Problem updating channel. HTTP error code "));
      Serial.println(x);
    }

    lastTime = millis();
  }
}

Bước 4:

  • Để ESP32 truy cập được Internet, bạn cần cung cấp thông tin mạng Wifi của bạn cho ESP32 sử dụng, gồm Tên mạng Wifi (SSID)Mật khẩu Wifi (PASS).
  • Note: nếu mạng Wifi của bạn không có mật khẩu, bạn để trống trong cặp dấu ngoặc đơn (“”).
/* --------------------------- Wifi -------------------------- */
// Your network SSID (name)
#define SSID_WIFI "REPLACE_WITH_YOUR_SSID"
// Your network password
#define PASS_WIFI "REPLACE_WITH_YOUR_PASSWORD"
  • Bạn cũng cần khai báo số “kênh” (channel) mà ESP32 sẽ đẩy lên ThingSpeak. Trong ví dụ này mình dùng 1 kênh.
  • ESP32 cũng cần được cung cấp Write API Key (có tất cả 16 kí tự) mà bạn đã có từ bước trên, để nó có thể truy cập và đẩy dữ liệu lên “đám mây” của ThingSpeak.
/* ---------------------- The ThingSpeak --------------------- */
// Number of the channel that you’re publishing
#define CHANNEL_NUMBER 1
// Insert the Write API key
#define WRITE_API_KEY "XXXXXXXXXXXXXXXX"
// How frequently you want to publish readings (ms)
#define TIME_UPDATE 30000UL
  • Thông số cuối cùng là “thời gian cập nhập” (Time Update), trong ví dụ này là cứ mỗi 30s, ESP32 sẽ đọc giá trị nhiệt độ từ cảm biến và cho gửi lên ThingSpeak ngay lập tức.

Bước 5:

  • Nạp chương trình và truy cập tài khoản ThingSpeak của bạn, vào kênh bạn vừa tạo và bạn sẽ thấy các chỉ số nhiệt độ được đẩy lên và vẽ trên biểu đồ.

  • Bạn cũng có thể mở cổng Serial Monitor (115200 baud) để xem thông tin chi tiết quá trình ESP32 gửi dữ liệu lên ThingSpeak.

Tìm kiếm

Các kênh truyền thông

Dịch vụ

Các chuyên mục

Bài viết liên quan

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments