温度・湿度・気圧測定デバイス作製【農業IoT・AgriTechデバイス開発#6】

IoT

はじめに

計画通りに進めていても記事の投稿にラグがある可能性がありますが、悪しからず。
本当に計画通りに進められていない場合もありますが・・・。

今回の記事ではWi-Fiを使用します。SSIDやパスワードの取り扱いには十分に注意してください。またGoogle Apps Script(GAS)を使用する際もURLやデプロイID等の取り扱いに十分に注意してください。あくまでも自己責任で利用していただければと思います。

前回の記事では、温度・湿度・気圧センサーの選定を行いました。

計画のうち、下計画の赤枠部分を進めていきます。

デバイス作製

今回からSDカードを廃止してGoogle Apps Script(GAS)を導入しています。GASとは無料で利用できるアプリケーション開発プラットフォームです。導入した理由はM5Stackで取得したデータをWi-Fi経由でスプレッドシートに保存できるためです。詳細は割愛しますが、機会や反響があれば紹介しようかなと思います。

・デバイス外観
下にデバイスの外観を載せておきます。今回使用するデバイスは以前、日照時間を調査した時に作製したデバイスを元にしています。

閉じると下のような感じになります。

だいぶスッキリはしていると思いますが、個人的にはもっと中の配線をスマートにしたいですね。

・GAS側のコード

続いてGASについてです。Googleのアカウントとスプレッドシートは予め作成しておきます。

GASを導入するにあたり、こちらの2つの記事を参考にさせていただきました。非常に分かりやすく説明されています。

実際のコードは下のようにしました。GASはシンプルに書けて非常に便利だと感じました。

function doGet(e) {
//下記のsheet_idは、ご自身のスプレッドシートのURL(例えば下のようなもの)
//https://docs.google.com/spreadsheets/d/XXXXXXXXXX/・・・
//からXXXXXXXXXXを格納してください。
//下記のsheet_nameはスプレッドシートの下部にあるシート名そのものを格納してください。
  let sheet_id = 'XXXXXXXXXX';
  let sheet_name = 'YYYYYYYYYY';
  var flag;

  if (!e.parameter || Object.keys(e.parameter).length == 0) {
    flag = 'NG'; //"e.parameterが存在しない"または"e.parameterが空"の場合はNG
  } else {
    var sheet_1 = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);
    var nextRow = sheet_1.getLastRow() + 1;
    var inputData = [];

    inputData[0] = new Date(); //日時
    inputData[1] = e.parameter.temp; //温度
    inputData[2] = e.parameter.humi; //湿度
    inputData[3] = e.parameter.pres; //気圧
    inputData[4] = e.parameter.lux; //照度

    var nextRange = sheet_1.getRange(nextRow, 1, 1, inputData.length);
    nextRange.setValues([inputData]);
    flag = 'OK';
  }
  return ContentService.createTextOutput(flag);
}

・M5Stack側のコード

M5Stackにuploadするコードです。今まで学んだことをふんだんに使っています。特にWi-Fiの部分は下記の記事を参考にしていただければと思います。

M5Stackにuploadするコードは以下のようにしました。

#include <M5Stack.h>
#include <WiFi.h>
#include <Wire.h>
#include <HTTPClient.h>
#include "M5UnitENV.h"
#include <M5_DLight.h>

SHT3X sht30;
QMP6988 qmp;
M5_DLight DLsensor;

const char* ssid = "xxxxxxxxxx"; //ご自身のWi-FiのSSIDを格納してください。
const char* password = "yyyyyyyyyy"; //ご自身のWi-Fiのパスワードを格納してください。
const char* deployid = "zzzzzzzzzz"; //GASでデプロイした時に受け取るデプロイIDを格納してください。

