두 개의 Arduino에서 Wi-Fi 통신을 시도했습니다.

10033 단어 wroom02ArduinoWi-Fi

소개



두 개의 Arduino를 사용하여 Wi-Fi 통신을했습니다.

목차



1. 사용한 것
2. 환경 설정
3. 코드
4. 결과

사용한 것



Arduino UNO
ESP-Wroom 02 (스위치 사이언스로 심플판을 구입했습니다)
콘덴서 0.1μF
컨버터
3 단자 레귤레이터 3.3V
10KΩ 저항 3개
이것을 다음과 같이 연결하십시오.



Wroom에 공급하는 전원에 직접 3.3v의 단자에서 당기지 않는 것은, 전력 부족이 되기 때문이었던 것 같습니다.
5V에서 당겨 전압을 변경하여 공급합시다.
각 회로의 연결 방법은 Wroom의 설명서에 기재되어 있습니다. (저항을 끼우고 연결하도록 ... 등)

환경설정



wroom02를 설정합니다.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); // RX, TX
//この部分でArduinoのRXピンをWroomからのデータ受信に、3ピンをWroomへのデータ送信に定義
void setup()
{
  Serial.begin(115200);
 //PCとArduinoの通信を115200bpsに設定
  mySerial.begin(115200);
 //wroom-Arduinoの通信を115200bpsに設定(wroomの通信速度がデフォルトで115200bpsなので)
}
void loop()
{
  if(mySerial.available())
  Serial.write(mySerial.read());
  if (Serial.available())
  mySerial.write(Serial.read());
}

이 상태에서 시리얼 모니터를 엽니다.
이제 Wroom의 통신 속도를 변경합니다.
AT+UART_DEF=9600,8,1,0,0

이제 wroom02의 통신 속도를 9600bps로 변경했습니다. 이보다 빠르면 동작이 불안정해지는 것 같기 때문에 앞으로는 이 속도로 통신을 실시합니다.

다음으로 통신용 라이브러리를 준비합니다.
ESP8266과 Arduino를 통신하는 라이브러리를 다운로드합니다.
htps : // 기주 b. 코 m / 어 d / 어 D ぃ B_ 아 r 즈의 _ 우에에 SP8266
이 파일의 ESP8266.h의 27 행
 #define ESP8266_USE_SOFTWARE_SERIAL

합니다.
이것으로 설정이 끝납니다.

코드



네트워크, 코드 설명



서버측, 클라이언트측에서 2개 준비합니다.
네트워크는 사진의 것을 가정합니다

여기서, 클라이언트, 서버 통신을 실시할 때에, 서버측의 IP 주소를 파악할 필요가 있습니다.
필요한 경우 서버 측에서 결정한 장치의 IP 주소를 고정으로 할당합니다.
DHCP를 사용하여 동적으로 할당하지 않도록 클라이언트 측은 IP 주소를 지정하여 패킷을 보냅니다.
따라서 DHCP를 사용하는 경우 IP 주소가 매번 바뀌고 코드를 다시 작성해야합니다.
IP 주소는 192.168.11.0 등에 액세스하여 설정하십시오.

코드주의



이 프로그램의 통신 순서는
① 클라이언트가 서버로 데이터 전송
② 서버가 수신했음을 알리는 데이터를 클라이언트에 전송
라는 절차를 밟고 있습니다.
때때로 데이터를 전송해도 수신되지 않은 상태가 발생합니다. 따라서 연속적으로 통신을 수행하면 양쪽이 수신 대기 상태가 되어 데트락이 발생할 수 있습니다.
sync라는 함수는 동기화를 취하는 부분입니다. 없어도 괜찮습니다.
센서 값에서 데이터를 얻는 것과 같은 것을 생각한다면 클라이언트는 보내지 않고 서버는 수신을 꽉 잡아야한다고 생각합니다.

코드



