본문 바로가기
Computer Science/Server & Network

[아두이노] WIFI 모듈 (esp8266)

by Hwan,. 2016. 12. 24.
728x90
반응형

1. 목적

 esp8266을 사용하여 아두이노와 PC가 WiFi, Socket을 사용하여 TCP로 데이터를 주고 받음

 

2. 설명

 1) 만들 것 : 와이파이로 연결된 TCP/IP Client (Python)와 Server (esp8266)

 2) 재료 : esp8266, 아두이노 UNO, FTDI

esp8266
아두이노 UNO
FTDI

 

  3) 회로

    - 펌웨어 업로드 : esp8266의 통신속도를 늦춰주기 위해서 115200 -> 9600 (SoftwareSerial 라이브러리 사용위함)

1. esp의 RX는 FTDI의 TX와 TX는 RX와 연결

2. vcc는 3.3v

3. 펌웨어와 업로드 프로그램은 아래 참고 링크 참조.

 참고 : http://kocoafab.cc/tutorial/view/592

 

- UNO-esp8266 : arduino-esp8266-master 라이브러리 사용

1. 코드 내에서 Rx, Tx 할당한 핀에 연결, (RX-TX, TX-RX로 연결하면됨)

2. vcc는 3.3v

라이브러리 다운 : https://github.com/Diaoul/arduino-ESP8266

참고 : http://m.blog.naver.com/damtaja/220311412393

 

3. 코드

<Client>

# python 버전은 2.7.13
import socket

HOST = '' # esp8266에 접속후 ipconfig 명령을 통해 알아낸 게이트웨이의 주소를 입력하면됨. ex) 192.168.4.1
PORT = 4000 # 정해둔 포트 사용

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
print 'socket created'

HOST = raw_input("IP: ")

s.connect((HOST, PORT))
print 'connet success'

while 1:
    data = raw_input("data :")
    s.send(data)
    print 'send success'

s.close()

 

<Server>

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

SoftwareSerial esp8266Serial = SoftwareSerial(10, 11); // 10번 11번을 rx tx로 설정함. (TIMEOUT 뜨면 아두이노에 연결한 rx tx 핀을 바꿔서 껴볼 것)
ESP8266 wifi = ESP8266(esp8266Serial);

void setup()
{
    Serial.begin(9600);

    // ESP8266
    esp8266Serial.begin(9600);
    wifi.begin();
    wifi.setTimeout(1000);

    /******        WiFi commands       ******/
    // setWifiMode
    Serial.print("setWifiMode: ");
    Serial.println(getStatus(wifi.setMode(ESP8266_WIFI_ACCESSPOINT))); // ESP를 AP로 사용

    // setAPConfiguration
    Serial.print("setAPConfiguration: ");
    Serial.println(getStatus(wifi.setAPConfiguration("ESP8266", "awesomelib", 10, ESP8266_ENCRYPTION_WPA_WPA2_PSK))); // SSID 이름, 비밀번호, 채널, 암호화방식 설정
    wifi.restart();

    // getAPConfiguration
    char ssid[32] = {};
    char password[63] = {};
    uint8_t channel;
    ESP8266Encryption encryption;

    wifi.getAPConfiguration(ssid, password, channel, encryption);
    
    Serial.print("getAPConfiguration: ");
    Serial.print(ssid);
    Serial.print(", pw: ");
    Serial.print(password);
    Serial.print(", ch: ");
    Serial.print(channel);
    Serial.print(", encrypt: ");
    Serial.println(encryption);//*/

    // setDHCP
    Serial.print("setDHCP STA: ");
    Serial.println(getStatus(wifi.setDHCP(ESP8266_WIFI_STATION, false)));
    Serial.print("setDHCP AP: ");
    Serial.println(getStatus(wifi.setDHCP(ESP8266_WIFI_ACCESSPOINT, true)));//*/

    // getIP
    IPAddress ip;
    Serial.print("getIP STA: ");
    Serial.print(getStatus(wifi.getIP(ESP8266_WIFI_STATION, ip)));
    Serial.print(" : ");
    Serial.println(ip);
    Serial.print("getIP AP: ");
    Serial.print(getStatus(wifi.getIP(ESP8266_WIFI_ACCESSPOINT, ip)));
    Serial.print(" : ");
    Serial.println(ip);//*/

    /****************************************/
    /******       TCP/IP commands      ******/
    /****************************************/
    // setMultipleConnections
    Serial.print("setMultipleConnections: ");
    Serial.println(getStatus(wifi.setMultipleConnections(true)));

    // createServer
    Serial.print("createServer: ");
    Serial.println(getStatus(wifi.createServer(4000)));
}

