ESP-wroom-02(ESP8266)2台を使ってルーター経由でWiFiUDP通信をしようとしています。
(将来的にやりたいこととしては、無線でPCから数メートル先にあるセンサからセンサ値を取得し、その値に応じてPCで処理を行った後、また他の無線で接続されたオブジェクトのモーターを動かそうと思っています。)
こちらのリンクをコピペ(下のコード)で動かした所、ボタン入力からclient側でUDP.writeが正しく行われていることは確認できました。しかし、Server側で適宜printしてデバッグしたところ、UD.ParsePacket()=0になっており、rcvWiFiのループに入れていませんでした。
受信に失敗しているようですが、原因が思い当たりません。どなたか原因のわかる方がいらっしゃいましたらご教授いただけますと幸いです。
Client側コード
arduino
1#include <ESP8266WiFi.h> 2#include <WiFiClient.h> 3#include <WiFiUDP.h> 4 5// UDP settings 6WiFiUDP UDP; 7 8// WiFi settings 9IPAddress HOSTIP (192, 168, 4, 1); 10IPAddress myIP(192, 168, 4, 2); 11const char *ssid = "*"; 12const char *password = "*"; 13 14const int btn1 = 4; 15const int btn2 = 5; 16const int btn3 = 12; 17const int btn4 = 2; 18 19const int ledPin = 16; 20const int wifiStatusPin = 13; 21 22void connectWiFi() { 23 WiFi.begin(ssid, password); 24 WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask()); 25 26 Serial.println("start_connect"); 27 while (WiFi.status() != WL_CONNECTED) { 28 delay(500); 29 Serial.print("."); 30 } 31 Serial.println("CONNECTED!"); 32 digitalWrite(wifiStatusPin, HIGH); 33} 34 35void setup() { 36 Serial.begin(115200); 37 38 pinMode(ledPin, OUTPUT); 39 pinMode(wifiStatusPin, OUTPUT); 40 41 pinMode(btn1, INPUT_PULLUP); 42 pinMode(btn2, INPUT_PULLUP); 43 pinMode(btn3, INPUT_PULLUP); 44 pinMode(btn4, INPUT_PULLUP); 45 46 delay(500); 47 digitalWrite(ledPin, HIGH); 48 49 Serial.println("-"); 50 Serial.println("start"); 51 WiFi.mode(WIFI_STA);//重要! 52 UDP.begin(893); 53 connectWiFi(); 54} 55 56void sendWiFi(char byteData[]) { 57 if (UDP.beginPacket(HOSTIP, 893)) { 58 UDP.write(byteData); 59 UDP.endPacket(); 60 Serial.println(byteData); 61 } 62} 63 64void loop() { 65 char b[4]; 66 b[0] = (digitalRead(btn1)) ? '1' : '0'; 67 b[1] = (digitalRead(btn2)) ? '1' : '0'; 68 b[2] = (digitalRead(btn3)) ? '1' : '0'; 69 b[3] = (digitalRead(btn4)) ? '1' : '0'; 70 Serial.println(b); 71 72 sendWiFi(b); 73 74 delay(17); 75 end_loop(); 76} 77 78void end_loop(){ 79 if (WiFi.status() != WL_CONNECTED) { 80 WiFi.disconnect(); 81 digitalWrite(wifiStatusPin, LOW); 82 Serial.println("disconnect!"); 83 connectWiFi(); 84 } 85}
Server側コード
Arduino
1#include <ESP8266WiFi.h> 2#include <WiFiClient.h> 3#include <WiFiUDP.h> 4 5// Variable setting 6char WiFibuff[4]; 7 8// UDP setting 9WiFiUDP UDP; 10 11// WiFi setting 12IPAddress myIP(192, 168, 4, 1); 13const char *ssid = "*"; 14const char *password = "*"; 15 16//led 17const int ledPin = 16; 18const int led1 = 4; 19const int led2 = 5; 20const int led3 = 12; 21const int led4 = 2; 22 23void setup() { 24 Serial.begin(115200); 25 26 pinMode(ledPin, OUTPUT); 27 pinMode(led1, OUTPUT); 28 pinMode(led2, OUTPUT); 29 pinMode(led3, OUTPUT); 30 pinMode(led4, OUTPUT); 31 32 WiFi.mode(WIFI_AP); 33 WiFi.softAP(ssid, password); 34 WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask()); 35 UDP.begin(893); 36 37 digitalWrite(ledPin, HIGH); 38 Serial.println("UDP.begin!"); 39} 40 41void rcvWiFi() { 42 UDP.read(WiFibuff, 4); 43 Serial.print(WiFibuff); 44 UDP.flush(); 45} 46 47void loop() { 48 if (UDP.parsePacket() > 0) { 49 rcvWiFi(); 50 51 if(WiFibuff[0] == '0') { digitalWrite(led1, HIGH); } else { digitalWrite(led1, LOW); } 52 if(WiFibuff[1] == '0') { digitalWrite(led2, HIGH); } else { digitalWrite(led2, LOW); } 53 if(WiFibuff[2] == '0') { digitalWrite(led3, HIGH); } else { digitalWrite(led3, LOW); } 54 if(WiFibuff[3] == '0') { digitalWrite(led4, HIGH); } else { digitalWrite(led4, LOW); } 55 } 56}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/31 16:29