server.ino
 #include "ESP8266.h"
 #define SSID "自分が使うアクセスポイント"
 #define PASSWORD "パスワード"
 #define BAUD_RATE   9600
 #define HOST_PORT (8090)

SoftwareSerial mySerial(2, 3); 
ESP8266 wifi(mySerial);

void setupESP8266()
{
  while (1) {
    Serial.print("restaring esp8266...");
    if (wifi.restart()) {
      Serial.print("ok\r\n");
      break;
    }
    else {
      Serial.print("not ok...\r\n");
      Serial.print("Trying to kick...");
      while (1) {
        if (wifi.kick()) {
          Serial.print("ok\r\n");
          break;
        }
        else {
          Serial.print("not ok... Wait 5 sec and retry...\r\n");
          delay(5000);
        }
      }
    }
  }

  Serial.print("setup begin\r\n");
  Serial.print("FW Version:");
  Serial.println(wifi.getVersion().c_str());

  while (1) {
    if (wifi.setOprToStation()) {
      Serial.print("to station ok\r\n");
      break;
    }
    else {
      Serial.print("to station err\r\n");
      Serial.println("Wait 5 seconds and try again...");
      delay(5000);
    }
  }

  while (1) {
    if (wifi.joinAP(SSID, PASSWORD)) {
      Serial.print("Join AP success\r\n");
      break;
    }
    else {
      Serial.print("Join AP failure\r\n");
      Serial.println("Wait 5 seconds and try again...");
      delay(5000);
    }
  }
  Serial.print("setup end\r\n");
}

void setup(void)
{
  Serial.begin(BAUD_RATE);
  setupESP8266();

  if (wifi.enableMUX()) {
    Serial.print("multiple ok\r\n");
  } else {
    Serial.print("multiple err\r\n");
  }

  if (wifi.startTCPServer(HOST_PORT)) {
    Serial.print("start tcp server ok\r\n");
  } else {
    Serial.print("start tcp server err\r\n");
  }

  if (wifi.setTCPServerTimeout(600)) {
    Serial.print("set tcp server timout 10 seconds\r\n");
  } else {
    Serial.print("set tcp server timout err\r\n");
  }

  Serial.print("setup end\r\n");
}

void loop(void)
{
  uint8_t buffer[128] = {0};//送りたい文字
  uint8_t mux_id;
  uint32_t len;
  int val;
  char val2[5];
  len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
  val =wifi.recv(&mux_id,val2,sizeof(val2),100);
  //&mux_id is a TCP id(which TCP send the data),buffer is storing place.
  //return the length of received data
  if (len > 0) {
    Serial.print("Status:[");
    Serial.print(wifi.getIPStatus().c_str());
    Serial.println("]");

    Serial.print("Received from :");
    Serial.print(mux_id);
    Serial.print("[");
    for (uint32_t i = 0; i < len; i++) {
      Serial.print((char)buffer[i]);
    }
    for(uint32_t j=0;j<val;j++){
    Serial.print((char)val2[j]);
    }
    Serial.print("]\r\n");

    if (wifi.send(mux_id, buffer, len)) {
      delay(3000);
      Serial.print("send back ok\r\n");
    } else {
      delay(3000);
      Serial.print("send back err\r\n");
    }

    if (wifi.releaseTCP(mux_id)) {
      Serial.print("release tcp ");
      Serial.print(mux_id);
      Serial.println(" ok");
    } else {
      Serial.print("release tcp");
      Serial.print(mux_id);
      Serial.println(" err");
    }

    Serial.print("Status:[");
    Serial.print(wifi.getIPStatus().c_str());
    Serial.println("]");
  }
}

client.ino
#include "ESP8266.h"
#include <SoftwareSerial.h>

#define SSID "自分のアクセスポイント"
#define PASSWORD "アクセスポイントのパスワード"
#define HOST_NAME   "サーバーに割り当てたIPアドレス"
#define HOST_PORT   (8090)
#define BAUD_RATE   9600

