Trong bài này chúng ta sẽ học cách sử dụng esp32 http post gửi nhiệt độ, độ ẩm lên Thingspeak để có thể quan sát theo dạng đồ thị sự biến thiên của chúng.
Bài 6 WIFI Trong serie Học ESP32 từ A tới Z
Cách sử dụng Thingspeak
Thingspeak là gì?
Thingspeak là một nền tảng mà bạn có thể hiển thi dữ liệu trên Cloud. Bạn có thể truy cập để hiển thị hoặc lấy dữ liệu từ Cloud về thiết bị IOT thông qua giao thức HTTP. Thingspeak hoàn toàn miễn phí và giao diện cũng khá đẹp nên có rất nhiều người trên thế giới sử dụng.
Cách lấy API Thingspeak
Tương tự như cách giao tiếp với các server khác, Thingspeak sử dụng API và có 1 key để định danh người sử dụng.
Đầu tiên đăng kí và đăng nhập vào https://thingspeak.com/
Vào Channels – My channels- New channels
Trong new channel Tạo tên bảng của bạn. Các trường cần hiển thị. Ở đây mình sử dụng 2 trường là Temparature và Humidity. Nhấn Save channel để hoàn thành.
Chuyển qua tap API Keys để lấy key và example. Các bạn có thể copy Example và dùng postman để kiểm thử
Sử dụng Postman thử gửi 3 nhiệt độ là 32,36 và 33. Phần response trả về sẽ là số lần ghi lên Thingspeak
Kết quả
Đo nhiệt độ, độ ẩm với DHT11
Cài thư viện DHT
Để đo được nhiệt độ với cảm biến DHT11 đầu tiên chúng ta cài thư viện DHT sensor
pio lib install “adafruit/DHT sensor library”
Kèm theo thư viện sensor để không sảy ra lỗi nhé!
pio lib install “adafruit/Adafruit Unified Sensor”
Chuẩn bị phần cứng
Phần cứng bao gồm:
- Kit ESP32
- Trở 10k
- DHT11
Chúng ta sẽ mắc chân data/signal của DHT11 với chân GPIO 12. Với cảm biến DHT11 4 chân chúng ta cần mắc trở treo chân Data lên 3.3V với trở 4.7k – 10k. Còn module thì không cần.
Lập trình đọc nhiệt độ, độ ẩm với DHT11
Để lập trình, chúng ta làm theo các bước:
- Include thư viện với:
#include "DHT.h"
- Khởi tạo kiểu cảm biến, chân data và biến DHT:
#define DHTPIN 12
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
- Trong setup khởi chạy biến DHT bằng lệnh:
dht.begin();
- Đọc nhiệt độ, độ ẩm rồi in ra màn hình.
float h = dht.readHumidity();
float t = dht.readTemperature();
Gửi nhiệt độ, độ ẩm lên Thingspeak với ESP32 HTTP
Tương tự như bài Dự báo thời tiết với ESP32, chúng ta sử dụng giao thức HTTP để gửi kết quả lên server. Để hiểu rõ về HTTP là gì các bạn đón đọc:
Tất tần tật về giao thức HTTP và HTTPS
Các bước như sau:
- Đầu tiên khởi tạo 1 Url chứa đường dẫn và api key:
String UrlThingspeak = "https://api.thingspeak.com/update?api_key=J69MXGIE0KLMA27C";
- Tiếp đó, sau khi đọc nhiệt độ, độ ẩm, cần conver chúng từ float sang string bằng sprintf
sprintf(para,"&field1=%6.2f&field2=%6.2f",t,h);
- Tiếp tới cộng 2 String lại để đc Url hoàn chỉnh
String Url = UrlThingspeak + String(para);
- Cuối cùng sử dụng hàm http request để truyền kết quả lên.
httpGETRequest(Url.c_str());
Full code
#include <Arduino.h> #include "DHT.h" #include <HTTPClient.h> #include <WiFi.h> #include <string.h> const char* ssid = "Nha Tao"; const char* password = "25251325" ; #define DHTPIN 12 // Digital pin connected to the DHT sensor #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); String UrlThingspeak = "https://api.thingspeak.com/update?api_key=J69MXGIE0KLMA27C"; String httpGETRequest(const char* Url); void setup() { Serial.begin(9600); Serial.println(F("DHTxx to Thingspeak!")); dht.begin(); //setup wifi WiFi.begin(ssid,password); Serial.println("conecting"); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); } void loop() { // Wait a few seconds between measurements. delay(10000); float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t)) { Serial.println(F("Failed to read from DHT sensor!")); return; } Serial.print(F("Humidity: ")); Serial.print(h); Serial.println(" %"); Serial.print(F("Temperature: ")); Serial.print(t); Serial.println(" oC"); char para[50]; sprintf(para,"&field1=%6.2f&field2=%6.2f",t,h); String Url = UrlThingspeak + String(para); httpGETRequest(Url.c_str()); } String httpGETRequest(const char* Url) { HTTPClient http; http.begin(Url); int responseCode = http.GET(); String responseBody = "{}"; if(responseCode > 0) { Serial.print("responseCode:"); Serial.println(responseCode); responseBody = http.getString(); } else { Serial.print("Error Code: "); Serial.println(responseCode); } http.end(); return responseBody; }
Kết quả
Kết
Thingspeak là một dashboard view rất được ưa chuộng khi mới bắt đầu đặt chân vào lập trình IOT. Ngoài việc gửi dữ liệu lên, nó cũng có thể được dùng để lấy dữ liệu về.
Tuy vậy các dự án thực tế lại ít dùng bởi chúng khá đơn giản không đáp ứng đủ nhu cầu.
Nếu thấy có ích hãy chia sẻ bài viết và tham gia nhóm Nghiện Lập Trình để giao lưu và học hỏi nhé