Thứ Hai, Tháng Mười Một 30, 2020
Trang chủ DIY Lưu trữ nhật ký dữ liệu Online với ESP32 và Google Spreadsheets

Lưu trữ nhật ký dữ liệu Online với ESP32 và Google Spreadsheets

Giới Thiệu

Chào các bạn, trong các dự án IoT nhỏ gọn thì việc lưu trữ  và kiểm soát dữ liệu trên đám mây cũng khá là nhiều, vì vậy hôm nay mình sẽ hướng dẫn cách gửi và ghi lại nhật ký của dữ liệu với Google Spreadsheets. Mình sẽ sử dụng ESP32 để gửi dữ liệu nhiệt độ, độ ẩm từ cảm biến lên Google Spreadsheets thông qua Internet!

Chuẩn Bị

1. Phần cứng

2. Phần mềm

  • Arduino IDE đã cài đặt tương thích với ESP32.
  • Library DHT_nonblocking hỗ trợ cho DHT11/DHT21/DHT22

Hướng dẫn

Các bạn kết nối chân cảm biến với chân đọc của VĐK

Kit RF Thu Phát Wifi BLE ESP32 NodeMCU LuaNode32 Cảm Biến Độ Ẩm, Nhiệt Độ DHT11 
VCC +
GND
D2 OUT

 

Mình sẽ bỏ qua phần hướng dẫn đọc cảm biến DHT11 với thư viện DHT_nonblocking nên các bạn sẽ cần đọc qua bài: Đọc Cảm Biến DHT11/DHT21/DHT22 không bị DELAY chương trình

Đầu tiên các bạn truy cập vào Google Spreadsheets nhớ đăng nhập tài khoản vào nhé, các bạn chọn vào Blank

Thay đổi tên của Sheets

Gửi Data lên Google Sheets với ESP32

Toosl -> Script editor sau đó các bạn copy mã scrip sau vào

Scrip Editor

var timeZone = "ICT";  //Set time zone, ở VN mình là UTC+7
var dateTimeFormat = "dd/MM/yyyy HH:mm";

// Dùng cái này nếu muốn gửi mail cảnh cáo, cài này bạn nào thích có thể tự nghiên cứu :D
var enableSendingEmails = true;
var emailAddress = ""; // comma separate for several emails

function doGet(e) {
      var result = 'Ok'; // default result
    if (e.parameter == 'undefined') {
        result = 'No Parameters';
    } else {
      
        var alarm= e.parameter.alarm;
        if (typeof alarm != 'undefined') {

            sendEmail("alarm text:" + stripQuotes(alarm));
            return ContentService.createTextOutput(result);
        }

        var sheet = getSpreadSheet();
        var lastRow = sheet.getLastRow();
        var newRow = 1;
        if (lastRow > 0) {
            var lastVal = sheet.getRange(lastRow, 1).getValue();
            if (lastVal == 'dead')
                newRow = lastRow; //to overwrite "dead" value
            else
                newRow = lastRow + 1;

        }

        var rowData = [];
        var namesOfParams=[];
        for (var param in parseQuery(e.queryString))
          namesOfParams.push(param);
      
        if (newRow == 1) {
            rowData[0] = "Date";
            var i = 1;
            for (var i=0; i<namesOfParams.length;i++  ) {
                rowData[i+1] = namesOfParams[i];

            }
            var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
            newRange.setValues([rowData]);
            rowData = [];
            newRow++;
        }

        rowData[0] = Utilities.formatDate(new Date(), timeZone, dateTimeFormat);
    
        for (var i=0; i<namesOfParams.length;i++  ) {

            var value = stripQuotes(e.parameter[namesOfParams[i]]);

            rowData[i+1] = value;

        }
        var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
        newRange.setValues([rowData]);
    }
    // Return result of operation
    return ContentService.createTextOutput(result);
}

function stripQuotes(value) {
    return value.replace(/^["']|['"]$/g, "");
}

function parseQuery(queryString) {
    var query = {};
    var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split('=');
        query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
    }
    return query;
}

