ESP32와 OLED 디스플레이를 이용한 인터넷 시계
이전 튜토리얼에서는 DS3231과 ESP32를 사용하여 RTC 시계를 만들었습니다 . 하드웨어 요구 사항을 최소화하기 위해 RTC 모듈을 사용하지 않는 인터넷 시계를 만들어 보겠습니다 . 이 인터넷 시계는 RTC 시계보다 더 정확합니다. ESP32는 Wi-Fi 모듈이므로 인터넷에 쉽게 연결할 수 있습니다. 따라서 Wi-Fi를 통해 인터넷에서 시간을 가져오기 위해 NTP(네트워크 시간 프로토콜)와 UDP(사용자 데이터그램 프로토콜)를 사용합니다. 이 인터넷 시계는 IoT 프로젝트를 구축할 때 매우 유용할 수 있습니다.

NTP 서버란 무엇인가요?
네트워크 시간 프로토콜 ( NTP )은 시스템과 데이터 네트워크 간의 시간 동기화에 사용되는 네트워킹 프로토콜입니다. NTP 프레임워크는 인터넷 시간 서버에 의존합니다. NTP는 하루 중 시간을 정확하게 조정하는 알고리즘을 가지고 있습니다. NTP 서버는 UDP 포트 123을 사용하여 클라이언트 컴퓨터로 현재 시간을 전송하는 소프트웨어를 실행합니다. 이 프로젝트에서는 ESP32를 사용하여 NTP 서버에서 시간을 가져와 OLED 디스플레이에 표시합니다.

UDP 서버와 NTP 서버 간의 통신
필요한 재료:
ESP32
128*64 OLED 디스플레이
브레드보드
수-암 와이어
회로도:

