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

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.