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);
}

実行結果













ブログランキング・にほんブログ村へ

コメントを残す

メールアドレスが公開されることはありません。