注意
delay(1)でloopしていますが、用途によってはdelayを大きくしたり、<br />入力変化時に送信する方式ても良いかもしれません。<br />専用アクセスポイントと送受信機1台づつという想定ですが、<br />アクセスポイントを複数の送受信機で共有したりすると<br />パケットロスによる問題が発生するかもしれません。
伝送接点数16 単方向(送信側→受信側への伝送のみ)
離れたところにある機器の信号を、電波が届く範囲で
配線無しで受け取ることができる。
アクセスポイント経由ESP32同士で通信します。
主な部品 ESP32開発ボード、I/OエキスパンダMCP23017
手動テストの様子
右側基板のスイッチを押すと接点信号が伝送され、左側基板の
LEDが点灯します。
右側が送信、左側が受信となっています。
スイッチ基板で信号を作ってMCP23017へ 入力しています。
MCP23017のデジタル入力を読み込み、16進数を文字配列
としてUDPで送信
受信した文字配列を16進数へ変換してMCP23017でデジタル
出力します。
Wi-Fi接続試行中GPIO2 LED250mS周期点滅 接続失敗でESP.restart()します。
通信中にアクセスポイントと通信できなくなった時もLED点滅700-300mS周期
ESP.restart()します。
準備
アクセスポイントとスケッチのIPアドレスを設定
アクセスポイントとSSIDとパスワードをあわせる
WiFiUDPClient.inoをベースにした送信側スケッチを紹介しておきます。
#include行の<>は半角に修正必要です
#include <WiFi.h>
#include <WiFiUdp.h>
#include <esp_wifi.h>
#include "Adafruit_MCP23017.h"//16bitIOExpander
// WiFi network name and password:
const char * ssid = "network name";
const char * password = "network password";
//IP address to send UDP data to:
// either use the ip address of the server or
// a network broadcast address
// UDPデータの送信先IPアドレス:
const char * udpAddress = "192.168.1.3";//受信側のIPアドレス
const int udpPort = 1234;//受信側と合わせる
//Are we currently connected?
boolean connected = false;
//The udp library class
WiFiUDP udp;
Adafruit_MCP23017 mcp;
void setup() {
// Initilize hardware serial:
Serial.begin(115200);
Wire.begin();//Wire.setClockのために必要と思う
Wire.setClock(400000);//Fast-mode400kHzにする時(デフォルトは100kHz記述不要)
pinMode(2, OUTPUT);//Wi-Fi接続試行中点滅し接続完了で消灯
mcp.begin(); // use default address 0 MCP23017をデフォルトアドレスで使う
IPAddress local_IP(192, 168, 1, 4);//送信側(自機)IPアドレス
IPAddress gateway(192, 168, 1, 1); //
IPAddress subnet(255, 255, 255, 0);
WiFi.mode(WIFI_STA);//Wi-Fi子機モート
WiFi.config(local_IP, gateway, subnet);
Serial.println("Connecting to WiFi network: " + String(ssid));
// delete old config
WiFi.disconnect(true);
//register event handler イベントハンドラーの登録
WiFi.onEvent(WiFiEvent);
//Initiate connection
WiFi.begin(ssid, password);
Serial.println("Waiting for WIFI connection...");
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++
digitalWrite(2, HIGH);
delay(250);
digitalWrite(2, LOW);
delay(250);
Serial.print(".");
}
if (i == 21) { // Wi-Fi接続不能を回避 10秒待ってESPをリスタートする。
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
Serial.println(WiFi.status() == WL_CONNECTED ? "WiFi connected!" : "Failed!");
//Connect to the WiFi network
//connectToWiFi(networkName, networkPswd);
//udp.begin(udpPort); // UDP通信開始
for (int i = 0; i
mcp.pinMode(i, INPUT); // mcp23017の全ピンをPULLUPを有効
mcp.pullUp(i, HIGH); // turn on a 100K pullup internally
}
}
void loop() {
//only send data when connected接続時にのみデータを送信する
//if (WiFi.status() == WL_CONNECTED) {
if (connected) {
//connected がfalseになった時はdelay(5000)後ESP.restart()している
//Send a packet
udp.beginPacket(udpAddress, udpPort);
/*Serial.printf("%05x", mcp.readGPIOAB()); Serial.println();*/
udp.printf("%05x", mcp.readGPIOAB());//桁を揃えて送るため0埋め
//udp.printf(" Seconds since boot: %lu", millis() / 1000);//使い方の例
udp.endPacket();
}
//Wait for
delay(1);
}
/*void connectToWiFi(const char * ssid, const char * pwd) {
Serial.println("Connecting to WiFi network: " + String(ssid));
// delete old config
WiFi.disconnect(true);
//register event handler
WiFi.onEvent(WiFiEvent);
//Initiate connection
WiFi.begin(ssid, pwd);
Serial.println("Waiting for WIFI connection...");
}*/
//wifi event handler
void WiFiEvent(WiFiEvent_t event) {
switch (event) {
case SYSTEM_EVENT_STA_GOT_IP:
//When connected set
Serial.print("WiFi connected! IP address: ");
Serial.println(WiFi.localIP());
Serial.print("ESP Mac Address: "); Serial.println(WiFi.macAddress());
//initializes the UDP state
//This initializes the transfer buffer
udp.begin(WiFi.localIP(), udpPort);
connected = true;
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("WiFi lost connection");
connected = false;
//connected がfalseになった時はdelay(5000)後ESP.restart()している
for(int i = 0; i <= 5; i++){
digitalWrite(2, HIGH);
delay(700);
digitalWrite(2, LOW);
delay(300);
}
ESP.restart();
default: break;
}
}
スケッチ作例を公開している方々へ感謝します。