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);
}
実行結果
















