レガシー機器をなんでもIoT化してしまおう③

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

今日は朝から健康診断だったので、バリウムを飲んできました。
いつもは会社のビルに来てくれるレントゲン車でやるのですが、今年はたまたま日程が合わなかったため、会社近くのクリニックでの受信となったのですが、いつも飲むバリウムより美味しいというか不味さが少ないというか…マシでした。
個人的には視力が両目ともに1.5だったので、今回の健康診断はすべてヨシとします。

さて、前回はBlynkの動作確認(?)だけ行いましたが、今日は実際に動作させてみます。

今回の検証環境

Output

LED マイナス端子をGND、プラス端子をGPIO16へ接続
GPIO16をデジタル出力に設定し、出力をHIGHにするとLEDが点灯します。

Input

押しボタン 端子1をGND、端子2をGPIO5へ接続
GPIO5をデジタル入力に設定しプルアップを設定、ボタンが押されるとGPIOが反応します。

接続図

めちゃ手抜きです。差し込んだケーブルが抜け落ちてしまうのでセロテープで止めているし、LEDの抵抗さえ入れていません。参考にしてはいけません(笑)

ソースコード

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <SSD1306.h>

SSD1306 display(0x3c, 5, 4);
BlynkTimer timer;  //■タイマー定義
char auth[] = "***********************";
char ssid[] = "*******";
char pass[] = "*******";

void setup()
{
  Serial.begin(115200);
  pinMode(5,INPUT_PULLUP);  //■Pinモード設定
  pinMode(16,OUTPUT);

  display.init();  //■OLED設定
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_10);
  display.clear();
  display.drawString(0, 0, "Lolin32 ON");
  display.display();

  Blynk.begin(auth, ssid, pass);

  display.drawString(0, 10, "Wifi Connected !");
  display.drawString(0, 20, "Blynk started");
  display.display();

  timer.setInterval(100L, checkPhysicalButton);  //■タイマーイベント定義
}

void checkPhysicalButton()  //■サブルーチン作成
{
  if (digitalRead(5) == LOW) {
    Blynk.virtualWrite(V5, 0);
  } else {
    Blynk.virtualWrite(V5, 255);
  }
}

void loop()
{
  Blynk.run();
  timer.run();  //■タイマー起動
}

検証結果

Output検証

Outputは簡単でした。
Blynkアプリ上でGPIOのポートを指定できるので、特に何も考える必要もありませんし、ArduinoIDEでコードを書く必要もありません。
以下のように画面上のボタンをタップすることで点灯/消灯することができました。

Input検証

Inputは少し悩む必要がありました。
Outputと異なりGPIOを指定して出力することができず、V5などというバーチャルピンを用いる必要があるため、ArduinoIDEでコードを書く必要があります。
下の写真では、緑の丸が白くなったことが分かると思います。

コード

また、単にコードを書くにしてもBlynkの基本概念を理解しなければなりません。
一般的にボタンの状態などを監視する場合には、loop()内に記載すればいいと思うのですが、それはBlynkのお作法的にNGみたいで動作しなくなってしまいます。Blynkアプリの実行ボタンを押すとOfflineと表示されてしまいます。

ちょっとググってみたところ、この場合には時間割り込みで記載するのが正しいようです。
ソースは上に示しましたが、4つの必要事項がありますので、ちょっと解説していきます。

1.タイマー定義

初めに、タイマーの定義が必要です。

BlynkTimer timer;

2.タイマーイベント定義

次に、setup()内でタイマーイベントを定義します。
起動インターバルをミリ秒で指定し、呼び出すサブルーチンcheckPhysicalButtonを指定します。

void setup()
{
  timer.setInterval(100L, checkPhysicalButton);
}

3.サブルーチン作成

呼び出すサブルーチンcheckPhysicalButtonを作成します。
このサブルーチン内で実際にGPIOとバーチャルピンの対応を定義します。
今回はGPIO5をV5というバーチャルピンに値をリンクさせています。
ボタンが離されているときはHIGH、押されたらLOWという感じです。

void checkPhysicalButton()
{
  if (digitalRead(btnPin) == LOW) {
  Blynk.virtualWrite(V5, 0);
  } else {
    Blynk.virtualWrite(V5, 255);
  }
}

4.タイマー起動

最後に、メインにタイマーを起動させれば完了です。

void loop()
{
  timer.run();
}

動作している動画

最後に動作している様子を動画で見てみましょう。
途中でボタンの反応が悪いのは、テキトーに接続して接触不良になっているからです。やっぱりなー!

こんな感じで、入力、出力共に問題なくBlynkで出来ることが分かりました。
これが出来れば、大抵のレガシー機器はIoT化出来てしまうのではないかと期待できますね!

次回

次はいよいよ、フォトカプラを用いて入出力を実装してみたいと思います。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す