🥞

農系IoT勉強会#2 Ambientを使ってセンサの値をスマホから確認しよう

2024/06/15に公開

今回の目標

「AtomS3に温湿度センサをつないで、温度と湿度をAmbientに表示してスマホから確認する。」

  1. Ambientのアカウント登録
  2. AtomS3で温度、湿度を計測して、Ambientへ送信してみよう
    1. Ambientでチャネルを作る
    2. AtomS3のコードを追加する
  3. Ambientでグラフ表示
  4. (余裕があれば)LINEにデータを送信してみよう

Ambientを使ってみよう

Ambientについて

https://ambidata.io
とても簡単に使えるクラウドサービス

  • グラフ化
  • データ蓄積+ダウンロード

Ambientのアカウント登録

  1. 下記リンクからAmbientのサイトにアクセス
      https://ambidata.io

  2. 画面右上のユーザー登録(無料)をクリック

  3. メールアドレスとパスワードを入力してユーザー登録(無料)をクリック。メールアドレスはすぐに見れればなんでもいいです

  4. クリックするとすぐにメールが飛んできますのでURLをクリック

  5. これでログイン出来るようになりました。登録した内容を入力してログインしてみましょう。

AtomS3で温度、湿度を計測して、Ambientへ送信してみよう(準備編)

Ambientでチャネルを作る

  1. 画面左のチャネルを作るボタンをクリックするとすぐにチャネルが生成されます
  2. チャネルを作ったばかりだと何も設定されていないので画面右の・・・ボタンをクリックして設定を変更します。
  3. 後で見てわかるようにチャネル名、データ名1に温度、データ名2に湿度と入力します。これでAmbient側の準備は完了です。

AtomS3からAmbientにデータを送信するためのコードを追加しよう

  1. Ambient ESP32 ESP8266 libをインストール

  2. 勉強会#1で書いたコードの冒頭に追加
      ↓勉強会#1のテキストはこちら↓
    https://helpful-organ-cb2.notion.site/IoT-1-AtomS3-8d1b4e32071946d9a954d5629c33a58c

    コードの内容

  • WifiとAmbientを使用するライブラリを呼び出す
  • Ambientのチャネルを指定する
  • インスタンスを作成

#include <Ambient.h>
#include <WiFi.h>

unsigned int channelId = *****;
const char* writeKey = "****************";

const char* ssid ="*********";
const char* password = "********";

WiFiClient client;
Ambient ambient;
  1. void setup(void){ の中に以下のコードを追加
  • wifiに接続
  • Ambient に接続
WiFi.begin(ssid,password);
while(WiFi.status() != WL_CONNECTED){
    delay(500);
    M5.Lcd.print("_");
  }
if (ambient.begin(channelId, writeKey, &client)) 
  {M5.Lcd.println("Ambient connected successfully");}
  else
  {
  M5.Lcd.println("Failed to connect Ambient");
  }  

4.void loop() { の中に以下のコードを追加

  • ambientにアップロードするデータを指定
  • ambirntに送信
  ambient.set(1,temp.temperature);
  ambient.set(2,humidity.relative_humidity);
  bool sendResult = ambient.send();
  if (sendResult) {
    M5.Lcd.println("Data sent successfully");
  } else {
    M5.Lcd.println("Failed to send data");
  }
  delay(1000*30)

Ambientで送信したデータがグラフになっているのを確認しよう

再度Ambientにログインしてグラフに反映されているかを確認します
グラフに反映されていない場合は以下を確認しましょう

  • wifiに接続されているか?
    • SSID、PASSの確認
  • Ambientに接続されているか?
    • チャンネルID、writekeyの確認、Ambientへのデータ送信の頻度
  • センサから値は取れているか?
    • Ambientだけでなく画面に表示してみましょう

(余裕のある方向け)LINEにデータを送ってみよう

LINE側の準備

  1. LINE Notifyにログインしますhttps://notify-bot.line.me/ja/
    携帯アプリのお友達追加からQRコードを読みこんでログインするのが便利です(おすすめ

    1. 携帯でLINEアプリを立ち上げる
    2. ホームに移動
    3. 右上の人+のアイコンをタッチ
    4. 画面中央上にあるQRコードをタッチ
    5. PC画面に映っているQRコードを撮影
      初回ログインは4桁のPINコードが求められると思います。
      携帯アプリからログインしようとするとPC画面にPINコードが表示されます。
  2. 次にトークンの発行をします

    1. 画面右上の自分の名前をクリックしてマイページに移動します

    2. 画面下に出てくるトークンを発行するボタンをクリック

    3. トークン名を記入して、1:1でLINE・・・を選択しトークンを発行したらトークンをメモします。

M5側の準備

ライブラリ ESP LINE Notify をインストールします。

Ambientに送るために作成したコードに以下を追加していきます

冒頭に追加
yourLineNotifyTokenの箇所に↑でメモしたトークンを入力します。

#include <HTTPClient.h>
// LINE Notify設定
const String token = "yourLineNotifyToken";

loop()内に追加

// LINEにデータを送信
  String tempString = String(temp.temperature,1);
  String humiString = String(humidity.relative_humidity, 1);
  String message = "temp=" + tempString +"degree  Humi= " + humiString + "percent";
  Serial.println(message);
  
  HTTPClient client;

  String url = "https://notify-api.line.me/api/notify";
  client.begin(url);
  client.addHeader("Content-Type", "application/x-www-form-urlencoded");
  client.addHeader("Authorization", "Bearer " + token);

  String query =  "message= " + message;
  client.POST(query);

  String body = client.getString();
  Serial.println("Sent the message");
  Serial.println(body);
  client.end();
  delay(1000*30)

いかがでしたでしょうか??
このコードでは開発の進めやすさで30秒に一度通知が来るように設定されていますが、実際はそんなに情報はいらないと思います。
delay()のカッコ内の数字はmsの単位ですので必要な数字に書き換えて使ってください。

私が書いたコードはこちら(すいません随時更新していると思います・・・
https://github.com/nono112002/IoT_workshops_for_agriculture/blob/ae64d46c57e8f40c207197767cb042510dc92829/to_send_Ambient_and_LINE

このテキストを作っていて躓いたた点
・最初ESP_Line_Notify.hというライブラリを使っていたがS3に謎のエラーで書き込み出来なかった
・湿度の%が特殊文字扱いっぽくてSrialprintでは表示されるがLINEに送るにはエンコードが必要そうだった(今回は省略)
・temp.temperatureがfloat型だが、LINEにはString型で送らないといけなかった

Discussion