M5Stackにつないだデジタル入力をAWS IoTにデータ送信するメモ
M5Stackにつないだデジタル入力をAWS IoTにデータ送信するメモです。
基本的には、ESP32 DeveloperでAWS IoTを動かしたナレッジをベースに進めていきます。
M5Stackにデジタル入力をつける

今回はコンパクトになったGrove人感センサー、GROVE ミニPIRモーションセンサを使います。

GROVE ジャンパメスケーブル 20cmをつかってM5Stackのピンに刺さるようにします。

このように、GROVEケーブルはメスなので、M5Stackのオスピン口のほうに、
- 黒いケーブル
- GNDピン
- 赤いケーブル
- 3V3ピン
- 黄色ケーブル
- G2ピン
- 白色ケーブル
- どこにも差し込まない
という差し込み方をします。

これでM5Stackは準備完了です。
実は、ここに落ち着くまでにM5Stackにはメスピン口しかないのかと勘違いしていて、そうなるとGroveのオスピンケーブル探すのはめっちゃ大変で自作するしかないなあ思っていてたんですが、よく見ろって話で、何ら問題なかったです。
ソースコード
ESP32 DeveloperでAWS IoTを動かしたナレッジをベースに進めますが、M5Stack用のより分かりやすいカスタマイズをします。

単体でもデジタル入力のON/OFFを確認しやすく表示します。

初期起動のときAWS IoTの接続情報を表示してトピック名ミスを軽減します。タイトルを出すことで地味に何を起動しているか分かるも良いところですね。
実際のソースコードです。ソースコードの細かい使用方法はESP32 DeveloperでAWS IoTを動かしたナレッジを参考下さい。
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <M5Stack.h>
char *ssid = "<YOUR_SSID>";
char *password = "<YOUR_WIFI_PASSWORD>";
const char *endpoint = "<AWS_IOT_ENDPOINT>";
// Example: xxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com
const int port = 8883;
char *pubTopic = "/sample123";
char *subTopic = "/sample123";
const char* rootCA = "-----BEGIN CERTIFICATE-----\n" \
"......" \
"-----END CERTIFICATE-----\n";
const char* certificate = "-----BEGIN CERTIFICATE-----\n" \
"......" \
"-----END CERTIFICATE-----\n";
const char* privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" \
"......" \
"-----END RSA PRIVATE KEY-----\n";
WiFiClientSecure httpsClient;
PubSubClient mqttClient(httpsClient);
// ボタンON/OFF管理
int buttonStateCurrent = LOW;
int buttonState = LOW;
// 2番ピンに差し込む
int buttonPin = 2;
void setup() {
// Initialize the M5Stack object
M5.begin();
// START
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(3);
M5.Lcd.printf("AWSIOT DPIN START");
// Start WiFi
Serial.println("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password);
//
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(115200);
// Start WiFi
Serial.println("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected.");
Serial.println(pubTopic);
Serial.println(subTopic);
// WiFi Connected
Serial.println("\nWiFi Connected.");
M5.Lcd.setCursor(10, 40);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(3);
M5.Lcd.printf("WiFi Connected.");
// INFO
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 100);
M5.Lcd.printf("sub: ");
M5.Lcd.println(subTopic);
M5.Lcd.printf("pub: ");
M5.Lcd.println(pubTopic);
// Configure MQTT Client
httpsClient.setCACert(rootCA);
httpsClient.setCertificate(certificate);
httpsClient.setPrivateKey(privateKey);
mqttClient.setServer(endpoint, port);
mqttClient.setCallback(mqttCallback);
connectAWSIoT();
}
void connectAWSIoT() {
Serial.println("connectAWSIoT");
while (!mqttClient.connected()) {
Serial.print(".");
if (mqttClient.connect("ESP32_device")) {
Serial.println("Connected.");
int qos = 0;
mqttClient.subscribe(subTopic, qos);
Serial.println("Subscribed.");
} else {
Serial.print("Failed. Error state=");
Serial.print(mqttClient.state());
// Wait 5 seconds before retrying
delay(5000);
}
}
}
long messageSentAt = 0;
int dummyValue = 0;
char pubMessage[128];
void mqttCallback (char* topic, byte* payload, unsigned int length) {
String str = "";
Serial.print("Received. topic=");
Serial.println(topic);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
str += (char)payload[i];
}
Serial.print("\n");
}
void mqttLoop() {
if (!mqttClient.connected()) {
connectAWSIoT();
}
mqttClient.loop();
}
void loop() {
mqttLoop();
// buttonPin判定
int currentButtonState = digitalRead(buttonPin);
if( currentButtonState != buttonState){
buttonState = currentButtonState;
if (buttonState == HIGH) {
Serial.println("ON");
// テキスト反映
M5.Lcd.fillScreen(RED);
M5.Lcd.setCursor(10, 120);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(5);
M5.Lcd.printf("ON");
//
sprintf(pubMessage, "{\"value\": \"ON\"}");
Serial.print("Publishing message to topic ");
Serial.println(pubTopic);
Serial.println(pubMessage);
mqttClient.publish(pubTopic, pubMessage);
Serial.println("Published.");
delay(500);
} else {
Serial.println("OFF");
// テキスト反映
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 120);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(5);
M5.Lcd.printf("OFF");
//
sprintf(pubMessage, "{\"value\": \"OFF\"}");
Serial.print("Publishing message to topic ");
Serial.println(pubTopic);
Serial.println(pubMessage);
mqttClient.publish(pubTopic, pubMessage);
Serial.println("Published.");
delay(500);
}
}
}
こちらをM5Stackに書き込みます。
実際に動かしてみる
まず起動してみて人感センサーを動かしてみます。
https://www.youtube.com/watch?v=Q2z-pn0UxIs
無事動いていますね。
つづいて、AWS IoTのテスト画面でデータを見ましょう。
https://www.youtube.com/watch?v=mJLb4EB4uso
しっかり反応しています!
これでAWS IoTにつなげられると、よりセキュアな領域にデータが送れて
それでは、よき AWS IoT & M5Stack & Grove Life を!