091
[C/C++] ESP32와 DS3231 연결해서 온도에 따라 LED ON/OFF 하기 본문
*현재 이 코드에서는 직접적으로 DS3231 코드를 사용하지 않고 NTP 서버로부터 현재시간을 가져오는 구조*
01. DS3231(Dallas Semicondutor -> 반도체 회사이름, 현재는 Maxim Integrated에 인수) & NTP
- DS3231 : 실시간 시계(RTC, Real Time Clock) 모듈 중 하나로, 날짜와 시간을 전원이 꺼져도 유지, 정밀도가 높다보니 일반 RTC보다 정확함 -> 통신방식이 I2C이기 때문에 SDA(GPIO 21)와 SCL(GPIO 22)를 각각 연결해줘야함
- NTP(Network Time Protocol) : 인터넷이나 네트워크 상에서 장비들의 시간을 동기화하는 표준 프로토콜로, 마이크로컨트롤러나 컴퓨터는 전원이 꺼지면 시간이 초기화 되기 때문에 현재 시간에 맞지 않으면 동기화를 함 -> 하지만, 대게 RTC를 통해 전원이 꺼져도 유지될 수 있게 함
02.ESP32와 DS3231 연결해서 온도에 따라 LED ON/OFF 하기
- 하드웨어 : 하지만 현재 dsp3231을 이용하고 있지 않음 -> DS3231은 NTP처럼 인터넷 없어도 시간을 알 수 있고, 전원이 꺼져 있어도 시간을 유지해주는 하드웨어 시계이지만, 현재는
- 소프트웨어 :
• main.ino
#include <WiFi.h>
#include <time.h>
#include "DS3231Sync.h"
#define LED_PIN 4
// Enter your Wi-Fi SSID and password
const char* ssid = "Your Wifi SSID";
const char* password = "Your Wifi password";
// Taiwan timezone (UTC+8)
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0; // No daylight saving time
void setup() {
Serial.begin(115200);
delay(1000);
pinMode(LED_PIN,OUTPUT);
// Connect to Wi-Fi
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected");
// Configure NTP
configTime(gmtOffset_sec, daylightOffset_sec, "ntp.ksu.edu.tw", "time.stdtime.gov.tw");
Serial.println("Waiting for NTP time synchronization...");
struct tm timeinfo;
while (!getLocalTime(&timeinfo)) {
Serial.println("Failed to get time, retrying...");
delay(1000);
}
Serial.println("Time synchronization successful!");
printLocalTime();
}
void loop() {
printLocalTime();
delay(10000); // Print time every 10 seconds
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain local time");
return;
}
Serial.printf("Current time: %04d-%02d-%02d %02d:%02d:%02d\n",
timeinfo.tm_year + 1900,
timeinfo.tm_mon + 1,
timeinfo.tm_mday,
timeinfo.tm_hour,
timeinfo.tm_min,
timeinfo.tm_sec);
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
}
1️⃣ Wi-Fi 연결
- Wifi에 연결할 SSID(네트워크 이름)과 비밀번호를 넣어 Wifi.begin(이름,비밀번호)로 와이파이를 연결함
- gmtOffset_sec와 daylightOffset_sec을 통해 시간대를 설정
- Wifi.status()가 연결이 됐을 때 WL_CONNETED 상태값을 가지기 때문에 연결이 되기 전까지는 .을 출력함
2️⃣ NTP로 시간 동기화
- configTime() : NTP를 통해서 ESP32에 현재 시간 정보를 설정하는 함수로, 표준시 기준 오프셋, 썸머타임 오프셋, ntp1, ntp2(보조주소)를 인수로 넣음 -> 예시에서는 쿤산과학기술대학교 ntp와 대만 ntp를 가져와주는 것
3️⃣ 시간 출력 및 LED
- printLocalTime()을 통해 getLocalTime()과 일치하다면 시간을 출력하고, LED 불을 깜빡이게 만듦
'Programming Language > C&C++' 카테고리의 다른 글
[C/C++] ESP32와 DHT11 연결해서 온도에 따라 LED ON/OFF 하기 (0) | 2025.05.19 |
---|---|
[C/C++] ESP32와 MFRC522 연결해서 카드로 LED ON/OFF 하기 (0) | 2025.05.13 |
[C/C++] ESP32에서 RTOS 사용하여 3가지 작업 유연하게 처리하기 (0) | 2025.04.13 |
[C/C++] ESP32에서 3가지 작업(LCD,Switch,UART) 반복처리하기 (0) | 2025.04.09 |
[C/C++] ESP32에서 EEPROM 저장하기 (0) | 2025.04.08 |