M5STACK(14) 計測した温度をGoogleスプレッドシートへ送信
温度センサーADT7410で測定した温度のデータを、Googleスプレッドシートへ送信し、グラフ化してみました。
配線
温度を表示したときの配線と同じです。
GAS(Google Apps Script)
function setCount(sheet,val){ sheet.insertRows(2,1); sheet.getRange(2,1).setValue(val); sheet.getRange(2,2).setValue(new Date()); } function doPost(e){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); var params = JSON.parse(e.postData.getDataAsString()); var val = params.count; setCount(sheet,val); var output = ContentService.createTextOutput(); output.setMimeType(ContentService.MimeType.JSON); output.setContent(JSON.stringify({ message: "success!" })); return output; }
スケッチ
#include <M5Stack.h> #include <HTTPClient.h> #include <WiFi.h> #include <ArduinoJson.h> #define WIFI_SSID "elecom2g-b7052c" #define WIFI_PASSWORD "3214988521041" int ADT7410_ADDR = 0x48; // ADT7410温度センサのアドレス uint16_t uiVal; float fVal; int iVal; int count = 0; float Temp; // スプレッドシートURL const char *host = "https://script.google.com/macros/s/AKfycbyL0oLAOkz3tnDPemmdmvUZgzPkkWKaoksoz9CC5KCcLzj0M50/exec"; // Json設定 StaticJsonDocument<255> json_request; char buffer[255]; void setup() { M5.begin(); // Wi-Fi接続 WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("connecting"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(); // WiFi Connected Serial.println("\nWiFi Connected."); Serial.println(WiFi.localIP()); M5.Lcd.setTextSize(3); M5.Lcd.setCursor(10, 100); //M5.Lcd.println("Button Click!"); //M5.Lcd.setTextSize(3); //M5.Lcd.setCursor(20, 50); //M5.Lcd.print("Temperature "); //M5.Lcd.setCursor(20, 130); //M5.Lcd.print("degree Celsius"); // 内部プルアップ抵抗有効化 pinMode(21, INPUT_PULLUP); pinMode(22, INPUT_PULLUP); //Serial.begin(9600); // 通信速度を9600bpsに設定 Wire.begin(); // I2Cバスにマスタとして接続 } float ReadTemp(){ Wire.requestFrom(ADT7410_ADDR, 2); // ADT7410に2byteのデータを要求 uiVal = (uint16_t)Wire.read() << 8; // 1byte受信し、1byte左シフト uiVal |= Wire.read(); // 1byte受信し、前回値に加算 uiVal >>= 3; // 3bit右シフト if(uiVal & 0x1000){ // bit 12が1のとき iVal = uiVal-0x2000; // 負の温度換算 } else{ iVal = uiVal; // 正の温度換算 } fVal = (float)iVal / 16.0; return fVal; } // 温度送信 void sendTemp(float Temp) { json_request["count"] = Temp; serializeJson(json_request, buffer, sizeof(buffer)); HTTPClient http; http.begin(host); http.addHeader("Content-Type", "application/json"); int status_code = http.POST((uint8_t*)buffer, strlen(buffer)); //Serial.println(status_code); if (status_code > 0) { if (status_code == HTTP_CODE_FOUND) { String payload = http.getString(); //Serial.println(payload); M5.Lcd.clear(BLACK); M5.Lcd.setCursor(10, 100); M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextColor(WHITE); M5.Lcd.setTextSize(3); M5.Lcd.println("Send Done!"); delay(2000); M5.Lcd.clear(BLACK); } } else { Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(status_code).c_str()); } http.end(); } void loop() { M5.update(); M5.Lcd.clear(BLACK); Temp=ReadTemp(); M5.Lcd.setTextSize(3); M5.Lcd.setCursor(20, 50); M5.Lcd.print("Temperature "); M5.Lcd.setCursor(20, 90); M5.Lcd.print(Temp); M5.Lcd.setCursor(20, 130); M5.Lcd.print("degree Celsius"); if(M5.BtnB.wasReleased()) { // ディスプレイ表示 M5.Lcd.clear(BLACK); M5.Lcd.setCursor(10, 100); //M5.Lcd.fillScreen(BLACK); //M5.Lcd.setTextColor(WHITE); //M5.Lcd.setTextSize(3); M5.Lcd.print("Temp Send:\n"); M5.Lcd.print(Temp); // 温度送信 sendTemp(Temp); delay(2000); } delay(1000); }