#include <WiFi.h>
#include <PubSubClient.h>
const int buttonPin = 13; // ボタンスイッチの接続ピン
int buttonState = 0; // ボタンの状態を保存する変数
// WiFi settings
const char* ssid = "iopworkshop20240612";
const char* password = "iopworkshop";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// ボタンスイッチのピンを入力に設定
pinMode(buttonPin, INPUT);
// シリアル通信を開始
Serial.begin(115200);
// Wi-Fiに接続します(下に関数が定義されています)
setup_wifi();
// MQTT Brokerを設定します
client.setServer("192.168.254.254", 1883); //IPアドレスとポート番号
}
void loop() {
// Wi-Fiの接続が切れている場合は何もせずに0.1秒待機します
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi Disconnected");
delay(100);
return;
}
// ボタンスイッチの状態を読み取る
buttonState = digitalRead(buttonPin); // ピンよりデータ取得
if (buttonState == HIGH) {
// ボタンが押されている場合
Serial.println("ボタンが押されました");
mqtt_publish_test("iopworkshop/test", "テスト用ボタン", "押されました"); // トピック名、クライアントID、メッセージ
} else {
// ボタンが押されていない場合
Serial.println("ボタンが押されていません");
}
// 状態を確認する間隔を設定
delay(100); // 0.1秒ごとにチェック
}
void setup_wifi() {
delay(10); // 接続を安定させるための遅延
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// WiFi接続が完了するまで待機
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void mqtt_publish_test(char* topic, char* client_id, char* message) {
// MQTT ブローカーとの接続が切れている場合は0.1秒ごとに再接続を試みます
if (!client.connected()) {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// クライアントIDを決めて接続します
if (client.connect(client_id)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 0.1 seconds");
delay(100);
}
}
}
// "client_id > message" の形式でメッセージを送信することとします
String payload = String(client_id) + " > " + String(message);
// メッセージをパブリッシュ
Serial.print("Publishing message: ");
Serial.println(payload);
client.publish(topic, payload.c_str());
// HTTPがリクエスト-レスポンス型の通信プロトコルであるのに対し
// MQTTはパブリッシュ-サブスクライブ型の通信プロトコルです。
// リアルタイムな通信を行う際に適しています。
}