ESP32 MicroPython 타임스탬프와 함께 SD 카드에 데이터 기록
이 가이드는 ESP32와 MicroPython을 사용하여 마이크로 SD 카드에 타임스탬프가 있는 항목을 기록하는 데이터 로거를 만드는 방법을 보여줍니다. 다루는 내용:
날짜와 시간은 DS3231 RTC 모듈에서 가져와 센서 측정값과 함께 마이크로 SD 카드에 기록됩니다.
기록되는 데이터는 다음과 같이 다양한 측정값을 포함할 수 있습니다:
온도, 습도 또는 기타 센서의 측정값.
도어 잠금 시스템의 접근 이벤트.
간단히 하기 위해 이 가이드에서는 두 개의 아날로그 입력 핀에서 읽은 값을 샘플 데이터로 사용합니다. 다른 유형의 정보를 기록하도록 코드를 쉽게 수정할 수 있습니다.
| 1 | × | 38-pin ESP32 ESP-WROOM-32 Dev Module - Narrow | 쿠팡 | 아마존 | |
| 1 | × | (또는) 38-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 쿠팡 | 아마존 | |
| 1 | × | (또는) 30-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 아마존 | |
| 1 | × | (또는) ESP32 Uno-form board | 아마존 | |
| 1 | × | (또는) ESP32 S3 Uno-form board | 아마존 | |
| 1 | × | USB 케이블 타입-A to 타입-C (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-C to 타입-C (USB-C PC용) | 아마존 | |
| 1 | × | 마이크로 SD 카드 | 아마존 | |
| 1 | × | 마이크로 SD 카드 모듈 | 쿠팡 | 아마존 | |
| 1 | × | (옵션) MicroSD to SD 메모리 카드 어댑터 | 아마존 | |
| 1 | × | DS3231 실시간 클록(RTC) 모듈 | 아마존 | |
| 1 | × | CR2032 배터리 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Breakout Expansion Board for ESP32 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 전원 분배기 | 쿠팡 | 아마존 | |
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
마이크로 SD 카드 모듈 또는 RTC 모듈을 처음 사용하시나요? 핀아웃, 배선, 프로그래밍을 다루는 단계별 튜토리얼을 확인하세요:

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
아래 배선표는 마이크로 SD 카드 모듈과 DS3231 RTC 모듈을 ESP32에 연결하는 방법을 보여줍니다:
| Micro SD Card Module | ESP32 |
| VCC | 5V |
| GND | GND |
| MISO | GPIO19 |
| MOSI | GPIO23 |
| SCK | GPIO18 |
| CS | GPIO5 |
| DS3231 RTC Module | ESP32 |
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |
※ 주의:
이더넷 실드 등 쉴드에 마이크로 SD 카드 슬롯이 내장되어 있는 경우, 외부 모듈을 생략하고 카드를 슬롯에 직접 삽입할 수 있습니다.
/*
* 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-log-data-with-timestamp-to-sd-card
*/
import machine
import os
import time
import sdcard
SPI_SCK_PIN = 18
SPI_MOSI_PIN = 23
SPI_MISO_PIN = 19
SPI_CS_PIN = 5
I2C_SDA_PIN = 21
I2C_SCL_PIN = 22
FILE_NAME = "/sd/log.txt"
i2c = machine.I2C(0, sda=machine.Pin(I2C_SDA_PIN), scl=machine.Pin(I2C_SCL_PIN))
DS3231_ADDR = 0x68
def bcd_to_dec(bcd):
return (bcd >> 4) * 10 + (bcd & 0x0F)
def get_datetime():
buf = i2c.readfrom_mem(DS3231_ADDR, 0x00, 7)
second = bcd_to_dec(buf[0])
minute = bcd_to_dec(buf[1])
hour = bcd_to_dec(buf[2])
day = bcd_to_dec(buf[4])
month = bcd_to_dec(buf[5] & 0x1F)
year = bcd_to_dec(buf[6]) + 2000
return (year, month, day, hour, minute, second)
spi = machine.SoftSPI(baudrate=1000000, polarity=0, phase=0,
sck=machine.Pin(SPI_SCK_PIN),
mosi=machine.Pin(SPI_MOSI_PIN),
miso=machine.Pin(SPI_MISO_PIN))
cs = machine.Pin(SPI_CS_PIN, machine.Pin.OUT)
try:
sd = sdcard.SDCard(spi, cs)
os.mount(sd, "/sd")
print("SD CARD INITIALIZED.")
except Exception as e:
print("SD CARD FAILED, OR NOT PRESENT!", e)
raise SystemExit
print("--------------------")
analog_pin_1 = machine.ADC(machine.Pin(36))
analog_pin_2 = machine.ADC(machine.Pin(39))
analog_pin_1.atten(machine.ADC.ATTN_11DB)
analog_pin_2.atten(machine.ADC.ATTN_11DB)
while True:
try:
f = open(FILE_NAME, "a")
print("Writing log to SD Card")
year, month, day, hour, minute, second = get_datetime()
timestamp = "{}-{}-{} {}:{}:{}".format(year, month, day, hour, minute, second)
analog_1 = analog_pin_1.read()
analog_2 = analog_pin_2.read()
f.write("{} analog_1 = {}, analog_2 = {}\n".format(timestamp, analog_1, analog_2))
f.close()
except Exception as e:
print("SD Card: Issue encountered while attempting to open the file", FILE_NAME, e)
time.sleep(2)
Thonny IDE를 사용하여 ESP32에서 MicroPython 코드를 설정하고 실행하는 방법:
Thonny IDE가 컴퓨터에 설치되어 있는지 확인합니다.
ESP32 보드에 MicroPython 펌웨어가 로드되어 있는지 확인합니다.
위 이미지에 따라 배선합니다.
USB 케이블로 ESP32 보드를 컴퓨터에 연결합니다.
컴퓨터에서 Thonny IDE를 엽니다.
Thonny IDE에서 Tools Options로 이동합니다.
Interpreter 탭에서 드롭다운 메뉴의 MicroPython (ESP32)를 선택합니다.
올바른 포트가 선택되어 있는지 확인합니다. Thonny IDE가 자동으로 감지하지만, 수동으로 선택해야 할 수도 있습니다(Windows에서는 COM3, Linux에서는 /dev/ttyACM0).
Thonny IDE의 Tools Manage packages로 이동합니다.
"sdcard"를 검색하여 micropython-lib에서 제공하는 sdcard 라이브러리를 찾습니다.
sdcard를 클릭한 후 Install 버튼을 클릭하여 SD 카드 라이브러리를 설치합니다.
마이크로 SD 카드가 FAT16 또는 FAT32로 포맷되어 있는지 확인합니다(필요한 경우 온라인에서 방법을 검색하세요).
제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣습니다.
다음 방법으로 코드를 ESP32에 저장합니다:
녹색 Run 버튼을 클릭하거나 F5를 눌러 스크립트를 실행합니다.
Thonny 하단의 Shell 메시지를 확인합니다.
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot
SD CARD INITIALIZED.
--------------------
Writing log to SD Card
Writing log to SD Card
Writing log to SD Card
Writing log to SD Card
Writing log to SD Card
Writing log to SD Card
Writing log to SD Card
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡
USB SD 카드 리더기가 없는 경우, 다음 MicroPython 코드를 ESP32에서 실행하여 로그 파일 내용을 확인할 수 있습니다.
/*
* 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-log-data-with-timestamp-to-sd-card
*/
import machine
import os
import sdcard
SPI_SCK_PIN = 18
SPI_MOSI_PIN = 23
SPI_MISO_PIN = 19
SPI_CS_PIN = 5
FILE_NAME = "/sd/log.txt"
spi = machine.SoftSPI(baudrate=1000000, polarity=0, phase=0,
sck=machine.Pin(SPI_SCK_PIN),
mosi=machine.Pin(SPI_MOSI_PIN),
miso=machine.Pin(SPI_MISO_PIN))
cs = machine.Pin(SPI_CS_PIN, machine.Pin.OUT)
try:
sd = sdcard.SDCard(spi, cs)
os.mount(sd, "/sd")
print("SD CARD INITIALIZED.")
except Exception as e:
print("SD CARD FAILED, OR NOT PRESENT!", e)
raise SystemExit
try:
f = open(FILE_NAME, "r")
while True:
ch = f.read(1)
if not ch:
break
print(ch, end="")
f.close()
except Exception as e:
print("SD Card: Issue encountered while attempting to open the file", FILE_NAME, e)
os.umount("/sd")
모든 로그를 하나의 파일에 저장하면 시간이 지남에 따라 파일이 커져 관리가 어려워집니다. 아래 코드는 로그를 여러 파일로 나눕니다:
/*
* 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다
* 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-log-data-with-timestamp-to-sd-card
*/
import machine
import os
import time
import sdcard
SPI_SCK_PIN = 18
SPI_MOSI_PIN = 23
SPI_MISO_PIN = 19
SPI_CS_PIN = 5
I2C_SDA_PIN = 21
I2C_SCL_PIN = 22
i2c = machine.I2C(0, sda=machine.Pin(I2C_SDA_PIN), scl=machine.Pin(I2C_SCL_PIN))
DS3231_ADDR = 0x68
def bcd_to_dec(bcd):
return (bcd >> 4) * 10 + (bcd & 0x0F)
def get_datetime():
buf = i2c.readfrom_mem(DS3231_ADDR, 0x00, 7)
second = bcd_to_dec(buf[0])
minute = bcd_to_dec(buf[1])
hour = bcd_to_dec(buf[2])
day = bcd_to_dec(buf[4])
month = bcd_to_dec(buf[5] & 0x1F)
year = bcd_to_dec(buf[6]) + 2000
return (year, month, day, hour, minute, second)
spi = machine.SoftSPI(baudrate=1000000, polarity=0, phase=0,
sck=machine.Pin(SPI_SCK_PIN),
mosi=machine.Pin(SPI_MOSI_PIN),
miso=machine.Pin(SPI_MISO_PIN))
cs = machine.Pin(SPI_CS_PIN, machine.Pin.OUT)
try:
sd = sdcard.SDCard(spi, cs)
os.mount(sd, "/sd")
print("SD CARD INITIALIZED.")
except Exception as e:
print("SD CARD FAILED, OR NOT PRESENT!", e)
raise SystemExit
print("--------------------")
analog_pin_1 = machine.ADC(machine.Pin(36))
analog_pin_2 = machine.ADC(machine.Pin(39))
analog_pin_1.atten(machine.ADC.ATTN_11DB)
analog_pin_2.atten(machine.ADC.ATTN_11DB)
while True:
year, month, day, hour, minute, second = get_datetime()
filename = "/sd/{:04d}{:02d}{:02d}.txt".format(year, month, day)
try:
f = open(filename, "a")
print("Writing log to SD Card")
timestamp = "{}-{}-{} {}:{}:{}".format(year, month, day, hour, minute, second)
analog_1 = analog_pin_1.read()
analog_2 = analog_pin_2.read()
f.write("{} analog_1 = {}, analog_2 = {}\n".format(timestamp, analog_1, analog_2))
f.close()
except Exception as e:
print("SD Card: Issue encountered while attempting to open the file", filename, e)
time.sleep(2)
오랜 시간 실행 후:
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.