function sendEmail(message) {
   if (!enableSendingEmails)
        return;
    var subject = 'Something wrong with your esp';
   MailApp.sendEmail(emailAddress, subject, message);
}

function getSpreadSheet() {
    return SpreadsheetApp.getActiveSheet();
}

Sau đó các bạn chọn vào nút Save

Nhập tên cho Project

Chọn Publish -> Deploy as web app

+ “Who has access to the app” các bạn chọn “Anyone,even anonymous”

+ Các bạn đồng ý cấp quyền tài khoản google

+ Sau đó chúng ta copy mã Current web app URL:

Ví dụ của mình là: https://script.google.com/macros/s/AKfycbybjnZV8xPGAbGvqCZ2XaW9X8_tsxKsw1ihaWqHk4jDchQE_oU/exec

Vậy là bên phần Google Spreadsheets chúng ta đã setup xong. Chuyển qua phần Arduino thôi nào !

Để làm được bài này chắc chắn bạn phải chạy được example của thư viện DHT_NonBlocking.. nếu chưa được các bạn coi lại bài viết này: Đọc Cảm Biến DHT11/DHT21/DHT22 không bị DELAY chương trình

Vì mình sử dụng là Kit RF Thu Phát Wifi BLE ESP32 NodeMCU LuaNode32 nên chọn board “ESP32 Dev Module” – Các bạn nhớ kiểm tra xem đã nhận COM chưa nha 😀

Gửi Data lên Google Sheets với ESP328

 

Full Source Code

#include <WiFi.h>
#include <HTTPClient.h>
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
static const int DHT_SENSOR_PIN = 4;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );

float temperature;
float humidity;
const char * ssid     = "";
const char * password = "";
String GOOGLE_SCRIPT_ID = "SCRIP_ID";

WiFiClientSecure client;

void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("Started");
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("Ready to go");
}

String Tempeature() {return String(temperature);}
String Funtion(){return "Data";}
String Humidity(){return String(humidity);}

static bool measure_environment( float *temperature, float *humidity )
{
  static unsigned long measurement_timestamp = millis( );
  if( millis( ) - measurement_timestamp > 5000ul )
  {
    if( dht_sensor.measure( temperature, humidity ) == true )
    {
      measurement_timestamp = millis( );
      return( true );
    }
  }
  return( false );
}


void sendData(String params) {
  HTTPClient http;
  String url = "https://script.google.com/macros/s/" + GOOGLE_SCRIPT_ID + "/exec?" + params;
  Serial.println(url);
  http.begin(url); 
  int httpCode = http.GET();
  http.end();
}

void loop() {
  if( measure_environment( &temperature, &humidity ) == true )
  {
    Serial.print( "T = " );
    Serial.print( temperature, 1 );
    Serial.print( " deg. C, H = " );
    Serial.print( humidity, 1 );
    Serial.println( "%" );
    sendData("Makerlab_Data=" + Funtion() + "&Humi=" + Humidity() + "&Temp=" + Tempeature());
  }
}

Các bạn lưu ý các phần sau :

+ Khai báo ssid và password WiFI

const char * ssid = “”;
const char * password = “”;

+ Add google Scrip ID. Ở phần trên mình đã lấy được Current web app URL các bạn chỉ cần copy phần màu đỏ và paste vào “SCRIP_ID”

String GOOGLE_SCRIPT_ID = “SCRIP_ID”; 

Ví dụ của mình :

String GOOGLE_SCRIPT_ID = “AKfycbybjnZV8xPGAbGvqCZ2XaW9X8_tsxKsw1ihaWqHk4jDchQE_oU“;

+ Mình tạo ra 3 hàm chuyển đổi từ float sang String để gửi dữ liệu đi

String Tempeature() {return String(temperature);}
String Funtion(){return “Data”;}
String Humidity(){return String(humidity);}

+ Hàm để gửi dữ liệu đi

