RaspberryPi15Jamのブログ

IoTで作ったもの、ハマったことの備忘録

Grove IoT スターターキットで作ってみた その2

1.改良?のいきさつ

そもそも、その1で「電話してね」ボタンを作ったのは
留守番中の子どもからの連絡用のため。
コロナウイルスの緊急事態宣言で休校中、基本、在宅勤務となったものの、どうしても出社せねばならぬ日もあるのがサラリーマンの辛いところ…
家の固定電話の使い方を教え、上の子にはデータ通信とSMSのみの格安SIMを入れたスマホでSMSで連絡を取ることに。
連絡手段は多いほうがいいので、「電話してね」ボタンは下の子に渡して出社してました。
学校が再開してからは、帰宅時にSMSで帰ってきたよ連絡を入れる運用にしたが、なかなかSMSが来なくて心配になることも…おやつ食べたり、のんびりしてただけらしい(怒)
というわけで、帰ってきたことが分かるものを作ろう!というわけで、「超音波距離センサで”ただいま”を通知する」よう改造しました。

2.超音波距離センサで”ただいま”を通知する装置の概要

・ボタンを押すとスマホに「電話してね!」のSMSが届く機能は、その1のまま
・給電はモバイルバッテリーからACアダプタヘ変更
・磁気スイッチを外し、代わりに超音波距離センサを接続する
 測定距離が閾値未満になった時に、「人が通過した=帰宅した」ということでスマホにSMSが届く
必ずセンサの前を通過するよう、玄関に設置しました。
f:id:RaspberryPi15Jam:20201101150645j:plain 壁までの距離が140cm、距離が100cm未満を通過判定の閾値にするといい感じ!
ミニトマトが入っていたカップに入れたので、子どもたちから『トマトカップくん』と命名された(笑)
f:id:RaspberryPi15Jam:20201101150203j:plain

3.ソースコード

#include <WioLTEforArduino.h>
#include <Ultrasonic.h>      // https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger

#define BUTTON_PIN      (WIOLTE_D20)
#define ULTRASONIC_PIN  (WIOLTE_D38)
#define INTERVAL        (100)

#define S_PHONE_NUMBER  "090XXXXXXXX"

int buttonState;    //for pushbutton
long pre_distance = 200;

WioLTE Wio;
Ultrasonic UltrasonicRanger(ULTRASONIC_PIN);

void setup()
{
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");

  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  Wio.PowerSupplyGrove(true);

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  delay(3000);

  SerialUSB.println("### Setup completed.");
  Wio.LedSetRGB(0, 50, 0);
}

void loop()
{
  long distance;
  distance = UltrasonicRanger.MeasureInCentimeters();
  SerialUSB.print(distance);
  SerialUSB.println("[cm]");

  Wio.LedSetRGB(0, 50, 0);

  if ((pre_distance < 100)&&(distance < 100) )
  {
    SerialUSB.println("### Send SMS.");
    if (!Wio.SendSMS(S_PHONE_NUMBER, "We came back home!?")) {
      SerialUSB.println("### ERROR! ###");
      Wio.LedSetRGB(50, 0, 0);
      delay(1000);
    } else {
      SerialUSB.println("### SMS Send OK.");
      Wio.LedSetRGB(0, 0, 50);
      delay(1000);
    }
  }
  pre_distance = distance;

  buttonState = digitalRead(BUTTON_PIN);
  if (buttonState != 0)
  {
    SerialUSB.println("### Send SMS.");
    if (!Wio.SendSMS(S_PHONE_NUMBER, "This is Name. Please call me!")) {
      SerialUSB.println("### ERROR! ###");
      Wio.LedSetRGB(50, 0, 0);
      delay(1000);
    } else {
      SerialUSB.println("### SMS Send OK.");
      Wio.LedSetRGB(0, 0, 50);
      delay(1000);
    }
  }

  delay(INTERVAL);
}

4.課題

測定距離が閾値未満で即SMSを送信するようにしたら、誰もいないはずの時間にSMSが来るので不安に…
泥棒?霊的なもの?Gが出たのか?というのは半分冗談で、やはり測定値1発読みで判定は良くないので、 2回連続で閾値未満を通過判定としました。
それでも、まだ、1日に2回ほど変な時間にSMSが来るので、ちゃんと原因追及したいと思います。
1日だけTeraTermでログを取ってみたけど、その日は、変な時間にSMSが来る現象は再現せず…
仕込みを入れると現象再現せずってあるあるですよね(笑)再現するまで、ログ取りを続けます。

次回は「作ってみた」ではなく「行ってみた」について書く予定です。