スマホのUDP通信アプリででESP32のLEDを点灯する
昨日の内容が濃かったので、ちょい簡単に昨日のUDP通信を使ってスマホからESP32のポートをコントロールしてLEDを点灯させてみます。💪
昨日はRaspberryPiと通信したけど、今日はスマホと通信します。
スマホアプリは以下のものを使いました。以下のものじゃなくても、送信するコマンドを設定できるものであればなんでも良いです。
今回はこんな設定をしてみました。
画面はこんな感じになります。
ボタンの設定は『LED on』は”1”を『LED off』は”0”を送信するように設定します。target IPはESP32がルーターからもらったアドレス、portはESP32に設定したport番号を設定します。
ESP32のプログラムはこんな感じになります。
#include <WiFi.h>
#include <WiFiUDP.h>
const char ssid[] = "your ssid"; // SSID
const char pass[] = "your password"; // password
static WiFiUDP wifiUdp;
IPAddress remoteIP; // 相手のIPアドレス
int port;
const int led = 4;
static void WiFi_setup()
{
static const int kLocalPort = 7000; //自身のポート
WiFi.begin(ssid, pass);
while( WiFi.status() != WL_CONNECTED) {
delay(500);
}
wifiUdp.begin(kLocalPort);
}
static void Serial_setup()
{
Serial.begin(115200);
Serial.println(""); // to separate line
}
void setup() {
Serial_setup();
WiFi_setup();
pinMode(led, OUTPUT);
}
void loop()
{
int j,k;
char i[64];
while(1){
if (wifiUdp.parsePacket()) {
j = wifiUdp.read(i,64);
i[j]= '\0';
remoteIP = wifiUdp.remoteIP();
port = wifiUdp.remotePort();
Serial.print(remoteIP);
Serial.print(" / ");
Serial.print(port);
Serial.print(" / ");
Serial.print(i); // UDP通信で来た値を表示
Serial.print("\n");
k=atoi(i);
digitalWrite(led, k);
}
delay(100);
}
}
プログラムのポイントとしては、このソフトは送信した文字列の最後に"¥0"を入れてこないようなので、下記のように受信した文字列の最後に"¥0"を追加しました。
文字列の最後に"¥0"を送信してくるソフトを使ったとしても、汎用性を考えたら、入れておいた方が無難でしょう。
j = wifiUdp.read(i,64);
i[j]= '\0';
送信データは"1"または"0"なので受信したデータを数値に変換してポートに出力しています。
k=atoi(i);
digitalWrite(led, k);
あっというまに出来てしましました。💯
スマホと接続する場合、ESP32をAPモード(アクセスポイント)として設定しても良いのですが、スマホのデザリングをONしてESP32をデザリングで接続し、スマホのルーター機能を使えばSTモードでもルーターなしでもスマホに直接接続できます。😙
ちなみに、こんなUDPソフトなんかもあったりして、コントローラーも簡単に作れちゃいます。😆
ちなみに、昨日はRaspberryPiのUDP通信も作ったのでRaspberryPiとも接続出来ます。
でも、LEDが10個あって、それをコントロールしたいとか、そんな時はこんな単純な通信ではとても出来ないですね〜💦
そんな場合は、通信コマンドを作ったり、もう少し不雑なコマンドを設計する必要があります。コマンドが複雑になると、それを解析するソフトも作らなくちゃならなかったり結構大変なんです。😅
次回は、そんな大変な通信を簡単にするOSC通信をやってみたいと思います。
では✋