ESP8266 Trung bình

ESP8266 gửi dữ liệu cảm biến lên ThingSpeak

Đưa số liệu nhiệt độ lên đám mây để xem biểu đồ từ bất cứ đâu, dùng dịch vụ miễn phí ThingSpeak.

08.09.20269 phút đọc

Chạy web server trên bo chỉ xem được trong mạng nhà. Muốn xem số liệu khi đang ở ngoài đường, cần gửi dữ liệu lên một dịch vụ trên internet. ThingSpeak cho tài khoản miễn phí với giới hạn gửi mỗi 15 giây một lần, quá đủ cho dự án theo dõi nhiệt độ.

Linh kiện cần có

Linh kiệnSố lượngGiá tham khảo
Bo NodeMCU ESP82661~75.000đ
Cảm biến DHT221~55.000đ
Điện trở 10kΩ1~500đ
Cáp micro USB1~25.000đ

Giá tham khảo ở các cửa hàng linh kiện tại Việt Nam, tháng 10/2026. Giá thay đổi theo thời điểm và nơi bán.

Sơ đồ nối dây

Chân linh kiệnNối vào
DHT22 VCC3V3
DHT22 DATAD4 (GPIO 2), kèm điện trở 10kΩ kéo lên
DHT22 GNDGND

Rút nguồn trước khi cắm dây. Kiểm tra lại toàn bộ sơ đồ rồi mới cắm USB.

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

Bước 1. Tạo kênh trên ThingSpeak

Đăng ký tài khoản tại thingspeak.com, vào Channels → New Channel. Đặt tên kênh, tick ô Field 1 đặt tên là Nhiệt độ, tick Field 2 đặt tên Độ ẩm, rồi bấm Save.

Bước 2. Lấy khoá ghi

Mở tab API Keys của kênh, chép chuỗi ở ô Write API Key. Chuỗi này giống mật khẩu, đừng đăng công khai lên mạng.

Bước 3. Cài thư viện

Trong Boards Manager, cài gói esp8266 by ESP8266 Community với đường dẫn https://arduino.esp8266.com/stable/package_esp8266com_index.json. Sau đó cài thư viện ThingSpeak của MathWorks trong Library Manager.

Bước 4. Điền thông tin và nạp

Sửa ba chỗ trong code: tên WiFi, mật khẩu, số kênh và khoá ghi. Nạp xong mở Serial Monitor để xem bo báo gửi thành công hay chưa.

Mã nguồn

esp8266_thingspeak.ino
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include "DHT.h"

#define DHTPIN  2        // chan D4 tren NodeMCU
#define DHTTYPE DHT22

const char* ssid     = "TEN_WIFI";
const char* password = "MAT_KHAU";

unsigned long soKenh   = 1234567;        // so kenh cua ban
const char*  khoaGhi   = "KHOA_GHI_CUA_BAN";

DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;

void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
  Serial.println("\nDa ket noi WiFi");
  ThingSpeak.begin(client);
}

void loop() {
  float nhietDo = dht.readTemperature();
  float doAm    = dht.readHumidity();

  if (!isnan(nhietDo) && !isnan(doAm)) {
    ThingSpeak.setField(1, nhietDo);
    ThingSpeak.setField(2, doAm);

    int ketQua = ThingSpeak.writeFields(soKenh, khoaGhi);
    if (ketQua == 200) Serial.println("Gui thanh cong");
    else {
      Serial.print("Loi, ma tra ve: ");
      Serial.println(ketQua);
    }
  }

  delay(20000);   // ThingSpeak mien phi: toi thieu 15 giay moi lan
}

Giải thích code

setField() xếp giá trị vào ô chờ, writeFields() mới thật sự gửi cả gói lên máy chủ. Gộp như vậy chỉ tốn một lần gọi mạng cho nhiều giá trị.

Mã trả về 200 là thành công. Mã -401 nghĩa là sai khoá ghi, mã -301 là mất kết nối. Biểu đồ xem ở tab Private View của kênh.

Lỗi thường gặp

  • Luôn trả về -401Chép nhầm Read API Key thay vì Write API Key.
  • Gửi được vài lần rồi dừngGửi dày hơn 15 giây một lần nên bị máy chủ từ chối. Tăng thời gian delay.
  • Biểu đồ trống dù báo thành côngSai số kênh, hoặc đang mở nhầm kênh khác trong tài khoản.