728x90
반응형
맨 위로 올라가기
ESP8266 이란?

 

ESP8266은 Espressif System에서 개발한 저렴하고 소형의 Wi-Fi 모듈 및 MicroControllerUnit이다.
이 모듈은 무선 통신 기능을 갖추고 있어 다양한 무선 프로젝트 및 인터넷 연결 디바이스에 적합하다.

ESP8266은 저전력 소비, 저렴한 가격, 강력한 성능, 오픈 소스 코드 및 커뮤니티의 지원으로 인기가 많다.

ESP8266 모듈은 주로 아두이노와 같은 플랫폼에서 프로그래밍되며, 많은 코드 및 라이브러리가 이 모듈을 지원한다.
이 모듈을 사용하면 Wi-Fi 연결이 필요한 다양한 프로젝트를 구현할 수 있다.
예를 들어 스마트 홈 기기, IoT(Internet of Things) 장치, 원격 제어시스템, 센서 네트워크 등이 있다.

ESP8266은 여러가지 모델과 버전이 있으며,
ESP-01, ESP-12, ESP-32 등이 널리 사용되는 것 중 일부이다.
이러한 모듈은 다양한 핀 구성과 기능을 제공하므로 프로젝트에 맞게 선택할 수 있다.


ESP8266 Library

 

ESP8266 모듈을 사용하는 아두이노 기반 프로젝트를 개발할 때 유용한 일부 라이브러리이며
각 프로젝트 목적에 따라 필요한 라이브러리를 선택하여 사용할 수 있다.
라이브러리는 Arduino IDE의 라이브러리 관리자를 통해 쉽게 설치하고 사용할 수 있다.

 

  • ESP8266WiFi 라이브러리:
    • 기능: Wi-Fi 네트워크에 연결하고 관리하는 기능을 제공한다.
    • 활용 예시: Wi-Fi 연결, 웹 서버 및 클라이언트, MQTT 통신 등의 프로젝트에 사용된다.
    • 참고: 아두이노 IDE에서 기본으로 제공되는 라이브러리 중 하나이다.
  • PubSubClient 라이브러리:
    • 기능: MQTT 프로토콜을 사용하여 메시지 브로커와 통신하기 위한 클라이언트를 제공한다.
    • 활용 예시: IoT 프로젝트에서 메시지 브로커와 통신할 때 사용된다.
  • ArduinoJson 라이브러리:
    • 기능: JSON 데이터의 파싱 및 생성을 지원한다.
    • 활용 예시: 웹 API와 통신하거나, 구조화된 데이터를 다룰 때 사용된다.
  • DHT 라이브러리:
    • 기능: DHT 시리즈 센서를 통해 온도 및 습도 값을 읽어오는 기능을 제공한다.
    • 활용 예시: 환경 모니터링 및 제어 시스템에서 사용된다.
  • Wire 라이브러리:
    • rlsmd: I2C 통신을 위한 라이브러리로, 여러 디바이스 간에 데이터를 교환할 때 사용된다.
    • 활용 예시: 센서 및 외부 장치와의 통신에 사용된다.
  • ESP8266HTTPClient 라이브러리:
    • 기능: HTTP 클라이언트를 구현하여 웹 서버와 통신하는 기능을 제공한다.
    • 활용 예시: 웹 API 호출, 웹 서버와 데이터 교환 등에 사용된다.

ESP8266 라이브러리 초기 설정

 

Preference →  Settings →  Additional boards manager URLs (https://arduino.esp8266.com/stable/package_esp8266com_index.json)
Tools → Board  → Boards Manager(Ctrl+Shift+B)
esp8266 Install
NodeMCU Devkit 1.0 사용시 NodeMCU 1.0(ESP-12E Module) 선택


ESP8266 라이브러리 활용

 

 

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

const char* host = "192.168.1.1";  // TCP 서버의 IP 주소
const uint16_t port = 3000;         // TCP 서버의 포트 번호

ESP8266WiFiMulti WiFiMulti;

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

  // WiFi 연결을 위해 모드 설정 및 AP (접속점) 추가
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, password);

  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi... ");

  // WiFi 연결 대기
  while (WiFiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  delay(500);
}

void loop() {
  Serial.print("connecting to ");
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);

  // WiFiClient 클래스를 사용하여 TCP 연결 생성
  WiFiClient client;

  // 서버에 연결 시도
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    Serial.println("wait 5 sec...");
    delay(5000);
    return;
  }

  // 서버에 문자열 전송
  client.println("hello from ESP8266");

  // 서버로부터 한 줄 읽기
  Serial.println("receiving from remote server");
  String line = client.readStringUntil('\r');
  Serial.println(line);

  // 연결 닫기
  Serial.println("closing connection");
  client.stop();

  Serial.println("wait 5 sec...");
  delay(5000);
}

 