void sendData(String params) { HTTPClient http; String url = “https://script.google.com/macros/s/” + GOOGLE_SCRIPT_ID + “/exec?” + params;
Serial.println(url);
http.begin(url);
int httpCode = http.GET();
http.end(); }

Mình bỏ qua phần đọc cảm biến vì đã nêu ở bài trước, Mình sẽ giới thiệu sơ qua về cơ chế gửi dữ liệu lên Google Spreadsheets. Các bạn mở Monitor trên Arduino IDE ra sẽ thấy http này : https://script.google.com/macros/s/AKfycbybjnZV8xPGAbGvqCZ2XaW9X8_tsxKsw1ihaWqHk4jDchQE_oU/exec?Makerlab_Data=Data&Humi=36.00&Temp=25.00

Gửi Data lên Google Sheets với ESP329

Về cơ cấu gừi đi sẽ bao gồm:  “https://script.google.com/macros/s/” + GOOGLE_SCRIPT_ID + “/exec?” + “Makerlab_Data=”Data&Humi=36.00&Temp=25.00

+ GOOGLE_SCRIPT_ID  là Current web app URL ID mà mình đã hướng dẫn lấy ở trên

+ Các chữ màu xanh sẽ tương ứng với tiêu đề của từng cột ví dụ Makerlab_Data 

+ Các chữ màu cam sẽ tương ứng với giá trị dữ liệu được gửi lên tương ứng với từng tiêu đề ví dụ : Humi=36.00 có nghĩa là gửi giá trị cho cột độ ẩm là 36.0.

Sau khi nạp chương trình thành công bạn có thể check và kiểm tra thử dữ liệu đã gửi lên trên Google Spreadsheets chưa !

Tổng Kết

Vậy là chúng ta đã hoàn thành xong việc xử lí dữ liệu kiểm tra và lưu trữ dữ liệu Online với Google Spreadsheets, Ngoài ra Google Spreadsheets còn có thể gửi mail thông báo cho bạn khi có vấn đề với phần hỗ trợ sendEmail. Đó cũng là một việc khá hay để cảnh báo nhiệt độ độ ẩm khi quá cao hay quá thấp!

Gợi ý các bạn nên sử dụng chế độ DeepSleep để tiết kiệm điện năng hơn, ví dụ tầm 5′ thì gửi giá trị đi một lần, các bạn có thể tham khảo bài sau: Vấn đề về quản lí năng lượng trên thiết bị IoT

Chúc các bạn thành công với dự án của mình. Hẹn gặp lại các bạn ở những bài viết sau !

liệu

1 BÌNH LUẬN

Subscribe
Notify of
guest
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Võ Thành Đạt
Võ Thành Đạt
14/11/2020 4:30 chiều

Cho mình hỏi làm nếu sử dụng ESP8266 NodeMCU thì code sửa như thế nào vậy ạ. Mình cảm ơn

Most Popular

Hướng dẫn lắp ráp Khung Xe Robot Chasiss Black Cat Mecanum (P2)

Giới thiệu Chào các bạn, trong bài này mình sẽ hướng dẫn cách hàn dây motor, và cách đấu dây motor với driver cho đúng. Sỡ...

Hướng dẫn lắp ráp Khung Xe Robot Chasiss Black Cat Mecanum (P1)

Giới thiệu Chào các bạn, trong bài viết này mình sẽ giải thích sơ qua về bánh xe Mecanum, cũng như nguyên lý hoạt động...

Hướng dẫn sử dụng Mạch đóng ngắt tải không tiếp xúc chế tạo Thiết bị vệ sinh tự động

Từ ngày 03/08/2020 mạch chuyển sang phiên bản mới tuy nhiên kích thước, vị trí linh kiện và chức năng của mạch giống và...

Lưu trữ nhật ký dữ liệu Online với ESP32 và Google Spreadsheets

Giới Thiệu Chào các bạn, trong các dự án IoT nhỏ gọn thì việc lưu trữ  và kiểm soát dữ liệu trên đám mây cũng...

Recent Comments

1
0
Would love your thoughts, please comment.x
()
x