LoginSignup
0
1

More than 3 years have passed since last update.

ESPとサーバ時間を使って、朝に処理させたい。

Last updated at Posted at 2019-07-20

やりたいこと

ESPやarduinoなどで、指定した時間(早朝に水やりなど)でウェイクアップして処理させたいことは、よくあると思う。
でも、指定した時間分だけスリープすることは出来るが、どれだけスリープするかなので、何時に起動するというのは難しい。
規則正しくスリープさせても実時間を取得しない限りはどんどんずれていくでしょう。
(宇宙飛行士はどうやって時計を合わせるか。)

そこで、サーバに起動したい時間をリクエストしておき、サーバからは、あとどれだけ眠ればいいのかを貰い、その時間を使って仕事の時間まで眠りに入るようにします。そうすれば、繰り返したとしても、起きたときは調度よい時間が保てるはずです。

サーバ処理

まずは、簡単にrubyで書きます。
今回の仕様では、毎日ウェイクアップする前提で、次の時間までの秒数を返すようにします。
デーン。

wakeup = "14:50"
( 86400 -( Time.now.to_i - Time.parse(wakeup).to_i) ) % 86400

86400は1日秒です。指定した時間で差分を取ってはみ出したら、指定時間をはみ出しているので、残り時間を出します。はみ出していなかったら、1日秒をごっそりとって、残り時間を出します。(TODO:分かり易さ)

rubyで書いておいて何ですが、サーバを用意するのが面倒なので、google cloud functionsに実行させます。
なので、nodejsに書き換えます。

そして、インラインエディタのindex.jsに書きます。デーン。
少し長くなりましたが、やりたいことは同じです。


/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.wakeup = (req, res) => {
  let waketime = req.query.waketime || req.body.waketime || "07:01";
  let hours = waketime.split(":")[0];
  let minutes = waketime.split(":")[1];
  let dt = new Date();
  let now = Math.floor( dt.getTime() / 1000 );
  dt.setHours(hours,minutes);
  let time = Math.floor(dt.getTime() / 1000 );
  let result = ( 86400 - ( now - time) ) % 86400 ;
  res.status(200).send(String(result));
};

あと、タイムゾーンが海外時間なので、cloud functionsの環境変数に、TZ Asia/Tokyoをセットして、デプロイすれば完了ですね。
これで、ESPからhttpリクエストでパラメータに?wakeup=7:17とかにすれば眠る秒数が返ってきます。

ESP処理

ここからは、まだ確認中ですが、ESPのディレイでは1日程度であれば、unsigned long が使えるので、

delay(strtoul(wakeupdelay) * 1000);

と、すればできるのではないでしょうか。
追記:

delay(strtoul(wakeupdelay.c_str(),NULL,10) * 1000);

Stringで取得できるので、これでできました!

おわりに

もちろん通常であれば、ボタン電池と時計モジュールを追加で作成するのでしょうが、追加コストも掛かるので、
Wifiが使えて、電池を抑えたい場合には、今回の方法は有用じゃないかと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1