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.
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ện | Số lượng | Giá tham khảo |
|---|---|---|
| Bo NodeMCU ESP8266 | 1 | ~75.000đ |
| Cảm biến DHT22 | 1 | ~55.000đ |
| Điện trở 10kΩ | 1 | ~500đ |
| Cáp micro USB | 1 | ~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ện | Nối vào |
|---|---|
| DHT22 VCC | 3V3 |
| DHT22 DATA | D4 (GPIO 2), kèm điện trở 10kΩ kéo lên |
| DHT22 GND | GND |
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
#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.