위 코드는 ESP8266을 사용하여 Wi-Fi 네트워크에 연결하고, 지정된 IP 주소 및 포트 번호의 TCP 서버에 문자열을 보내는 예제이다. 다시 말해 문자열을 TCP 서버에 보내고 한 줄의 응답을 출력한다.로컬 네트워크에서 TCP 서버를 실행해댜 한다. 코드는 Arduino IDE 및 ESP8266 보드 지원을 사용하여 개발된다.

 

*TCP Server는 Hercules utility를 활용하면 된다.

 

이 코드의 주요 기능은 다음과 같다.

 

  1. Wi-Fi 연결 설정:
    'WiFi.mode(WIFI_STA)' 및 'WiFiMulti.addAP(ssid, password)'를 사용하여 Wi-Fi 연결 설정
  2. Wi-Fi 연결 대기:
    'while (WiFimulti.run() != WL_CONNECTED)'를 사용하여 Wi-Fi 연결 성공시 까지 대기
  3. TCP 서버에 연결:
    'WiFiCleint client'를 클래스 객체를 생성하여 지정된 IP주소와 포트 번호의 TCP 서버에 연결 시도
  4. 문자열 전송:
    'client.println("Hello from ESP8266")' 을 사용하여 서버에 해당 문자열 전송
  5. 연결 종료 및 대기:
    연결을 종료하고 5초 대기한 후에 루프 반복

코드 실랭하려면 ESP8266을 Wi-Fi에 연결하고, 지정된 IP 주소와 포트번호에 동작하는 TCP 서버 필요,
이 코드 실행시 ESP8266이 Wi-Fi에 연결하고 지정된 TCP 서버에 "hello from ESP8266" 문자열을 전송하며,
서버로부터의 응답을 Serial Monitor에 출력한다.

 


 

#include <ESP8266WiFi.h>

// Wi-Fi 설정: Wi-Fi 연결에 필요한 SSID와 비밀번호 설정
const char* ssid = "SSID";
const char* password = "password";

// Server 정보 설정: HTTP GET 요청 보낼 서버의 host와 port 설정
const char* host = "google.com"l
const uint16_t port = 80;

void setup()
{
  // Serial 통신 시작
  Serial.begin(115200);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  // Wi-Fi 연결 시도
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  // 연결이 완료될 때까지 대기
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }

  // 연결 성공 시 정보 출력
  Serial.print("WiFi connected\nIP address: ");
  Serial.println(WiFi.localIP());
}

/* 
  - Serial 통신을 시작하고, 지정된 SSID와 비밀번호로 Wi-Fi에 연결을 시도한다.
  - 연결이 완료되면 Wi-Fi의 로컬 IP 주소를 Serial Monitor 에 출력한다.
*/

void loop()
{
  // 정적 변수를 사용하여 한 번만 연결을 시도하도록 함
  static bool watit = false;

  Serial.print("Connecting to ");
  Serial.println(host);

  // Wi-Fi 클라이언트 생성 및 서버에 연결 시도
  WiFiClient client;
  if(!client.connect(host, port))
  {
    Serial.println("connection failed");
    delay(5000);
    return;
  }

  // Server에 데이터 전송
  Serial.println("sending data to server");
  if (client.connected())
  {
    client.print("GET / HTTP/1.1\n");
    client.print("Host : www.google.com\n\n");
  }
  delay(1000);

  // Server로부터 응답 출력
  Serial.println("receiving from remote server");
  while (client.available())
  {
    Serial.print(client.read());
  }
  Serial.println("\nClosing connection");
  client.stop();

  // 한 번만 연결을 시도한 후 30초 대기
  if(wait)
  {
    delay(30000);
  }
  wait = true;
}

 

이 코드는 'google.com' 서버로 간단한 HTTP GET 요청을 보내고 응답을 출력하는 예제이다.

  • 'loop' 함수에서는 한 번만 연결을 시도하기 위해 정적 변수 'wait'를 사용한다.
  • 서버에 연결이 실패하면 "connection failed"를 출력하고 5초 대기한 후 함수를 종료한다.
  • 성공적으로 연결되면 서버로 HTTP GET 요청을 보내고, 서버로부터의 응답을 출력한다.
  • 연결을 닫은 후 'wait' 변수가 'true'로 설정되어 30초 대기하고, 이후에는 루프를 반복하여 다시 연결을 시도한다.
728x90
반응형

+ Recent posts