【ESP32でAmazon自動注文ボタン】AWS IoT Coreと自作ボタンを接続する

DIY
スポンサーリンク

Amazon自動注文ボタンをESP32で作ろうとしています。
本記事はAWS IoT Coreと自作ボタンを接続する手順をまとめました。

●開発環境
(自作ボタンへのプログラム書込み、TeraTermでプログラムの画面出力)
・Windows 10 Home Ver.21H1
・Arduino IDE 1.8.12
・Tera Term Version 4.104(SVN# 8043)
●自作ボタン
・ESP32-DevKitC ESP-WROOM-32開発ボード
・MQTT by Joel Gsewiler バージョン 2.5.0
・ArduinoJson by Benoit Blanchon バージョン 6.18.3

 

目次

 


 

はじめに

本記事は「ESP32でAmazon自動注文ボタン」の作成手順をまとめた連載記事の1つです。

前の手順

【ESP32でAmazon自動注文ボタン】ボタンを作る(はんだ付けはあとで)
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はESP32で自作ボタンを作る手順をまとめました。

 

次の手順

【ESP32でAmazon自動注文ボタン】自作ボタンをクリックしたら、Lambda関数が実行されるようにする
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンをクリックしたら、Lambda関数が実行する手順をまとめました。

 

手順全体や関連情報まとめ

 

 

 

HW回路図とプログラム

ボタンのHW回路図は前回の「【ESP32でAmazon自動注文ボタン】ボタンを作る(はんだ付けはあとで)」から変更はないです。
プログラムはAWS IoT Coreへの接続機能を追加しています。

 

HW回路図 (前回から変更なし)

ボタンクリック時のチャタリング対策として、「スイッチと平行にコンデンサを挿入」しています。

以下のブログを参考にチャタリング対策をしました。
スイッチが複数回押される現象を直す、チャタリングを対策する【逆引き回路設計】

 

自作ボタンのサンプルプログラム(前回から変更あり)


#include "secrets.h"
#include <WiFiClientSecure.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include "WiFi.h"

/***** パラメータ(ご自分の環境に合わせてください) *****/
const byte INPUT_PIN = 5;
#define AWS_IOT_PUBLISH_TOPIC   "esp32/pub"

/***** メインプログラム *****/
void setup() {
  Serial.begin(9600);
  Serial.println("Hello!");
  // ボタン検出機能の初期化処理を実行
  setup_button();
  // AWS IoT COre接続機能の初期化処理を実行
  setup_connection();
}
 
void loop() {
  // ボタン検出機能のループ処理を実行
  loop_button();
  // AWS IoT COre接続機能のループ処理を実行
  loop_connection();
}

/***** ボタン検出機能 関連プログラム *****/
byte interruptState = 0;
unsigned long msTime;

// ボタン検出機能の初期化処理
void setup_button(){
  // Digital Pin設定
  pinMode(INPUT_PIN, INPUT);
  
  // 割り込み設定:入力ピン、割り込みハンドラ、割り込み条件はHIGH→LOW
  attachInterrupt(digitalPinToInterrupt(INPUT_PIN), switchON, FALLING);
  msTime = millis();
}

// ボタン検出機能のループ処理
void loop_button(){
  if(interruptState) {
    if((millis() - msTime) > 1000) {
      Serial.println("Button ON!!!");
      publishMessage();
      msTime = millis();
    }
    interruptState = 0;
  }
}

// ボタンクリックの割り込みハンドラ
//   IMPUT_PIN HIGH→LOW
void switchON() {
  interruptState = 1;
}

/***** AWS IoT COre接続機能 関連プログラム *****/
WiFiClientSecure net = WiFiClientSecure();
MQTTClient client = MQTTClient(256);

// AWS IoT Core接続機能の初期化処理
void setup_connection(){
  // Wi-Fiに接続する
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  // Wi-Fiに接続待ち
  Serial.println("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println(".");

  // AWS IoT Coreに接続
  net.setCACert(AWS_CERT_CA);
  net.setCertificate(AWS_CERT_CRT);
  net.setPrivateKey(AWS_CERT_PRIVATE);
  client.begin(AWS_IOT_ENDPOINT, 8883, net);

  // AWS IoT Coreに接続待ち
  Serial.println("Connecting to AWS IOT");
  while (!client.connect(THINGNAME)) {
    Serial.print(".");
    delay(100);
  }
  Serial.println(".");

  if(!client.connected()){
    Serial.println("AWS IoT Timeout!");
    return;
  }

  Serial.println("AWS IoT Connected!");
}

// AWS IoT Core接続機能のループ処理
void loop_connection(){
  client.loop();
  delay(100);
}

// パブリッシュする
void publishMessage(){
  StaticJsonDocument<200> doc;
  doc["time"] = millis();
  doc["sensor_a0"] = analogRead(0);
  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer);

  client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}
  • INPUT_PINはGPIO5を設定しています。ご自分の環境に合わせてください。
  • AWS_IOT_PUBLISH_TOPICはESP32がPublishするトピック名を設定してください。

参考:
Arduinoで割り込み処理

 

Arduinoライブラリをインストールする

AWS IoT Coreと接続するために、以下のArduinoライブラリをインストールします。

  • MQTT by Joel Gsewiler
  • ArduinoJson by Benoit Blanchon

 

Arduinoライブラリのインストール手順を以下に記載します。

  1. Arduino IDEの上部にあるメニューから[スケッチ > ライブラリをインクルード > ライブラリを管理]をクリックする。
  2. 「ライブラリマネージャ」ウィンドウで「MQTT」と検索して、「MQTT by Joel Gsewiler」をインストールする。

 

  1. 同様に、「ライブラリマネージャ」ウィンドウで「ArduinoJson」と検索して、「ArduinoJson by Benoit Blanchon」をインストールする。

 

 

 

ESP32にプログラムを書き込む

  1. メインプログラム(*.ino)冒頭で紹介したプログラムを書き込む。
  2. secret.hに以下のプログラムを書き込む。
#include <pgmspace.h>

#define SECRET
#define THINGNAME ""

const char WIFI_SSID[] = "";
const char WIFI_PASSWORD[] = "";
const char AWS_IOT_ENDPOINT[] = "xxxxx.amazonaws.com";

// Amazon Root CA 1
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
)EOF";

