この記事では、ESP32やESP8266を使用してDHT11センサーからの気温と湿度のデータをWi-Fi経由でGoogleスプレッドシートに送信する方法を紹介します。Arduino IDEとGoogle Apps Script(GAS)を使って、リアルタイムでデータを記録する手順をわかりやすく説明します。IoT初心者からDIY愛好家まで、気象データの収集と分析に興味のある方に最適です。農業にも使用可能と思います。
・ArduinoやESP32のプログラミングがわからないけど、気温や湿度のデータを収集できるのかな?
・Googleスプレッドシートにデータを送信する方法が複雑そう…簡単に設定できるのかな?
こんな疑問に答えます。
一番下に、YouTubeで内容について説明していますので、興味がありましたらご覧ください。
この記事は誰のため?
- IoTに興味を持ち始めた初心者:
- 自宅プロジェクトを始めたいDIY愛好家:
- 自宅で温度や湿度を監視したい方。
- 手作業で何か有用なものを作りたいが、複雑なプログラミングや電子工作に挑戦するのが初めての方。
- 教育関係者と学生:
- 学校のプロジェクトや科学の授業で実用的な技術を生徒に教えたい教師。
- 技術的なスキルを学び、新しいことに挑戦することに興味がある学生
- テクノロジーに興味がある一般の方:
- 新しい技術に興味があり、日々の生活や趣味に応用したい方。
- 実践的なプロジェクトを通じて学習し、自己の技術的な理解を深めたい方。
必要な機材と事前準備
このプロジェクトを始める前に、以下の機材とソフトウェアの準備が必要です。
必要な機材
- ESP32またはESP8266モジュール:
- これらは人気のあるWi-Fi機能付きマイクロコントローラーボードです。
- どちらも低コストで、IoTプロジェクトに広く使用されています。
- DHT11温湿度センサー:
- 温度と湿度を測定するための簡単に使用できるセンサー。
- 小型で、ESPボードに直接接続可能。
- ブレッドボードとジャンパーワイヤー:
- プロトタイピングを簡単にするためにブレッドボードを使用します。
- ジャンパーワイヤーはセンサーをボードに接続するのに必要です。
- インターネット接続:
- データをGoogleスプレッドシートに送信するためには、安定したインターネット接続が必要です。
ソフトウェアと設定
- Arduino IDEのインストール:
- ESP32やESP8266にプログラムをアップロードするために必要な開発環境。
- 公式ウェブサイトから無料でダウンロードし、インストールできます。
- Googleアカウントとスプレッドシートの準備:
- Googleスプレッドシートにデータを記録するため、Googleアカウントが必要です。
- 新しいスプレッドシートを作成し、必要に応じて列を設定します(例:日付、時間、温度、湿度)。
事前準備の確認
- すべての機材が揃っていることを確認し、Arduino IDEが正しくインストールされていることを確認します。
- Googleアカウントがあること、そしてスプレッドシートが利用可能であることを確認します。
下記から購入できます。スターターキットがおすすめです。
DHT11センサーからのデータ読み取り
この章では、DHT11センサーの接続方法とデータ読み取りプロセスを詳細に解説します。
回路図は下記を参照してください。
DHT11センサーの接続
- センサーのピン配置:
- DHT11は通常、3つのピンを持っています:VCC(電源)、GND(グラウンド)、DATA(データ)。
- ESPボードへの接続:
- VCCをESPボードの3.3Vに接続。
- GNDをESPボードのGNDピンに接続。
- DATAをESPボードの任意のデジタルピンに接続(例:D2)。
Arduino IDEを使用したプログラミング
- プログラムの準備:
- Arduino IDEを開き、DHT11センサーからデータを読み取るためのスケッチ(プログラム)を作成します。
- ライブラリのインストール:
- DHT11センサーを操作するために必要なライブラリをArduino IDEにインストールします。
- スケッチの書き込み:
- 温度と湿度を読み取り、それをシリアルモニターに表示するためのコードを書きます。
データの読み取りと確認
- スケッチのアップロード:
- 作成したスケッチをESPボードにアップロードします。
- シリアルモニターの使用:
- Arduino IDEのシリアルモニターを開き、センサーからの出力を確認します。
- 温度と湿度のデータが正しく表示されることを確認します。
Googleスプレッドシートへのデータ送信
Google Apps Scriptの設定
このセクションでは、ESP32やESP8266から収集した気温と湿度のデータをGoogleスプレッドシートに送信する方法を詳しく説明します。
Googleスプレッドシートの作成
まず、Googleドライブに新しいスプレッドシートを作成します。これは、センサーからのデータを記録するために使用します。
Google Apps Scriptの使用
スプレッドシートを開き、[拡張機能] > [Apps Script]を選択して、Google Apps Scriptのエディタを開きます。
スクリプトの書き込み
Google Apps Scriptのコードをエディタに貼り付けます。このスクリプトは、ESP32/ESP8266から送られてくるデータを受け取り、それをスプレッドシートに記録する役割を果たします。
下記XXXXのコードを自分のスプレッドシートのアドレスと合わせてください。下記のYour IDに変更
https://docs.google.com/spreadsheets/d/~Your ID~/edit
function doGet(e) {
const url = "https://docs.google.com/spreadsheets/d/xxxx/edit#gid=0";
const ss = SpreadsheetApp.openByUrl(url);
const sheet = ss.getSheets()[0];
const params = {
"timestamp": new Date(),
"temperature": e.parameter.temperature,
"humidity": e.parameter.humidity
};
sheet.appendRow(Object.values(params));
return ContentService.createTextOutput('success');
}
スクリプトのデプロイ:
スクリプトが完了したら、デプロイの新しいデプロイを選択します。
ウェブアプリを選択します。
説明文に任意で記載し、アクセス権は「全員(匿名ユーザーを含む)」に設定してください。その後、デプロイを選択します。
アクセスを承認します。
自分のユーザ名を選択したら、Advancedを選択します。
Go to 無題のプロジェクトを選択。
Allowを選択します。
デプロイ後、生成されたURLをコピーします。このURLは、ESP32/ESP8266のプログラム内でデータを送信する際に使用します。
ESP32/ESP8266のプログラム設定
データ送信URLの設定
Arduinoプログラム内で、先に取得したGoogle Apps ScriptのURLを指定します。
const String url = "https://script.google.com/macros/s/xxxx/exec"; // 取得したURLに置き換える
XXXXを取得したURLに置き換えます。
データ送信ロジック
気温と湿度のデータを読み取った後、以下のようにしデプロイ時にコピーしたGoogle Apps ScriptのURLにGETリクエストを送信します。これにより、スプレッドシートにデータが追記されます。
String urlFinal = url + "?temperature=" + String(temperature) + "&humidity=" + String(humidity);
HTTPClient http;
http.begin(urlFinal.c_str());
int httpCode = http.GET();
// 応答を受け取る処理
http.end();
動作確認
プログラムをESP32/ESP8266にアップロードし、動作を確認します。センサーからのデータがスプレッドシートに正しく記録されているかをチェックします。
この手順に従うことで、ESP32/ESP8266を使用して環境データをリアルタイムでGoogleスプレッドシートに記録することが可能になります。IoTプロジェクトにおいて、データの可視化と分析の基礎を築くことができます。
コードの詳細解説
この章では、提供されたArduinoスケッチとGoogle Apps Scriptのコードを初心者にも理解しやすいように詳細に解説します。各部分の機能と、それがどのように連携して動作するかを明確にします。
Arduinoスケッチの解説
Arduinoスケッチの説明を行います。
- ライブラリのインポート:
#include <WiFi.h>
: Wi-Fi機能を使うためのライブラリ。#include <HTTPClient.h>
: HTTPリクエストを送信するためのライブラリ。#include "DHT.h"
: DHTセンサーを操作するためのライブラリ。
- Wi-Fi接続情報の設定:
const char* ssid = "xxxx";
とconst char* password = "xxxx";
でWi-FiネットワークのSSIDとパスワードを設定。
- DHTセンサーの設定:
#define DHTPIN 2
と#define DHTTYPE DHT11
で、DHTセンサーのピン番号とタイプを指定。DHT dht(DHTPIN, DHTTYPE);
でDHTオブジェクトを初期化。
- セットアップ関数(
setup()
):- シリアル通信の開始、Wi-Fi接続の設定、DHTセンサーの初期化を行います。
- ループ関数(
loop()
):- 温度と湿度のデータを読み取り、それをGoogleスプレッドシートに送信する処理をループします。
Arduino コード全文がこちらです。
WiFiの設定のSSID,Passと、デプロイ時にコピーしたURLを入力します。
#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
// Wi-Fiの設定
const char* ssid = "Your SSID";
const char* password = "Your Password";
// Google Apps ScriptのURL
const String url = "Your URL";
// DHTセンサーのピン設定
#define DHTPIN 5 // DHTセンサーのデータピン
#define DHTTYPE DHT11 // 使用するDHTセンサーの種類
// DHTセンサーの初期化
DHT dht(DHTPIN, DHTTYPE);
float humidity = 0;
float temperature = 0;
void setup() {
Serial.begin(115200); // シリアル通信の設定
delay(1000);
// DHTセンサーの初期化
dht.begin();
delay(10);
// Wi-Fi接続の設定
WiFi.mode(WIFI_STA); // Wi-Fiモードを設定
WiFi.disconnect(); // 以前のWi-Fi接続を切断
if (WiFi.begin(ssid, password) != WL_DISCONNECTED) {
ESP.restart(); // Wi-Fi接続に問題がある場合、ESPを再起動
}
// Wi-Fi接続が完了するまで待機
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Wi-Fiネットワークに接続しました!");
}
void loop() {
// DHT11からデータを収集
Serial.println("温度データを収集中...");
// 温度と湿度を読み取るには約250ミリ秒かかります!
humidity = dht.readHumidity(); // 湿度を読み取る
temperature = dht.readTemperature(); // 温度を摂氏で読み取る
// データの読み取りに失敗した場合、再試行するために早期に終了します。
if (isnan(humidity) || isnan(temperature)) {
Serial.println("DHTセンサーから読み取りに失敗しました!");
return;
}
Serial.println("Googleスプレッドシートにデータを送信中:");
Serial.print("湿度: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("温度: ");
Serial.print(temperature);
Serial.println(" ℃ ");
// Googleスプレッドシートにデータを送信するURLを作成
String urlFinal = url + "?temperature=" + String(temperature) + "&humidity=" + String(humidity);
Serial.println(urlFinal);
// HTTPリクエストを送信
HTTPClient http;
http.begin(urlFinal.c_str()); // URLを指定してHTTPクライアントを初期化
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); // ストリクトなリダイレクトを設定
int httpCode = http.GET(); // HTTP GETリクエストを送信
Serial.print("HTTPステータスコード: ");
Serial.println(httpCode);
// Googleスプレッドシートからのレスポンスを取得
String payload;
if (httpCode > 0) {
payload = http.getString(); // レスポンスを取得
Serial.println("レスポンス: " + payload);
}
http.end(); // HTTPクライアントを終了
delay(2000); // 2秒待機
}
Google Apps Scriptの解説
GASの内容説明を下記に記載します。
doGet(e)
関数:- この関数は、ESP32/ESP8266からのGETリクエストを受け取るために使われます。
e
はイベントオブジェクトで、リクエストに含まれるパラメータ(温度と湿度)を含んでいます。
- スプレッドシートの操作:
- スプレッドシートのURLを指定し、そのシートにアクセスします。
sheet.appendRow(Object.values(params));
で、温度と湿度のデータを新しい行として追加します。
- リクエストの応答:
return ContentService.createTextOutput('success');
で、処理が成功したことをESP32/ESP8266に通知します。
GASコード全文がこちらです。Your spread sheet URLにスプレッドシートのアドレスを入れます。
function doGet(e) {
const url = "https://docs.google.com/spreadsheets/d/Your spread sheet URL/edit#gid=0";
const ss = SpreadsheetApp.openByUrl(url);
const sheet = ss.getSheets()[0];
const params = {
"timestamp": new Date(),
"temperature": e.parameter.temperature,
"humidity": e.parameter.humidity
};
sheet.appendRow(Object.values(params));
return ContentService.createTextOutput('success');
}
Your spread sheet URLにスプレッドシートのアドレスを入れます。d/XXXX/editのXXXXを入力
このコードの各部分は、気温と湿度のデータを効率的に読み取り、それを無線経由でGoogleスプレッドシートに送信するために連携して動作します。このセクションを通じて、プログラミング初心者でも各コンポーネントの役割と相互作用を理解しやすくなることを目指しています。
YouTubeで作成時の様子を掲載しているので、興味がありましたら見てください。