ESP32와 OLED 디스플레이를 이용한 인터넷 시계 회로도
여기서는 SPI 모드를 사용하여 128x64 OLED 디스플레이 모듈(SSD1306)을 ESP32에 연결합니다. 따라서 7개의 핀이 사용됩니다. ESP32와의 연결은 다음과 같습니다.
- OLED의 CS(칩 선택) 핀 -> ESP32의 D5 핀
- OLED의 DC 핀 -> ESP32의 D4 핀
- OLED의 RES 핀 -> ESP32의 D2 핀
- OLED의 SDA 핀 -> ESP32의 MOSI, 즉 D23 핀
- OLED의 SCK 핀 -> ESP32의 D18 핀(즉, SCK 핀)
- OLED의 Vdd -> ESP32의 Vcc
- OLED 접지 -> ESP32 접지
ESP32용 보드 파일이 필요합니다. 아두이노 IDE의 보드 관리자 드롭다운 메뉴에서 ESP32 개발 키트를 찾아보세요. 만약 없다면 아래 링크의 단계를 따르세요.
https://circuitdigest.com/microcontroller-projects/getting-started-with-esp32-with-arduino-ide
이 프로젝트에 ESP12를 사용할 수도 있습니다. ESP12 사용법은 여기에서 확인하세요.
위 글에서 설명한 대로 아두이노 IDE를 사용하여 프로그램을 작성하겠습니다.
코드 설명:
ESP32 인터넷 시계의 전체 코드는 이 글의 끝부분에 나와 있습니다. 여기서는 코드의 몇 가지 중요한 부분을 설명하겠습니다.
코드에서 사용할 몇 가지 라이브러리가 필요하며, 아래 링크에서 다운로드할 수 있습니다.
1. Adafruit_SSD1306: https://github.com/adafruit/Adafruit_SSD1306
2. SPI: https://github.com/PaulStoffregen/SPI
3. Adafruit_GFX: https://github.com/adafruit/Adafruit-GFX-Library
4. NTPClient: https://github.com/arduino-libraries/NTPClient
5. WiFiUDP: https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi
그래서 우리는 모든 라이브러리를 포함시켰고 Wi-Fi 이름과 비밀번호를 입력하기 위한 변수를 정의했습니다.
#include <WiFi.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
const char* ssid = "*******"; // 와이파이 이름
const char* password = "*********"; // 와이파이 비밀번호
여기서 NTPClient.h 라이브러리는 시간 서버에 연결하는 데 사용됩니다. 이 라이브러리는 NTP 서버에서 시간을 가져와 동기화합니다. 또한 WiFiUdp.h 라이브러리는 UDP 메시지를 송수신하는 데 사용됩니다. UDP는 시스템에서 NTP 서버로 짧은 메시지를 주고받는 프로토콜입니다.
인터넷에서 시간을 가져오려면 NTP용 프로그램에 세 개의 변수를 정의해야 합니다.
NTP_OFFSET 은 해당 국가의 시간대입니다. 예를 들어 인도의 경우 +5:30이므로 초 단위로 환산하면 19800입니다.
NTP_INTERVAL 은 NTP가 시간을 업데이트하는 데 걸리는 시간 간격입니다. 이 값은 60~64초입니다.
NTP_ADDRESS 는 해당 국가의 NTP 서버 주소입니다. 인도의 경우 " in.pool.ntp.org "를 사용할 수 있습니다.
#define NTP_OFFSET 19800 // 초 단위
#define NTP_INTERVAL 60 * 1000 // 밀리초 단위
#define NTP_ADDRESS "1.asia.pool.ntp.org"
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
설정 기능 에서 인터넷 연결을 위해 Wi-Fi 설정을 초기화합니다.
void setup()
{
display.begin();
Serial.begin(9600);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
timeClient.begin();
그런 다음 OLED에 시간을 표시하도록 디스플레이 기능을 초기화합니다.
display.begin(SSD1306_SWITCHCAPVCC);
반복문 함수 내에서 timeClient.update() 함수 를 사용했습니다 . 이 함수는 NTP에서 업데이트된 시간을 문자열 형태로 받아 formattedTime 변수에 저장합니다. 그런 다음 display.println() 함수를 사용하여 OLED에 표시합니다 .
void loop()
{
timeClient.update();
String formattedTime = timeClient.getFormattedTime();
display.clearDisplay();
display.setTextSize(2); // 필요에 따라 이 매개변수를 설정하세요.
display.setCursor(0, 0);
display.println(formattedTime); }
전체 프로그램은 아래에 나와 있습니다. 이제 아두이노 IDE를 사용하여 ESP32를 프로그래밍하면 인터넷 시계가 시간을 표시할 준비가 완료됩니다.
전체 프로젝트 코드
#include <WiFi.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
const char* ssid = "*******";
const char* password = "*********";
#define NTP_OFFSET 19800 // In seconds
#define NTP_INTERVAL 60 * 1000 // In miliseconds
#define NTP_ADDRESS "1.asia.pool.ntp.org"
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
#define OLED_MOSI 23
#define OLED_CLK 18
#define OLED_DC 4
#define OLED_CS 5
#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup()
{
display.begin();
Serial.begin(9600);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
timeClient.begin();
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextColor(WHITE);
//display.startscrollright(0x00, 0x0F);
display.setTextSize(2);
//display.setCursor(0,0);
//display.print(" Internet ");
//display.println(" Clock ");
//display.display();
//delay(3000);
}
void loop()
{
timeClient.update();
String formattedTime = timeClient.getFormattedTime();
// Serial.println(formattedTime);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.println(formattedTime);
display.display(); // write the buffer to the display
delay(10);
delay(100);
}
'ESP32' 카테고리의 다른 글
| ESP32 3.5inch TFT-LCD 개발 환경 설정 - 문서로 제공할 것 (0) | 2026.01.01 |
|---|---|
| ESP32 4G/5G 및 GPS 인터페이스 (0) | 2026.01.01 |
| ESP32 및 ESP8266을 이용한 MicroPython 프로그래밍 (0) | 2025.12.29 |
| DS3231 모듈을 사용한 ESP32 실시간 시계 (1) | 2025.12.26 |
| ESP-IDF Programming Guide (0) | 2025.12.24 |
| ESP32 타이머 구조와 타이머 인터럽트 실행 방법 (4) | 2025.12.24 |
| ESP32 타이머 및 타이머 인터럽트 (0) | 2025.12.24 |
| ESP32: Wi-Fi 관리자 생성 AsyncWebServer 라이브러리 사용 (0) | 2025.12.22 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