ผู้เขียน หัวข้อ: งานครั้งที่ 44 [iot#19 GoogleSheetAPI] บันทึกค่าลงบน Google Sheet  (อ่าน 468 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 516
    • ดูรายละเอียด
    • อีเมล์
งานครั้งที่ 44 [iot#19 GoogleSheetAPI] บันทึกค่าลงบน Google Sheet
Google Sheet เป็นโปรแกรมที่มีการทำงานคล้ายกับ Excell เพียงแต่ทำงานจะต้องมีการเชื่อมต่ออินเตอร์เน็ต หากงาน iot สามารถบันทึกข้อมูลต่าง ๆ ของบอร์ดลงใน Google Sheet ได้ผู้ใช้งานสามารถนำข้อมูลไปใช้งานได้อีกมากมายเนื่องจาก Google Sheet สามารถเขียนสูตรคำนวณค่าได้หรือผู้ใช้งานต้องการที่จะนำข้อมูลมาประมวลผลใน Excell ก็สามารถทำได้โดยง่ายการทดลองนี้จะทำการบันทึกค่าจำนวน 4 ค่าด้วยกันได้แก่
- ค่าที่อ่านได้จากพอร์ตแอนะล็อก
- ค่าอุณหภูมิ
- ค่าความชื้น
- ค่าเวลาที่ทำการวัด ซึ่งเป็นเวลาที่อ่านจากเซิร์ฟเวอร์นาฬิกาสากล
ซึ่งการเขียนโค้ดที่บอร์ดควบคุมจำเป็นต้องมีไลบรารี่สำหรับอ่านค่าจากโมดูลอ่านค่าอุณหภูมิและความชื้น ท่านใดยังไม่ได้ดำเนินการให้ศึกษาขั้นตอนได้ในงานครั้งที่ 8 การเขียนโปรแกรมอ่านค่าอุณหภูมิและความชื้นด้วย DHT11 เบื้องต้น

คอนเซ็ปต์หลักของงาน
บอร์ดส่งค่าข้อมูลทั้ง 4 อย่างขึ้นบันทึกบน Google Sheet

[ขั้นตอนการดำเนินการ]
-สร้างโปรเจคงานใน Google API
-นรหัสไคลเอ็นต์ของโปรเจคงานมาใส่ในโค้ดโปรแกรม
-สร้างไฟล์ชีต Google Sheet เพื่อรับค่า
-เขียนโค้ดเพื่อใช้งาน
ซึ่งรายละเอียดเป็นดังนี้
1. วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini

2. ผลที่ต้องการในงานครั้งนี้เป็นการนำค่าที่ได้บันทึกลง Google sheet


ส่วนจัดการ Google API
1. เริ่มขั้นตอนสร้างโปรเจค โดยเข้าไปที่ https://console.developers.google.com
   (1) ล็อกอินด้วยอีเมล์ gmail (หากไม่มีให้สมัครใช้งาน gmail ก่อน)
   (2) ในกรณีที่เคยสร้างโปรเจคไว้แล้ว (เป็นโปรเจคของงาน Firebase ก็สามารถใช้ได้)


2. ในกรณีที่ยังไม่มีโปรเจคงาน สามารถสร้างโปรเจคได้ 2 จุด (1) หรือ (2)


3. กรณีที่คลิก "เลือกโครงการ" ให้คลิกเพิ่มโปรเจคที่ปุ่ม (+)


4. กรณีที่คลิก "สร้างโครงการ" จะปรากฏหน้าต่างให้คลิก "สร้าง"


5. ทำการตั้งชื่อโครงการ (1) แล้วคลิกสร้าง (2)


6. ชื่อโครงการจะปรากฏขึ้น (1) แล้วคลิกดูรายการ API ที่ "ดูทั้งหมด..." (2)


7. เลื่อนหา API ที่ชื่อว่า "Google Sheet API" แล้วคลิก


8. คลิกเปิดใช้


9. เมื่อสร้างเสร็จจะได้ คลิก "สร้างข้อมูลรองรับ"


10. คลิก "สร้างข้อมูลรองรับ"


11. คลิก "รหัสไคลเอ็นต์ OAuth"


12. คลิกตามรูป


13. ตั้งชื่อตามต้องการ (ควรเป็นภาษาอังกฤษ)


14. คลิกตามรูป


15. ผลจะได้ รหัสที่จะนำไปใช้งาน


16. ผู้ใช้งานสามารถคัดลอกรหัสดังกล่าวได้ในโปรแกรมอื่นก่อนก็ได้ เช่นไปวางไว้ในโปรแกรม Notepad


17. หรือผู้ใช้สามารถดูรหัสภายหลังได้ โดยคลิกชื่อรหัสไคลเอ็นต์(ที่ได้สร้างไว้)ดังรูป


18. รหัสจะได้


19. ทำการสร้างเอกสาร Google Sheet ในกูเกิลไดร์ฟ คลิกที่่ (1)->(2)
https://drive.google.com/drive/my-drive


20. รหัสของไฟล์ Google Sheet จะอยู่ระหว่างเครื่องหมาย / ดังรูปทำการคัดลอกเพื่อนำไปใช้งาน (ชื่อชีตสามารถแก้ไขได้โดยการคลิกที่ชื่อแล้วพิมพ์ชื่อใหม่ตามต้องการ)


ส่วนจัดการโค้ด
การใช้งาน Google Sheet API จำเป็นต้องใช้ไลบรารี่ช่วยงานโดยดำเนินการดังนี้

21. ดาวน์โหลดไลบรารี่โดยเข้าไปที่เวปไซต์ แล้วคลิกดาวน์โหลดตามลำดับ


22. ทำการติดตั้งไลบรารี่ที่ดาวน์โหลดมา ดำเนินการดังรูป
https://github.com/KhonKaenMakerClub/EspGoogleApi


23. เปิดไฟล์ตัวอย่าง "InsertGoogleSheets" ดังรูป


24. ใส่รหัสทั้ง 3 อย่างลงโค้ด


25. ป้อนชื่อไวไฟและพาสเวิร์ดที่จะให้บอร์ดจับสัญญาณ


26. ทำการอัพโหลด..แล้วเปิด Serial monitor เพื่อดูผล
   (1) เข้าเวปไซต์ที่ปรากฏในหน้าจอ
   (2) ใช้รหัสที่ปรากฏป้อนลงในเวปไซต์


27. ป้อนรหัสที่ได้จากหน้าจอ Serial monitor


28. เลือกบัญชี Gmail


29. คลิกอนุญาต


30. การดำเนินการเสร็จสิ้น


31. เปิดกลับไปดูเอกสาร Google Sheet ที่สร้างไว้จะปรากฏข้อมูล


32. หน้าต่าง Serial monitor จะปรากฏข้อความดังรูป


ข้อผิดพลาดที่อาจเกิดขึ้น
33. หากเกิดข้อผิดพลาดหน้าต่าง Serial monitor จะปรากฏข้อความดังรูป


34. ให้ทำการเพิ่มคำสั่ง true ท้ายฟังก์ชั่น gSheets.begin


ตัวอย่างโปรแกรม
บันทึกค่าแอนะล็อก, อุณหภูมิ, ความชื้น, เวลา, วันเดือนปี ที่บันทึก
โค้ดโปรแกรม
โค๊ด: [Select]
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <GSheets.h>
#include <DHT.h>
#include <time.h>
#include <SimpleTimer.h>
#define DHTPIN D1         //pin connect DHT
#define DHTTYPE DHT11     //DHT11, DHT22 type of Sensor

//------ Config -------//
const String client_id = "------- client id -------";
const String client_secret = "------- secret ------";
const String sheet_id = "----- sheet id -----";
GSheets gSheets;
ESP8266WiFiMulti WiFiMulti;

char ntp_server1[20] = "pool.ntp.org";
char ntp_server2[20] = "time.nist.gov";
char ntp_server3[20] = "time.uni.net.th";

int timezone = 7*3600;
int dst = 0;
float h;
float t;
int adc;

DHT dht(DHTPIN, DHTTYPE); 
SimpleTimer timer;

void setup(){
  Serial.begin(115200);
  Serial.println();
  for(uint8_t t = 5; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...\n", t);
    delay(1000);
  }
  WiFiMulti.addAP("---ssid---", "--- password  ---");
 
  configTime(timezone, dst, ntp_server1, ntp_server2, ntp_server3);
  Serial.println("\nWaiting for time");
  while (!time(nullptr)) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
  dht.begin();
  gSheets.begin(client_id,client_secret,sheet_id);       
//  gSheets.begin(client_id,client_secret,sheet_id,true);
  timer.setInterval(10000, sendState);   
}

void loop() {
  Serial.println(NowTime());
  Serial.println(NowDate()); 
  delay(2500);

  h = dht.readHumidity();
  t = dht.readTemperature();
  adc=analogRead(A0);
  if (isnan(t) || isnan(h))
  {
    Serial.println("Error reading DHT!");
    delay(500);
    return;
  }
  digitalWrite(D0,LOW);   
  Serial.print("Analog value: ");
  Serial.print(adc);
  Serial.print("\t");
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("\t");
  Serial.print("Temp: ");
  Serial.println(t);
  Serial.println("...............................");
  timer.run();
}
void sendState(){
  if((WiFiMulti.run() == WL_CONNECTED)) {
    gSheets.addColumn("Analog",String(adc));
    gSheets.addColumn("Temperature",String(t));
    gSheets.addColumn("Humidity",String(h));
    gSheets.addColumn("Time",NowTime());
    gSheets.addColumn("Date",NowDate());         
    if(gSheets.insertRow()){
      Serial.println("---- inserted row ----");
    }
  }
}
String NowTime() {
  time_t now = time(nullptr);
  struct tm* p_tm=localtime(&now);
  String timeNow = "";
  timeNow += String(p_tm->tm_hour);
  timeNow += ":";
  timeNow += String(p_tm->tm_min);
  timeNow += ":";
  timeNow += String(p_tm->tm_sec);
  return timeNow;
}
String NowDate() {
  time_t now = time(nullptr);
  struct tm* p_tm=localtime(&now);
  String dateNow = "";
  dateNow += String(p_tm->tm_mday);
  dateNow += "/";
  dateNow += String(p_tm->tm_mon + 1);
  dateNow += "/"; 
  dateNow += String(p_tm->tm_year + 1900);
  return dateNow;
}


ทดสอบการทำงาน
35. ผลการบันทึกค่าลง Google Sheet

« แก้ไขครั้งสุดท้าย: เมษายน 29, 2018, 10:17:04 AM โดย admin »