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 날릴 경우 서버단에 찍히는 로그 확인
'프로그래밍 > Arduino' 카테고리의 다른 글
Wifi모듈(ESP8266) 사용법(2) - AT커맨드 사용하여 와이파이에 접근 (0) | 2017.07.05 |
---|---|
Wifi모듈(ESP8266) 사용법(1) - 펌웨어 업데이트 하기(MAC) (0) | 2017.07.04 |
가변저항으로 servo모터 움직이기 (0) | 2017.04.20 |
servo모터 자동으로 움직이기 (0) | 2017.04.20 |
버튼스위치로 숫자 변경하기 (0) | 2017.04.20 |