091

[C/C++] ESP32와 DS3231 연결해서 온도에 따라 LED ON/OFF 하기 본문

Programming Language/C&C++

[C/C++] ESP32와 DS3231 연결해서 온도에 따라 LED ON/OFF 하기

공구일 2025. 6. 1. 01:14
728x90

*현재 이 코드에서는 직접적으로 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 불을 깜빡이게 만듦

 

728x90