SoftwareSerial mySerial(2, 3); /* RX:D3, TX:D2 */
ESP8266 wifi(mySerial,BAUD_RATE);
void sync(ESP8266 wifi){
  static uint8_t thisid=0;
  char* synctime="s";
  char* synctimerec;
   if(wifi.send(thisid, synctime, sizeof(synctime))){
    Serial.println("send success");
   }
  Serial.println("sync strat");
   if(wifi.recv(thisid, synctimerec, sizeof(synctimerec), 100)){
    Serial.println((char)synctimerec);
    Serial.println("sync end");
   }

}
void setupESP8266()
{
  while (1) {
    Serial.print("restaring esp8266...");
    if (wifi.restart()) {
      Serial.print("ok\r\n");
      break;
    }
    else {
      Serial.print("not ok...\r\n");
      Serial.print("Trying to kick...");
      while (1) {
        if (wifi.kick()) {
          Serial.print("ok\r\n");
          break;
        }
        else {
          Serial.print("not ok... Wait 5 sec and retry...\r\n");
          delay(5000);
        }
      }
    }
  }

  Serial.print("setup begin\r\n");
  Serial.print("FW Version:");
  Serial.println(wifi.getVersion().c_str());

  while (1) {
    if (wifi.setOprToStation()) {
      Serial.print("to station ok\r\n");
      break;
    }
    else {
      Serial.print("to station err\r\n");
      Serial.println("Wait 5 seconds and try again...");
      delay(5000);
    }
  }

  while (1) {
    if (wifi.joinAP(SSID, PASSWORD)) {
      Serial.print("Join AP success\r\n");
      break;
    }
    else {
      Serial.print("Join AP failure\r\n");
      Serial.println("Wait 5 seconds and try again...");
      delay(5000);
    }
  }
  Serial.print("setup end\r\n");
}

void setup(void)
{

  Serial.begin(BAUD_RATE);
  setupESP8266();
  if (wifi.enableMUX()) {
    Serial.print("multiple ok\r\n");
  } else {
    Serial.print("multiple err\r\n");
  }

  Serial.print("setup end\r\n");
}

void loop(void)
{
  uint8_t buffer[128] = {0};
  static uint8_t mux_id = 0;
   uint8_t val=analogRead(0);
   uint8_t sensor[2];
   sensor[0]='d';
   sensor[1]=val;
  if (wifi.createTCP(mux_id, HOST_NAME, HOST_PORT)) {
    Serial.print("create tcp ");
    Serial.print(mux_id);
    Serial.println(" ok");
    sync(wifi);
  } else {
    Serial.print("create tcp ");
    Serial.print(mux_id);
    Serial.println(" err");
  }



  char *hello = "mHello, this is client!";
  if (wifi.send(mux_id, (const uint8_t*)hello, strlen(hello))) {
    delay(1000);
    Serial.println("send ok");
  } else {
    delay(1000);
    Serial.println("send err");
  }

  uint32_t len = wifi.recv(mux_id, buffer, sizeof(buffer), 10000);
  if (len > 0) {
    Serial.print("Received:[");
    for (uint32_t i = 0; i < len; i++) {
      Serial.print((char)buffer[i]);
    }
    Serial.print("]\r\n");
    wifi.send(mux_id, (const uint8_t*)sensor, strlen(sensor));
  }

  if (wifi.releaseTCP(mux_id)) {
    Serial.print("release tcp ");
    Serial.print(mux_id);
    Serial.println(" ok");
  } else {
    Serial.print("release tcp ");
    Serial.print(mux_id);
    Serial.println(" err");
  }

  delay(3000);
  mux_id++;
  if (mux_id >= 1) {
    mux_id = 0;
  }
}

참고



htps // // cs. 메아아/엔트리/10457/
ぢ tp : // ぢsせぅ. wp. x 두건. jp / 아 r 즈이 / 에스 푸 w 로오 m 02_c ぃ 엔 t /

좋은 웹페이지 즐겨찾기