int power=0;

void loop()
{
	// Wi-Fi Command
    // getConnectedStations -> esp8266이 AP모드일 때 연결된 장비들 보여줌
    /*
    ESP8266Station stations[5];
    unsigned int stationCount;
    
    Serial.print("getConnectedStations: ");
    Serial.print(getStatus(wifi.getConnectedStations(stations, stationCount, 5)));
    Serial.print(" : ");
    Serial.println(stationCount);
    
    for (uint8_t i = 0; i < stationCount; i++) {
      Serial.print(" - ");
      Serial.print(stations[i].ip);
      Serial.print(" - ");
      for (uint8_t j = 0; j < 6; j++) {
        Serial.print(stations[i].mac[j], HEX);
        if (j < 5)
          Serial.print(":");
      }
      Serial.println();
    }
    delay(1000);
    */

    /****************************************/
    /******       TCP/IP commands      ******/
    /****************************************/
    // getConnectionStatus -> TCP 연결된 기기들 주소 보여줌
    /*
    ESP8266Connection connections[5];
    unsigned int connectionCount;
    
    Serial.print("getConnectionStatus: ");
    Serial.print(getStatus(wifi.getConnectionStatus(connectionStatus, connections, connectionCount)));
    Serial.print(" : ");
    Serial.println(connectionCount);
    
    for (int i = 0; i < connectionCount; i++) {
      Serial.print(" - Connection: ");
      Serial.print(connections[i].id);
      Serial.print(" - ");
      Serial.print(getProtocol(connections[i].protocol));
      Serial.print(" - ");
      Serial.print(connections[i].ip);
      Serial.print(":");
      Serial.print(connections[i].port);
      Serial.print(" - ");
      Serial.println(getRole(connections[i].role));
    }
    
    delay(5000);
    
    // 데이터 읽어옴
    unsigned int id;
    int length;
    int totalRead;
    char buffer[11] = {};

    if ((length = wifi.available()) > 0) {
      id = wifi.getId();
      totalRead = wifi.read(buffer, 10);

      if (length > 0) {
        Serial.print("Received ");
        Serial.print(totalRead);
        Serial.print("/");
        Serial.print(length);
        Serial.print(" bytes from client ");
        Serial.print(id);
        Serial.print(": ");
        Serial.println((char*)buffer);
      }
    }*/
}

String getStatus(bool status)
{
    if (status)
        return "OK";

    return "KO";
}

String getStatus(ESP8266CommandStatus status)
{
    switch (status) {
    case ESP8266_COMMAND_INVALID:
        return "INVALID";

    case ESP8266_COMMAND_TIMEOUT:
        return "TIMEOUT";

    case ESP8266_COMMAND_OK:
        return "OK";

    case ESP8266_COMMAND_NO_CHANGE:
        return "NO CHANGE";

    case ESP8266_COMMAND_ERROR:
        return "ERROR";

    case ESP8266_COMMAND_NO_LINK:
        return "NO LINK";

    case ESP8266_COMMAND_TOO_LONG:
        return "TOO LONG";

    case ESP8266_COMMAND_FAIL:
        return "FAIL";

    default:
        return "UNKNOWN COMMAND STATUS";
    }
}

String getRole(ESP8266Role role)
{
    switch (role) {
    case ESP8266_ROLE_CLIENT:
        return "CLIENT";

    case ESP8266_ROLE_SERVER:
        return "SERVER";

    default:
        return "UNKNOWN ROLE";
    }
}

String getProtocol(ESP8266Protocol protocol)
{
    switch (protocol) {
    case ESP8266_PROTOCOL_TCP:
        return "TCP";

    case ESP8266_PROTOCOL_UDP:
        return "UDP";

    default:
        return "UNKNOWN PROTOCOL";
    }
}

 

 cf. 라이브러리 기본 샘플 코드를 그대로 사용함, 라이브러리는 내부적으로 AT 커맨드를 사용함.

728x90
반응형

댓글