void setup() {
  M5.begin();
  Serial.begin(115200);
  Wire.begin();
  WiFi.begin(ssid, password);
  DLsensor.begin();

  while(WiFi.status() != WL_CONNECTED){
    delay(1000);
    M5.Lcd.print(".");
  }
  M5.Lcd.println("\nCONNECTED!");

  //温湿度センサーの初期化を可視化
  if (!sht30.begin(&Wire, 0x44)) {
    M5.Lcd.println("SHT30 not found");
  } else {
    M5.Lcd.println("SHT30 initialized");
  }
  //気圧センサーの初期化を可視化
  if (!qmp.begin(&Wire, 0x70)) {
    M5.Lcd.println("QMP6988 not found");
  } else {
    M5.Lcd.println("QMP6988 initialized");
  }
  //消費電力を小さくするために、ディスプレイをオフ
  delay(5000);
  M5.Lcd.sleep();
  M5.Lcd.setBrightness(0);
}

void loop() {
  M5.update();
  float temp = 0.0;
  float humi = 0.0;
  float pres = 0.0;
  int lux = 0;
  //温湿度を取得
  if(sht30.update()){
    temp = sht30.cTemp;
    humi = sht30.humidity;
  }
  //気圧を取得
  if(qmp.update()){
    pres = qmp.pressure;
  }
  //照度を取得
  DLsensor.setMode(ONE_TIME_H_RESOLUTION_MODE); //低消費電力モード ただし、getLUX()を呼び出す毎にリセット
  lux = DLsensor.getLUX();

  //Googleスプレッドシートに送信
  dataSendToGoogleSpreadsheet(temp, humi, pres, lux);
  delay(5000);
}

//スプレッドシートにデータを送信する関数
void dataSendToGoogleSpreadsheet(float temp, float humi, float pres, int lux) {
  HTTPClient http;
  String url = "https://script.google.com/macros/s/";
  url += deployid; //デプロイIDをurlに組み込む

  //以下は各データ(温度、湿度、気圧)をurlに組み込む
  url += "/exec?temp=";
  url += temp;
  url += "&humi=";
  url += humi;
  url += "&pres=";
  url += pres;
  url += "&lux=";
  url += lux;

  http.begin(url);
  int httpCode = http.GET(); //GETリクエストを送信して、サーバからのステータスコードを受け取る
  if(httpCode > 0){
    Serial.printf("[HTTP] status code is %d\n", httpCode); //ステータスコードを表示
    if(httpCode == HTTP_CODE_OK){
      String payload = http.getString(); //ステータスコードが200ならpayload(本文)を表示
      Serial.println(payload);
    }
  } else {
    Serial.printf("[HTTP] failed, error: %s\n", http.errorToString(httpCode).c_str()); //エラー内容を表示
  }
  http.end();
}

動作結果

まずはM5Stackの画面です。正常に動作していれば下のような画面が5秒ほど表示されるはずです。5秒後には消費電力を抑えるためにディスプレイをオフにしています。(正確に言うと、ディスプレイをオフにして、バックライトもオフにしています。)

続いて、スプレッドシートの状態です。以下のようにおよそ5秒ごとに日時/温度/湿度/気圧/照度の順番でデータが書き込まれていくと思います。

最後に

今回はデバイスを作製して動作を確認しました。栽培を開始したら早速デバイスを使ってみたいです。

果たしていつになるのかわかりませんが。

それでは今回はこの辺で。

おすすめの書籍

 もっと詳しくM5Stackについて知りたい!という方はこちらの書籍がおすすめです。とても詳しく載っていてわかりやすいです。

とりあえず何か作ってみたい!という方にはこちらの書籍がおすすめです。書いてある通りにやるだけでお手軽にIoTデバイスを作ることができます。

Arduinoで電子工作したい方にはこちらもおすすめです!Arduinoでどんなことができるのか、一目でわかる一冊になっています。

おすすめ記事

相変わらず、本ブログでは資格系の記事が人気です。ぜひご覧ください。

コメント

タイトルとURLをコピーしました