普段、2階の自室にいる時、階下から ”ごはんできたよー!”とか、”お風呂沸いたよー!” とか知らせてくれてるんだけど、毎回、大声上げさせるのも申し訳ない。
と、言うわけで、キッチンからボタンをピッと押したら、2階のWioにパッとメッセージが表示されれば良いなと、思って、メッセージボードみたいなものを作ってみた。
仕組みは、ただのTCPのソケット通信でWioは、受信を待っていて、メッセージが入ったら、LEDを点灯してメッセージを表示するだけ。
今回は、M5Stackで送信し、Wioでメッセージを受信、表示しています。
メッセージは、”ごはんできたよー!” と、”おふろわいたよー!” の2つですが、いくらでも増やせます。 もちろん、送信側の送り方を工夫する必要がありますけど…。
スケッチは、ほとんど、サンプルプログラムのコピペでできちゃいますね。
このあたりが、Arduinoの開発環境のありがたいところで、たくさんの人がライブラリやサンプルを作ってくれているので、こちらは、ありがたく使わせていただくばかり。
恐悦至極でございます…。
Wio側のスケッチは、以下
Cボタンを押すとメッセージをクリアします。
今回も、LovyanGFXを使わせていただいています。
日本語を表示するのに、フォントの準備が必要です。
GitHub - Tamakichi/Arduino-misakiUTF16: Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版
スケッチと同じフォルダに"mmisakiUTF16FontData.h" を置いておきます。
Wifi接続は、ご自分の環境にあわせて設定が必要です。 portは、とりあえず、5000でやってます。
#include <AtWiFi.h> #include <LovyanGFX.hpp> #include "misakiUTF16FontData.h" static LGFX lcd; // lgfx::BDFfontクラスを使って、Arduino-misakiUTF16を使用できるように設定します。 static constexpr lgfx::BDFfont misaki_font = { fdata // 第1引数 フォントのビットマップデータ , ftable // 第2引数 unicodeフォントテーブル , sizeof(ftable)>>1 // 第3引数 フォントテーブルのサイズ , 8 // 第4引数 フォント幅 , 4 // 第5引数 フォント幅 (半角) , 7 // 第6引数 フォント高さ , 6 // 第7引数 ベースライン高さ , 8 // 第8引数 改行時の縦方向カーソル移動量 }; const char* ssid = "Your SSID"; const char* password = "Your Password"; WiFiServer server(5000); String R_data; void pipipi() { for (int i = 0; i<3; i++) { analogWrite(WIO_BUZZER, 128); delay(700); analogWrite(WIO_BUZZER, 0); delay(100); } } void setup() { Serial.begin(115200); //while(!Serial); // Wait for Serial to be ready delay(10); pinMode(D2, OUTPUT); pinMode(WIO_KEY_C, INPUT_PULLUP); pinMode(WIO_BUZZER, OUTPUT); lcd.init(); lcd.setFont(&misaki_font); lcd.setTextWrap(true, true); lcd.setTextColor(0xFFFF00U, 0x000000); lcd.setTextSize(3, 3); lcd.fillScreen(TFT_BLACK); //Red background // Set WiFi to station mode and disconnect from an AP if it was previously connected WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(2000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); Serial.print("IP Address: "); Serial.println (WiFi.localIP()); // prints out the device's IP address server.begin(); } void loop() { WiFiClient client = server.available(); if (client) { // if you get a client, Serial.println("New Client."); // print a message out the serial port while (client.connected()) { // loop while the client's connected while (client.available()) { // if there's bytes to read from the client, String currentLine =client.readStringUntil('\n'); Serial.println(currentLine); R_data = currentLine; currentLine = ""; client.print(R_data); if (R_data=="AA") { lcd.drawString("ごはんできたよー! ", 10, 80); pipipi(); digitalWrite(D2, HIGH); } if (R_data==("BB")) { lcd.drawString("おふろ わいたよー!", 10, 80); pipipi(); digitalWrite(D2, HIGH); } R_data = ""; } if (digitalRead(WIO_KEY_C) == LOW) { lcd.clear(); digitalWrite(D2, LOW); } } // close the connection: client.stop(); Serial.println("Client Disconnected."); } }
そして、M5Stack側のスケッチは、以下
#include <M5Stack.h> #include <WiFi.h> const char* ssid = "Your SSID"; //Wifi のSSIDを設定 const char* password = "Your Password"; //Wifi のパスワード String R_data; void setup() { M5.begin(true, false, true); Serial.begin(115200); delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop(){ const uint16_t port = 5000; // Default port const char* host = "xxx.xxx.xxx.xxx"; // Target Server IP Address Serial.print("Connecting to "); Serial.println(host); WiFiClient client; client.connect(host, port); while ( client.connected() ) { M5.update(); if (M5.BtnA.wasReleased()) { client.print("AA\n"); Serial.println("AA sent"); } if (M5.BtnB.wasReleased()) { client.print("BB\n"); Serial.println("BB sent"); } } Serial.println("Closing connection."); client.stop(); Serial.println("Waiting 5 seconds before restarting..."); delay(5000); }