Wio TerminalをWiFi メッセージボードにしてみた

f:id:manpukukoji:20200929094429j:plain
普段、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);
}