#include <M5Unified.h>
#include <WiFi.h>
// ライブラリで PubSubClient をいれておく ★★★ 重要 ★★★
#include <PubSubClient.h>
const char* ssid = "ics-ap";
const char* password = "jikkenics";
const char* server = "mqtt.istlab.info";
const int port = 1883;
const char* pubTopic = "jikken"; // 班名を入れれば他の班とかぶらない。+にはしない。ex. jikken/A4han
WiFiClient wifiClient;
char* clientid = "m5scp2_001"; //デバイス個別に設定すればなんでもよい
PubSubClient mqttClient(wifiClient); // MQTT Client
char macaddr[100];
void setup() {
auto cfg = M5.config();
cfg.serial_baudrate = 115200;
M5.begin(cfg);
M5.Display.setRotation(3); //横向き
M5.Display.setFont(&fonts::lgfxJapanGothic_16);
M5.Display.println("mqtt01pub");
M5.Display.setTextScroll(false);
WiFi.begin(ssid, password); // 接続開始
while (WiFi.status() != WL_CONNECTED) { // 接続中...
M5.Display.print(".");
M5.delay(500);
}
// 接続完了!!
M5.Display.fillScreen(CYAN);
M5.Display.setCursor(0, 8, 4);//x,y,fonttype
M5.Display.setTextColor(BLACK, CYAN);
M5.Display.print(" Wifi Connected!\n");
String gotip = WiFi.localIP().toString(); // m5デバイスのIPアドレス
M5.Display.println(gotip);
mqttClient.setServer(server, port);
if ( !mqttClient.connected() ) {
Serial.println("Try connecting MQTT...");
reconnect();
}
// 参考:WiFiデバイスのMACアドレスを取得し、送信する
uint8_t mac[6];
WiFi.macAddress(mac);
sprintf(macaddr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] );
M5.Display.println(macaddr);
M5.delay(2000);
Serial.println("publishするメッセージをSerialから送信してください。またはAボタンを押してください。");
M5.Display.setFont(&fonts::lgfxJapanGothic_16);
M5.Display.println("publishするメッセージをSerialから送信してください。またはAボタンを押してください。");
}
void loop() {
// シリアルコンソールから書き込みがあれば, publishする
char mbuf[100]; int pos = 0;
while ( Serial.available() ) { // ノンブロッキング
mbuf[pos] = Serial.read();
pos++;
}
if (pos > 0) {
mbuf[pos-1] = 0; //改行をNULLに置き換える
Serial.println(mbuf);
if ( !mqttClient.connected() ) reconnect();
// ブローカにデータを送信する。最後の false を true にすると、retained になる。
// boolean ret = mqttClient.publish( pubTopic , mbuf, size, false );
boolean ret = mqttClient.publish( pubTopic , mbuf );
if ( !ret ){
Serial.println("publish failed.");
}
}
M5.update(); // ボタン読み取りの前にはupdateが必要
if (M5.BtnA.wasReleased()) {
if ( !mqttClient.connected() ) reconnect();
boolean ret = mqttClient.publish( pubTopic , macaddr );
if ( !ret ){
Serial.println("publish failed.");
}
}
M5.delay(50);
}
void reconnect() {
while ( !mqttClient.connected() ) {
if ( mqttClient.connect(clientid) ) {
Serial.println("Connected to MQTT Broker.");
} else {
Serial.printf("Connect Failed. state=%d", mqttClient.state());
}
}
}