// Device Certificate
static const char AWS_CERT_CRT[] PROGMEM = R"KEY(
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
)KEY";

// Device Private Key
static const char AWS_CERT_PRIVATE[] PROGMEM = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
)KEY";

 

  1. ESP32を接続して、Arduino IDEの上部にあるメニューから[ツール > シリアルポート]でESP32のCOMポートを指定する。
    ※COMポートはデバイスマネージャで確認できます。

 

  1. Arduino IDEの右上にある「マイコンボードに書き込む」ボタンをクリックする。
  2. Arduino IDEの下部に「ボードへの書き込みが完了しました。」と表示されればOK。

 

 

 

自作ボタンとAWS IoT Coreの接続手順は以上で終了です。
さいごに動作検証を行いましょう。

自作ボタンとAWS IoT Core間のMQTT通信を検証する

自作ボタンの検証をするために、自作ボタンにPCからシリアル通信接続します。

  1. PCから自作ボタンにUSB接続し、Teraterm等でシリアル通信接続する。
  2. 自作ボタンの電源ONし、Teratermに「AWS IoT Connected!」と表示されるまで待つ。

 

ここでは、以下の2通りのMQTT通信の検証を行います。

  • 自作ボタンがAWS IoT Coreに接続できたか?
  • 自作ボタンをクリックしたら、AWS IoT Core側MQTTメッセージを受信できるか?

 

 

自作ボタンがAWS IoT Coreに接続できたか?

接続できたかどうかは自作ボタンの画面出力を見ることで確認できます。
自作ボタンを起動させたとき、「AWS IoT Connected!」と表示されていれば、AWS IoT Coreに接続できてます。

Connecting to Wi-Fi
......
Connecting to AWS IOT
.
AWS IoT Connected!

 

自作ボタンをクリックしたら、AWS IoT Core側MQTTメッセージを受信できるか?

AWS IoT Core側でMQTTメッセージを受信できたか確認するため、AWS IoT Coreの「MQTT テストクライアント」を開きます。
「トピックをサブスクライブする」を選択した状態で、トピックフィルターに「#」を入れて「サブスクライブ」ボタンをクリックします。

 

上記のような状態で、自作ボタンを起動させて、ボタンをクリックします。
ボタンをクリックしたら、画面出力に「Button ON!!!」と表示されていれば、ボタンのクリックを検出してAWS IoT CoreにメッセージをPublishしています。

 

AWS IoT Coreの「MQTT テストクライアント」に以下のようにメッセージが受信できていればOKです。

 

もしうまく動作しなかった場合、、、

以下についてご確認ください。

  • ソースコードで指定しているトピック名やピン番号に誤りはないか?
  • secret.hの設定内容に誤りはないか?
  • AWS IoT Coreのポリシーに誤りはないか?

 

注意 MQTTテストクライアントは定期的にリセットしよう!

MQTTテストクライアントでサブスクライブすると、なぜか5分ごとにMQTTテストクライアントが追加接続されるため、アウトバンドのメッセージ数が増加していきます。
MQTTテストクライアントを使うときは、定期的にリセットしたほうがよいです。
詳細は以下のブログでまとめたので、よろしければご覧ください。

AWS IoT Coreで動作検証中にアウトバウンドメッセージが多い問題
AWS IoT Coreで動作検証中にメトリックス内でアウトバンドメッセージが多くカウントされていることが分かりました。 その原因と解決方法をまとめたので、よろしかったらご覧ください。

 

 

 

さいごに

「ESP32でAmazon自動注文ボタン」に向けて、AWS IoT Coreと自作ボタンを接続しました。
引き続き、「ESP32でAmazon自動注文ボタン」の作成手順をまとめています。

前の手順

【ESP32でAmazon自動注文ボタン】ボタンを作る(はんだ付けはあとで)
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はESP32で自作ボタンを作る手順をまとめました。

 

次の手順

【ESP32でAmazon自動注文ボタン】自作ボタンをクリックしたら、Lambda関数が実行されるようにする
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンをクリックしたら、Lambda関数が実行する手順をまとめました。

 

手順全体や関連情報まとめ

 

以上!

コメント

タイトルとURLをコピーしました