Grove 温度・湿度センサー を動かす
今回のプログラムはどのように動くか
書き込むと 温度と湿度データが表示されます。
Grove への Grove ケーブルのつなぎかた
Grove と Grove ケーブルのツメを合わせるように差し込みます。
このように差し込みました。
M5Stack への Grove ケーブルのつなぎかた
裏面右側のピン番号を合わせて以下のようにつなぎます。
- 赤ケーブル
- 5V
- 黒ケーブル
- G
- 白ケーブル
- つながない
- 黄ケーブル
- 2
ライブラリをインストール
GitHub の Seeed-Studio/Grove_Temperature_And_Humidity_Sensor のライブラリページ にアクセスします。
Code ボタンをクリックして Download ZIP ボタンからダウンロードします。
スケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストール をクリックします。
先ほどダウンロードした ZIP ファイルを選択してインストールします。こちらは Windows のファイル選択ですが、Mac の人は適宜読み替えてください。
これでインストール完了です。
ツール > ライブラリを管理で、
タイプをインストール済みで絞り込んで、Grove Temperature And Humidity Sensor がインストールされていればインストール成功です。
ソースコードを反映&保存
Arduino IDE で新規ファイルを作成し、以下のコードをコピーアンドペーストします。こちらを handson-TempHumid-sensor
というファイル名で保存します。
#include <M5Stack.h>
// 今回のセンサー DHT 11 のライブラリの呼び出し
#include "DHT.h"
#define DHTTYPE DHT11 // DHT 11
// 黄色いケーブルを挿すピンは 2 番ピン
#define DHTPIN 2
// ライブラリの宣言
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// init lcd, serial, but don't init sd card
M5.begin(true, false, true);
Wire.begin();
M5.Power.begin();
M5.Lcd.clear(BLACK);
M5.Lcd.setTextSize(3);
M5.Lcd.print("TempHumid");
M5.Lcd.setTextColor(WHITE);
// スピーカーぱちぱち音対策
dacWrite(25, 0); // Speaker OFF
dht.begin();
}
void loop() {
M5.update();
// 温度データを取得
float temp_hum_val[2] = {0};
if (!dht.readTempAndHumidity(temp_hum_val)) {
Serial.print("Humid: ");
Serial.print(temp_hum_val[0]);
Serial.print(" %\t");
Serial.print("Temp: ");
Serial.print(temp_hum_val[1]);
Serial.println(" *C");
} else {
Serial.println("Failed to get temprature and humidity value.");
}
M5.Lcd.clear(BLACK);
M5.Lcd.setCursor(0, 100);
// 1行目
M5.Lcd.print("Humid : ");
M5.Lcd.print(temp_hum_val[0]);
M5.Lcd.println(" %");
// 2行目
M5.Lcd.print("Temp : ");
M5.Lcd.print(temp_hum_val[1]);
M5.Lcd.println(" C");
delay(1500);
}
M5Stack に書き込んでみる
M5Stack に書き込んでみましょう。
A fatal error occurred: Timed out waiting for packet header が出たら
このエラーが出た場合は、
一度、Grove ケーブルを外してから、書き込んでみましょう。温度湿度センサーの仕組み( Wire あたり)が、ときどき処理を邪魔することがあることが原因です。
動かしてみる
動かしてみると、このように温度と湿度データが表示されます。
2 ~ 3 分しばらく置いていると安定してきますが、他の温度計と比べてみると高めに推移しやすいので、実際に使う場合は、他の温度計で示す温度と見比べて、補正して対応しましょう。
LINE Notify と連携するソースコードを試す
Arduino IDE で新規ファイルを作成し、以下のコードをコピーアンドペーストします。こちらを handson-TempHumid-sensor-LINENotify
というファイル名で保存します。
#include <M5Stack.h>
// HTTP 通信を行うライブラリ
#include <HTTPClient.h>
// Wi-FiのSSID
char *ssid = "Wi-FiのSSID";
// Wi-Fiのパスワード
char *password = "Wi-Fiのパスワード";
// LINE Notify トークン
String tokenLINENotify = "LINE Notify トークン";
// 今回のセンサー DHT 11 のライブラリの呼び出し
#include "DHT.h"
#define DHTTYPE DHT11 // DHT 11
// 黄色いケーブルを挿すピンは 2 番ピン
#define DHTPIN 2
// ライブラリの宣言
DHT dht(DHTPIN, DHTTYPE);
// カウントダウン用変数 メッセージを送った時間
long messageSentAt = 0;
void setup() {
// init lcd, serial, but don't init sd card
// LCD ディスプレイとシリアルは動かして、SDカードは動かさない設定
M5.begin(true, false, true);
// スタート
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
Serial.print("START"); // Arduino のシリアルモニタにメッセージを出す
M5.Lcd.print("START"); // M5Stack LCDディスプレイにメッセージを出す(英語のみ)
// WiFi 接続開始
WiFi.begin(ssid, password);
// 勝手に Button A が押されることを回避
WiFi.setSleep(false);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
Serial.print(".");
M5.Lcd.print(".");
}
// WiFi Connected
// WiFi 接続完了
M5.Lcd.setCursor(10, 40);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
// 前のメッセージが print で改行入っていないので println で一つ入れる
Serial.println(""); // Arduino のシリアルモニタにメッセージを出し改行が最後に入る
M5.Lcd.println(""); // M5Stack LCDディスプレイにメッセージを出す改行が最後に入る(英語のみ)
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
Serial.println("WiFi Connected."); // Arduino のシリアルモニタにメッセージを出す
M5.Lcd.println("WiFi Connected."); // M5Stack LCDディスプレイにメッセージを出す(英語のみ)
// 起動時に送る
delay(1000);
send_message("Launched");
// スピーカーぱちぱち音対策
dacWrite(25, 0); // Speaker OFF
// 温度湿度センサーの開始
dht.begin();
}
// HTTP でメッセージ送信部分
void send_message(String msg) {
// 今回送る LINE Notify API
// 参考 https://notify-bot.line.me/doc/ja/
String url = "https://notify-api.line.me/api/notify";
Serial.println("-> send_message");
Serial.print("msg: ");
Serial.println(msg);
// 送るデータ
String queryString = String("message=") + msg;
// HTTPClient 準備
HTTPClient httpClient;
// URL 設定
httpClient.begin(url);
// Content-Type
httpClient.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Authorization
httpClient.addHeader("Authorization", "Bearer " + tokenLINENotify);
// データ送信完了
Serial.println("sended.");
// ポストする
int status_code = httpClient.POST(queryString);
if( status_code == 200 ){
String response = httpClient.getString();
}
httpClient.end();
delay(2000);
}
void loop() {
M5.update();
// 以前の時間から現在の時間 millis() でどれだけ経過したかを計算
long spanTime = millis() - messageSentAt;
// 5秒 = 5000ミリ秒に1回送る
// センサー取得時間は3秒くらいは確保する
if (spanTime > 5000) {
// 送った時間を更新
messageSentAt = millis();
// 湿度データを取得
float humidity = dht.readHumidity();
// 温度データを取得
float temperature = dht.readTemperature();
M5.Lcd.clear(BLACK);
M5.Lcd.setCursor(0, 100);
M5.Lcd.setTextSize(3);
// 1行目
M5.Lcd.print("Humid : ");
M5.Lcd.print(humidity);
M5.Lcd.println("%");
// 2行目
M5.Lcd.print("Temp : ");
M5.Lcd.print(temperature);
M5.Lcd.println("C");
// float値を文字列で連結できるようにする
String humidityString = String(humidity);
String temperatureString = String(temperature);
// JSON 形式のメッセージを送る
send_message("h:" + humidityString + " t:" + temperatureString + "C");
}
if (M5.BtnA.wasReleased()) {
// A ボタンを押したら JSON 形式のメッセージを飛ばす
// \" はダブルクォーテーションで囲まれた中で JSON 内のダブルクォーテーションを表現するために \" でエスケープしてます。
send_message("Pushed A");
} else if (M5.BtnB.wasReleased()) {
// B ボタンを押したら JSON 形式のメッセージを飛ばす
send_message("Pushed B");
} else if (M5.BtnC.wasReleased()) {
// C ボタンを押したら JSON 形式のメッセージを飛ばす
send_message("Pushed C");
}
delay(1000);
}
Wi-Fi 情報を反映
// Wi-FiのSSID
char *ssid = "Wi-FiのSSID";
// Wi-Fiのパスワード
char *password = "Wi-Fiのパスワード";
自分のつなぎたい Wi-Fi の SSID とパスワードを反映します。
Wi-Fi 情報を反映
// Wi-FiのSSID
char *ssid = "Wi-FiのSSID";
// Wi-Fiのパスワード
char *password = "Wi-Fiのパスワード";
先ほどと同じように Wi-Fi 情報を反映します。
LINE Notify のトークンを反映
// LINE Notify トークン
String tokenLINENotify = "LINE Notify トークン";
Wi-Fi 設定と近いところにある String tokenLINENotify = "LINE Notify のトークン";
の LINE Notify のトークン
の部分を、先ほどメモした LINE Notify のトークンに置き換えましょう。ダブルクオーテーションを消していないか気をつけましょう。
M5Stack に書き込んでみる
そして、もう一度保存します。(大事)
M5Stack に書き込んでみましょう。
M5Stack を動かしてみる
起動してみると Launched! というメッセージが Gitpod 経由で LINE Notify のほうに送られます。
5秒に1回のタイミングで、センサーからデータが取得されて温度と湿度データが表示されます。
同時に、h:42.00 t:29.00C
というメッセージが Gitpod 経由で LINE Notify のほうに送られます。
LINE Notify はこのようにメッセージが送られています。
次は
左のメニューから、次に進みましょう。