ESP8266 và Thingspeak là vấn đề không mới, mình đã có trình bày qua các bài viết trước. Tuy nhiên mình quên mất là chưa có bài hướng dẫn chỉ dùng 1 modul ESP8266 gửi dữ liệu lên thẳng thingspeak luôn nên nay tranh thủ làm luôn cho đủ bộ
Trước khi bắt đầu bạn có thể xem qua bài viết:
- Thingspeak với TIVA : bài này thì dùng TIVA hoặc Arduino Uno giao tiếp với ESP8266 qua tập lệnh AT để gửi dữ liệu lên Thingspeak.
Vậy thì ở bài này sẽ khác gì ?
Đầu tiên là mình sẽ tạm bỏ TIVA/Uno, tiếp đó là mình sẽ lập trình trực tiếp trên ESP8266 thông qua Arduino IDE luôn. Mình sẽ đi nhanh vào bước làm cụ thể
Chuẩn bị
Phần cứng
- NodeMCU hoặc ESP8266 v12 + modul USB2UART
- Cảm biến DHT11 hoặc DHT22
- Dây nối và nguồn (nếu dùng modul v12 câu dây)
Phần mềm
- Arduino IDE
- Thư viện DHT22 đi kèm với Adafruit_Sensor
- Thư viện Thingspeak
Kết nối
Ta sẽ có kết nối như hình
Thingspeak
Mình sẽ tạo một tài khoản thingspeak, thêm 2 field và lưu lại key của thingspeak để sử dụng trong chương trình. Nếu các bạn có rắc rối ở chỗ này thì tham khảo phần Thingspeak trong bài TIVA và thingspeak hoặc bài Hệ thống nông nghiệp thông minh phần 1 nhé. Mình copy lại hình luôn cho các bạn dễ hình dung
Chương trình
Mình sẽ có chương trình và giải thích luôn trong code, các bạn xem luôn cho dễ hiểu.
Update 16/11/19: Với cách làm ngày xưa chưa có thư viện thì hiện nay chỉ cập nhật được 1 value là tạch, nên mình khuyến nghị các bạn chuyển sang xài thư viện của thingspeak, cách xài như thế nào thì các bạn có thể tham khảo các ví dụ dưới đây
Ở đây có 2 chỗ cần quan tâm là ten_wifi, mật khẩu và key thingspeak
//---------------- Fill in your credentails ---------------------
char ssid[] = "xxxx"; // your network SSID (name)
char pass[] = "xxxxxxxx"; // your network password
unsigned long myChannelNumber = 1; // Thay 1 bằng channel number mà bạn muốn lưu dữ liệu
const char * myWriteAPIKey = "xxxxxx"; // Copy mã WriteAPI ThingSpeak của bạn vào giữa dấu ""
//------------------------------------------------------------------
Ví dụ 1: Chương trình gửi 2 dữ liệu random lên 2 field của thingspeak
#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
//---------------- Fill in your credentails ---------------------
char ssid[] = "xxx"; // your network SSID (name), tên wifi
char pass[] = "xxxxx"; // your network password, password
unsigned long myChannelNumber = 1; // Replace the 0 with your channel number, channel của bạn
const char * myWriteAPIKey = "xxxxx"; // Paste your ThingSpeak Write API Key between the quotes, write API key
//------------------------------------------------------------------
WiFiClient client;
int number = 0;
void setup() {
//Mở port với baudrate 9600
Serial.begin(9600);
while (!Serial) {
; // Chờ kết nối USB, phục vụ công tác debug
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}
void loop() {
float h = random(100);
float t = random(70);
// Connect or reconnect to WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
// Serial.println(SECRET_SSID);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass);
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected.");
}
// Ghi dữ liệu lên 1 field
// int x = ThingSpeak.writeField(myChannelNumber, 1, t, myWriteAPIKey);
// int y = ThingSpeak.writeField(myChannelNumber, 2, t, myWriteAPIKey);
// Ghi dữ liệu lên nhiều field
int x = ThingSpeak.setField(1, h); //setField(field, value)
int y = ThingSpeak.setField(2, t); //setField(field, value)
int z = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
// Kiểm tra return code
if (z == 200) {
Serial.println("Channel update successful.");
}
else {
Serial.println("Problem updating channel. HTTP error code " + String(z));
}
delay(20000); // Chờ 20s trước khi gửi dữ liệu mới
}
Ví dụ 2: Chương trình gửi dữ liệu DHT22 lên thingspeak thay cho 2 dữ liệu random
#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
#include <DHT.h>
//---------------- Fill in your credentails ---------------------
char ssid[] = "xxx"; // your network SSID (name), tên wifi
char pass[] = "xxxxx"; // your network password, password
unsigned long myChannelNumber = 1; // Replace the 0 with your channel number, channel của bạn
const char * myWriteAPIKey = "xxxxx"; // Paste your ThingSpeak Write API Key between the quotes, write API key
//------------------------------------------------------------------
#define DHTPIN D4 // Chân kết nối với DHT22
#define DHTTYPE DHT22 // Loại cảm biến là DHT22
DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;
int number = 0;
void setup() {
//Mở port với baudrate 9600
Serial.begin(9600);
while (!Serial) {
; // Chờ kết nối USB, phục vụ công tác debug
}
Serial.println(F("DHTxx test!"));
dht.begin();
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}
void loop() {
// float h = random(100);
// float t = random(70);
float h = dht.readHumidity(); // Đọc độ ẩm
float t = dht.readTemperature(); //Đọc nhiệt độ
// Kiểm tra ko đọc được thì báo lỗi
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Connect or reconnect to WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
// Serial.println(SECRET_SSID);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass);
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected.");
}
// Ghi dữ liệu lên 1 field
// int x = ThingSpeak.writeField(myChannelNumber, 1, t, myWriteAPIKey);
// int y = ThingSpeak.writeField(myChannelNumber, 2, t, myWriteAPIKey);
// In dữ liệu debug
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" oC Humidity: ");
Serial.print(h);
// Ghi dữ liệu lên nhiều field
int x = ThingSpeak.setField(1, h); //setField(field, value)
int y = ThingSpeak.setField(2, t); //setField(field, value)
int z = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
// Kiểm tra return code
if (z == 200) {
Serial.println("Channel update successful.");
}
else {
Serial.println("Problem updating channel. HTTP error code " + String(z));
}
delay(20000); // Chờ 20s trước khi gửi dữ liệu mới
}
Anh em thích tìm hiểu thêm có thể xem thêm các ví dụ của thingspeak, mình cũng modify lại từ đây theo hướng tối giản cho anh em dễ hiểu thôi
https://github.com/mathworks/thingspeak-arduino/blob/master/examples
Kết quả
Sau khi nạp chương trình thì mình sẽ có dữ liệu được cập nhật lên thingspeak như sau
Tạm kết
Vậy là mình đã trình bày nhanh qua cách gửi dữ liệu nhận được từ cảm biến, ở đây là DHT22 với thông tin nhiệt độ độ ẩm thông qua ESP8266, tất nhiên chỉ ở mức độ cơ bản, các bạn có thể nghiên cứu thêm về các bài hướng dẫn khác với ESP8266 để có thể nắm bắt nhanh hơn.