본문 바로가기

프로그래밍/Arduino

Wifi모듈(ESP8266) 사용법(3) - arduino-ESP8266 라이브러리를 사용하여 연결

0. arduino-ESP8266  라이브러리 사용에 앞서서..
  - 아두이노 라이브러리는 AT커맨드를 사용하게 쉽게 조합해 놓은 코드.
  - 따라서, AT커맨드를 알면 더 쉽게 사용할 수 있음.


1. arduino-ESP8266 라이브러리 다운로드.
  - 라이브러리 다운로드 후 Arduino/libraries 폴더에 저장



2. ESP8266과 아두이노 연결 및 입·출력 프로세스(SoftwareSerial)
  - 아두이노 UNO는 하드웨어와 통신하는 예약 
Serial포트(D0, D1)만 있음.
  - 라이브러리 사용을 위해 SoftwareSerial을 사용하여 ESP8266과 통신.
  - ESP8266, 아두이노 연결: AT커맨드 사용을 위한 연결에서 RX, TX만 변경

ESP8266

아두이노

RX

SoftwareSerial에서 지정한 TX

TX

SoftwareSerial에서 지정한 RX

VCC

3.3V

CH_PD

3.3V

GND

GND

GPIO0


GPIO2


RST 

 


  - 코드를 통한 커맨드 입력 프로세스
    ① 아두이노 IDE 코드를 통해 명령어 입력
    ② 코드를 통해 입력한 명령어는 SoftwareSerial의 TX를 통해 송신
    ③ 송신한 명령어는 ESP8266의 RX로 수신

    ④ 수신한 명령어에 해당하는 작업을 ESP8266에서 처리.


  - 결과값 출력 프로세스

    ① ESP8266에서 작업 처리 완료.
    ② 작업 처리 결과값을 ESP8266의 RX를 통해 송신
    ③ 송신한 결과값은 SoftwareSerial의 RX를 통해 수신

    ④ 수신한 결과값을 아두이노 IDE에서 처리하여 Serial Monitor로 출력.

  - 주의할 점
    송신(SoftwareSerial
)  수신(ESP8266), 송신(ESP8266) → 수신(SoftwareSerial)
    서로의 RX↔TX로 연결해줘야 함.



3. 웹 서버 코드
  - 웹 서버는 요즘 간간히 공부하는 Node.js + express를 사용하여 구성해 봄.

var express = require('express');
var http = require('http');
var path = require('path');
var bodyParaser = require('body-parser');

var app = express();

app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParaser.urlencoded({extended: true}));

app.get('/process/login', function(req, res) {	
	var paramId = req.param('id');
	
	console.log('/precess/login 처리, id: '+ paramId);

	res.write("Success");
	res.end();
});

http.createServer(app).listen(3000, function() {
	console.log('Express 서버가 3000번 포트에서 시작됨.');
});

<웹 서버 구축 코드>


<웹서버 동작 확인(출력 값 Success)>



3. 아두이노 코드(제공하는 예제 코드)

#include <softwareserial.h> //SoftwareSerial 사용을 위함
#include <esp8266.h>        //다운 후 libraries폴더에 저장한 라이브러리

//SoftwareSerial(RX, TX)
//RX(D2): ESP8266의 TX 연결
//TX(D3): ESP8266의 RX 연결
SoftwareSerial esp8266Serial = SoftwareSerial(2, 3); 
ESP8266 wifi = ESP8266(esp8266Serial);

#define SSID "AP SSID"
#define PWD "AP PWD"
#define IP "접근할 웹서버 IP"

void setup()
{
  Serial.begin(9600);
  esp8266Serial.begin(9600);  // ESP8266

  wifi.begin();
  wifi.setTimeout(1000);

  /****************************************/
  /******       Basic commands       ******/
  /****************************************/
  // test
  Serial.print("test: ");
  Serial.println(getStatus(wifi.test()));

  // restart
  Serial.print("restart: ");
  Serial.println(getStatus(wifi.restart()));

  // getVersion
  char version[16] = {};
  Serial.print("getVersion: ");
  Serial.print(getStatus(wifi.getVersion(version, 16)));
  Serial.print(" : ");
  Serial.println(version);

  /****************************************/
  /******        WiFi commands       ******/
  /****************************************/
  // setWifiMode
  Serial.print("setWifiMode: ");
  Serial.println(getStatus(wifi.setMode(ESP8266_WIFI_STATION)));

  // quitAP
  Serial.print("quitAP: ");
  Serial.println(getStatus(wifi.quitAP()));

  // joinAP
  Serial.print("joinAP: ");
  Serial.println(getStatus(wifi.joinAP(SSID, PWD)));

  // getAP
  Serial.print("getAP: ");
  Serial.println(getStatus(wifi.getAP(SSID)));

  /****************************************/
  /******       TCP/IP commands      ******/
  /****************************************/
  // connect with webserver 
  Serial.print("connect: ");
  Serial.println(getStatus(wifi.connect(ESP8266_PROTOCOL_TCP, IPAddress(10, 15, 0, 136), 3000)));
  getConnectionStatue(wifi);

  // send to webserver
  Serial.print("send: ");
 // 2줄을 띄워줘야 함(\r\n\r\n)
  Serial.println(getStatus(wifi.send("GET /process/login?id=inbin HTTP/1.0\r\n\r\n")));
}

void loop()
{
  // read data
  unsigned int id;
  int length;
  int totalRead;
  char buffer[11] = {};
  if ((length = wifi.available()) > 0) {
    id = wifi.getId();
    totalRead = wifi.read(buffer, 1000);
    if (length > 0) {
      Serial.println((char*)buffer);
    }
  }
}

void getConnectionStatue(ESP8266 wifi) {
  // getConnectionStatus
  ESP8266ConnectionStatus connectionStatus;
  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));
  }
}

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

  return "KO";
}

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

    case ESP8266_COMMAND_TIMEOUT:
      return "TIMEOUT";
      break;

    case ESP8266_COMMAND_OK:
      return "OK";
      break;

    case ESP8266_COMMAND_NO_CHANGE:
      return "NO CHANGE";
      break;

    case ESP8266_COMMAND_ERROR:
      return "ERROR";
      break;

    case ESP8266_COMMAND_NO_LINK:
      return "NO LINK";
      break;

    case ESP8266_COMMAND_TOO_LONG:
      return "TOO LONG";
      break;

    case ESP8266_COMMAND_FAIL:
      return "FAIL";
      break;

    default:
      return "UNKNOWN COMMAND STATUS";
      break;
  }
}

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

    case ESP8266_ROLE_SERVER:
      return "SERVER";
      break;

    default:
      return "UNKNOWN ROLE";
      break;
  }
}

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

    case ESP8266_PROTOCOL_UDP:
      return "UDP";
      break;

    default:
      return "UNKNOWN PROTOCOL";
      break;
  }
}



4. 결과
  - Serial Monitor에서 출력되는 결과(response: Success)


  - ESP8266에서 request 날릴 경우 서버단에 찍히는 로그 확인