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>
import socket
HOST = ''
PORT = 4000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
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 );
ESP8266 wifi = ESP8266 (esp8266Serial);
void setup ()
{
Serial.begin (9600 );
esp8266Serial.begin (9600 );
wifi.begin ();
wifi.setTimeout (1000 );
Serial.print ("setWifiMode: " );
Serial.println (getStatus (wifi.setMode (ESP8266_WIFI_ACCESSPOINT)));
Serial.print ("setAPConfiguration: " );
Serial.println (getStatus (wifi.setAPConfiguration ("ESP8266" , "awesomelib" , 10 , ESP8266_ENCRYPTION_WPA_WPA2_PSK)));
wifi.restart ();
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);
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 )));
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);
Serial.print ("setMultipleConnections: " );
Serial.println (getStatus (wifi.setMultipleConnections (true )));
Serial.print ("createServer: " );
Serial.println (getStatus (wifi.createServer (4000 )));
}
int power=0 ;
void loop ()
{
}
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 커맨드를 사용함.