“스마트홈 부화기 프로젝트의 첫 번째 모듈, 오디오 시스템을 완성했습니다.”
부품 리스트: ESP32-C3 SuperMini, DFPlayer Mini, SSD1306 OLED, 터치 센서 등.

홈 오토메이션 관련 DIY

“스마트홈 부화기 프로젝트의 첫 번째 모듈, 오디오 시스템을 완성했습니다.”
부품 리스트: ESP32-C3 SuperMini, DFPlayer Mini, SSD1306 OLED, 터치 센서 등.


안녕하세요! 오늘은 제 블로그의 핵심 가치인 **’Smart Home’**을 가장 완벽하게 구현할 수 있는 새로운 프로젝트를 소개하려고 합니다. 바로 [전자동 스마트 달걀 부화기] 제작 기획입니다.
단순히 알을 깨고 나오는 수준을 넘어, 21일(3주)이라는 시간 동안 오차 없는 정밀 제어와 실시간 모니터링이 결합된 하이테크 부화 시스템을 목표로 합니다.
부화기 내부의 환경 제어는 스마트홈 시스템의 논리와 매우 닮아 있습니다.
결국 이 프로젝트는 스마트홈 시스템의 미니 버전이자, 그 기술력을 증명할 가장 완벽한 테스트베드가 될 것입니다.
이번 프로젝트의 두뇌는 ESP32-C3와 ESP32-CAM이 담당합니다.
| 기능 | 상세 내용 | 제어 모듈 |
| 온/습도 자동 제어 | 히터와 가습기를 PID 또는 On/Off 제어로 일정하게 유지 | ESP32-C3 |
| 자동 전란 (Egg Turning) | 주기적으로 모터를 구동하여 배아 유착 방지 | ESP32-C3 |
| 공기 정화 및 환기 | CO2 농도에 따른 팬(Fan) 구동 및 신선한 공기 유입 | ESP32-C3 |
| 심리 안정 음악 | 부화율 향상을 위한 잔잔한 클래식/자연 소리 재생 | ESP32-C3 (I2S/PWM) |
| 실시간 라이브 뷰 | 스마트폰 앱을 통한 부화기 내부 24시간 감시 | ESP32-CAM |
| 타임랩스 기록 | 3주간의 전 과정을 촬영하여 탄생의 순간을 영상화 | ESP32-CAM (SD Card) |
이 프로젝트의 가장 큰 묘미는 기다림에 있습니다. 단순한 기계 조립이 아니라, 제가 짠 코드와 설계한 회로가 **’생명을 태어나게 할 수 있을까?’**라는 질문에 답하는 과정입니다.
검란(Candling)을 통해 핏줄이 생기는 모습, 심장이 뛰는 모습, 그리고 마침내 껍질을 깨고 나오는 ‘파각’의 순간까지. 그 경이로운 21일간의 기록을 여러분과 실시간으로 공유하려 합니다.
스마트홈 기술이 생명을 만났을 때 어떤 결과가 나올지 저도 무척 기대됩니다. 다음 포스팅에서는 구체적인 부품 리스트와 회로도를 가지고 돌아오겠습니다.
많은 관심과 응원 부탁드립니다! 🐥
부화 성공률(부화율)을 높이려면 단순히 따뜻하게 하는 것을 넘어 정밀한 제어가 필요합니다.
| 항목 | 조건 | 비고 |
| 온도 | 37.5°C ~ 38°C | 가장 중요함. 1도만 차이 나도 기형이나 폐사 발생 가능. |
| 습도 | 초기(1~18일): 45~55% / 말기(19~21일): 65~75% | 부화 직전에는 껍질을 깨기 쉽도록 습도를 높여야 함. |
| 전란 (Egg Turning) | 1~18일 동안 하루 4~6회 | 난황이 껍질에 붙는 것을 방지. 부화 3일 전에는 중단. |
| 환기 | 신선한 산소 공급 | 배아도 숨을 쉽니다. 이산화탄소 배출이 필수적임. |
온도 습도 관리에서 태교음악까지 구현 3주간
| 구분 | 역할 | 주용 기술 |
| ESP32-C3 | 환경 제어 및 데이터 로깅 | MicroPython, AHT20, Relay |
| ESP32-CAM | 실시간 시각 모니터링 & 10분 주기 촬영 | C++, HTTP Client |
| Home Server | DB 관리 및 이미지 스토리지 | PHP, MySQL, Apache/Nginx |
| Dashboard | 통합 제어 및 타임랩스 뷰어 | HTML5, JS, Bootstrap |
디자인중인 데시보드



OLED 번인 방지: PIR 센서로 디스플레이 수명 늘리는 법
OLED 디스플레이의 최대 단점인 밝기 저하와 번인 현상! 장시간 화면을 켜두었을 때 발생하는 얼룩덜룩한 잔상을 방지하기 위해, PIR 인체감지 센서를 활용하여 사람이 있을 때만 화면이 켜지게 만드는 스마트한 해결 방법을 소개합니다.
OLED는 ‘유기 발광 다이오드’의 약자로, 화면 뒤에서 빛을 쏴주는 백라이트가 필요한 LCD와 달리 소자 하나하나가 스스로 빛을 내는(자발광) 방식입니다.
하지만 OLED는 **’유기물’**을 태워서 빛을 냅니다. 마치 촛불처럼 켜두면 서서히 타들어 가며 수명이 줄어듭니다.
3. 실제 1~2개월만 계속 켜놔도 OLED가 아래처럼 얼룩덜룩 된 사례

OLED의 수명을 늘리는 가장 확실한 방법은 **”필요할 때만 켜는 것”**입니다. 하지만 매번 버튼을 누르기는 귀찮죠. 이때 PIR(Passive Infrared) 센서가 훌륭한 대안이 됩니다.
적외선을 통해 사람의 움직임을 감지하는 센서입니다. 현관문 자동등에 쓰이는 바로 그 센서입니다!
“OLED의 선명함은 포기할 수 없지만, 번인이 걱정된다면 PIR 센서를 달아보세요. 하드웨어적인 보호 수단 하나가 여러분의 디스플레이 수명을 2배, 아니 10배까지도 늘려줄 것입니다. 이번 프로젝트를 통해 똑똑하고 오래가는 DIY 기기를 만들어보시길 바랍니다!”
센서 위를 덮고 있는 올록볼록한 반구 모양은 단순한 덮개가 아니라 **’프레넬 렌즈(Fresnel Lens)’**입니다.
보통 센서 뒷면에는 작은 나사(가변 저항)가 두 개 있습니다.
5. PIR 센서는 온도 변화에 민감합니다. (주의)
🐍 최종 코드
Python
🐍 OLED 전면 점등 테스트 코드 (ESP32-C3)
Python

ESP32는 정말 가성비 좋은 칩이지만, 외부 라이브러리를 쓰다 보면 “이 칩이 내가 모르는 곳으로 데이터를 보내면 어쩌지?” 하는 찝찝함이 생기기 마련입니다. 그래서 저는 ipTIME 공유기 설정을 통해 ESP32가 내부망(LAN)에서는 통신하되, 외부 인터넷(WAN)으로는 나가지 못하게 꽉 막아두고 사용합니다.
인터넷을 차단하면 가장 먼저 터지는 문제가 바로 NTP 시간 동기화입니다. 특히 제가 사용한 ESP32-C3 미니 모듈은 저가형이라 그런지 내장 클럭 오차가 상당하더라고요. 하루만 지나도 몇 분씩 차이가 나니, 정밀한 제어가 필요한 프로젝트에서는 치명적이었습니다.
집에서 홈 서버로 활용 중인 안드로이드 TV 박스를 타임 서버로 쓰려고 했더니, 이 녀석도 문제입니다. 안드로이드 OS 특성상 시스템 시간을 강제로 동기화하는 게 쉽지 않고, 재부팅 후에는 시간이 틀어져 있기 일쑤였죠.
그래서 저는 **’오차 보정(Offset) 알고리즘’**을 직접 구현하기로 했습니다.
시스템의 원리는 생각보다 간단하지만 강력합니다.
이렇게 세팅하니 ESP32는 단 1바이트의 데이터도 외부망으로 흘리지 않으면서, 시간은 항상 1초 단위까지 정확하게 유지하게 되었습니다. 저사양 TV 박스에서 돌아가는 옛날 버전의 PHP/MySQL 환경에서도 아주 쌩쌩하게 잘 돌아가네요!
남들이 보기엔 “그냥 인터넷 연결하면 편할 걸 왜 이렇게까지 해?”라고 할 수도 있지만, 메이커라면 이런 나만의 보안 환경을 구축하는 데서 오는 쾌감이 있죠.
혹시 저처럼 보안을 위해 기기를 격리하고 싶거나, 저가형 칩의 시간 오차 때문에 고민인 분들에게 이 방식이 작은 팁이 되었으면 좋겠습니다.

안녕하세요! DIY 사이트에 올릴 작업물들을 360도 보여주기 위해 직접 제작한 ‘전시용 턴테이블’ 제작기를 가져왔습니다.

DIY 사이트를 운영하다 보니 정성껏 만든 물건을 다각도에서 보여줄 수 있는 회전판이 필요했습니다. 시중에 파는 제품도 많지만, DIY 사이트니 직접 만들어야죠.
회로의 심장은 단골 ESP32-C3 SuperMini를 사용했습니다.
이번 프로젝트의 핵심 로직은 **’움직임과 소리의 동기화’**입니다. 마이크로파이썬을 통해 다음과 같은 흐름을 구현했습니다.
4. 관련글


DFPlayer Mini는 저렴한 가격에 MP3 디코더와 앰프 기능을 모두 갖춘 놀라운 모듈입니다. 단순히 음악을 트는 것을 넘어, 안내 음성이나 효과음을 프로젝트에 입힐 수 있어 활용도가 무궁무진합니다.
연결은 매우 직관적입니다. ESP32-C3의 여유 핀 GPIO 5(TX)핀을 모듈의 RX에, GPIO 21(RX)핀을 모듈의 TX에 연결하면 됩니다. 이때 노이즈를 방지하고 모듈을 보호하기 위해 RX 라인에 1kΩ 저항을 하나 달아주는 것이 꿀팁입니다. 전원은 5V를 연결하고, 스피커 출력 단자(SPK1, SPK2)에 소형 스피커를 바로 연결하기만 하면 물리적인 준비는 끝납니다.
이 모듈을 사용할 때 가장 주의할 점은 SD카드의 파일 정리 방식입니다. SD카드는 반드시 FAT32 형식으로 포맷해야 하며, 파일 관리 방식은 크게 두 가지가 있습니다. 루트 폴더에 ‘0001.mp3‘,’0002.mp3‘… 로 음악파일을 넣거나, 더 체계적인 관리를 위해 ’01’, ’02’ 같은 이름의 폴더를 만들고 그 안에 ‘001.mp3’, ‘002.mp3’ 형식으로 파일을 넣는 방식입니다. 이렇게 폴더 형식(01/001.mp3)으로 구성하면 나중에 마이크로파이썬 코드에서 특정 폴더의 특정 곡을 지정해 재생하기 훨씬 수월해집니다.
복잡한 라이브러리 설치 없이 UART 통신을 통해 8바이트의 간단한 명령어로 제어할 수 있습니다. 볼륨 조절, 특정 트랙 재생, 일시 정지 등의 기능을 uart.write() 함수 한 줄로 실행할 수 있어 코드가 매우 간결해집니다.

5. mplayer.py : play(), stop(), set_volume()

안녕하세요! 오늘은 작지만 강력한 ESP32-C3 Mini 보드를 사용해서 스텝모터를 돌려보겠습니다. 일반 아두이노보다 성능이 좋고 크기가 작아 실제 전시물 제작에 아주 유리한 보드죠.
최근 제가 제작하고 있는 ‘음악 나오는 전시용 회전판(턴테이블)’ 프로젝트에서도 이 스텝모터가 핵심적인 역할을 담당하고 있는데요. 왜 일반 모터가 아닌 스텝모터를 사용했는지, 그 이유와 특징을 정리해 드립니다.
일반적인 DC 모터는 전원을 연결하면 뱅글뱅글 계속 회전하지만, 스텝모터는 이름처럼 ‘스텝(Step, 단계)’을 밟듯이 딱 정해진 각도만큼만 움직이는 모터입니다.
예를 들어, “90도만 움직여!” 혹은 “한 바퀴를 200번에 나눠서 움직여!”라는 명령을 아주 정확하게 수행할 수 있습니다.
4. 사용법
28BYJ-48 스텝모터스텝모터를 제어할 때 ULN2003 드라이버를 사용하는데
ESP32-C3 SuperMini 보드의 GPIO 1~4번 핀을 사용합니다.
| ULN2003 드라이버 | ESP32-C3 GPIO |
| IN1 | Pin 1 |
| IN2 | Pin 2 |
| IN3 | Pin 3 |
| IN4 | Pin 4 |
| VCC / GND | 5V / GND |

5. 사용 코드
step.py set_run(speed) 함수

구글 AI ‘제미나이’와 협업해서 DIY 스마트홈 모니터링 시스템을 완전히 리뉴얼했습니다.
집 내부 장치는 10초마다 외부 Open Weather, Naver 는 10분마다 자동 업데이트 되는 정보.
BMP 센서도 두개 있어서 집 대기압도 측정중


최근 스마트홈 구축에 가장 주력으로 사용하는 부품은 단연 ESP32-C3 Super Mini 보드입니다. 2~3년 전부터 꾸준히 구입해왔는데, 최근에는 가격이 1~2달러 수준까지 떨어져 가성비 면에서 압도적이죠. 하지만 가격이 저렴한 만큼 치명적인 단점이 하나 있는데, 바로 불안정한 WiFi 통신 문제입니다.
재미있는 점은 납땜 전에는 잘 되던 보드가 핀 헤더를 납땜하거나 브레드보드에 끼우기만 하면 WiFi 연결이 불안정해진다는 것입니다.
최근 생산되는 양품은 안테나 단자와 진동소자 사이가 1mm 이상 떨어져 있지만, 초기 모델이나 일부 제품은 이 간격이 매우 좁아 진동소자와 간섭이 발생하는 것으로 보입니다. 구입시 제품 사진으로 확인하고 구입하기를 추천하고 이미 불량을 받았다면 아래 팁을 활용해 보세요.
직접 수십 개의 보드를 다루며 찾아낸 WiFi 통신 불량 해결 트릭을 소개합니다.

안테나와 가장 인접한 마지막 핀(Antenna 근처)이 간섭의 주범인 경우가 많습니다. 이 마지막 핀을 제외하고 납땜하는 것만으로도 WiFi 신호가 몰라보게 안정됩니다.
브레드보드에 보드를 끼웠을 때만 통신이 안 된다면 전파 간섭이 극대화된 상태입니다. 이때 사진처럼 마지막 핀과 안테나 단자를 와이어로 가볍게 단락(Short) 시켜보세요. 의외로 브레드보드 환경에서 수신율이 개선되는 것을 확인할 수 있습니다. 단락할 경우 브레드보드에서 빼면 오히려 수신율이 떨어지니 단락할지 말지는 브레드보드 쓸지 말지로 결정해야 됩니다.
하드웨어 수정이 어렵다면 소프트웨어적으로 접근할 수 있습니다. WiFi 출력 세기(TX Power)를 의도적으로 한 단계 낮게 설정해 보세요. 전파 간섭이 줄어들면서 오히려 끊김 현상이 줄어듭니다.
cpp
python
ESP32-C3 Super Mini 보드에는 8번 핀에 내장 LED가 달려 있습니다.
연결 시도중일때 LED를 깜빡이게 하고 연결 완료시 꺼지게 하는 코드를 넣으면 시각적으로 바로 확인 할 수 있어서 좋습니다.
논리 반전 주의: ESP32-C3 Super Mini의 내장 LED는 보통 Low(0)일 때 켜지고 High(1)일 때 꺼지는 방식(Active Low)입니다.
무한 루프 방지: 만약 보드 불량이 심해 WiFi가 영영 안 잡히면 LED가 계속 깜빡이며 다음 코드로 넘어가지 않습니다. 테스트용으로는 좋지만, 실제 배포용 코드에서는 while문에 횟수 제한(타임아웃)을 두는 것이 좋습니다.
Python set_blink(ms)
ESP32-C3 Super Mini는 분명 매력적인 보드이지만, 초기 불량 제품 구입하신 분들께 이 경험이 작은 도움이 되길 바랍니다.

안녕하세요! 오늘은 마이크로파이썬을 활용해 인터넷에서 실시간 기상 데이터를 가져오는 방법을 알아보겠습니다. 센서가 없어도 Wi-Fi만 연결되어 있다면 OpenWeather API를 통해 내 동네의 온도와 습도를 정확하게 받아올 수 있습니다.

우리는 urequests 라이브러리를 통해 JSON 데이터를 받아올 겁니다. API 호출 주소는 다음과 같은 형식입니다.
https://api.openweathermap.org/data/2.5/weather?q={도시이름}&appid={내API키}&units=metric
아래 코드는 Wi-Fi에 접속한 뒤, API 데이터를 분석하여 온도와 습도를 추출하는 핵심 코드입니다.
Python “openweather.py”
urequests 라이브러리: 파이썬의 requests와 유사하지만 메모리가 적은 마이크로컨트롤러에 최적화된 라이브러리입니다.data['main']['temp'] 처럼 계층적으로 접근하여 필요한 값만 쏙쏙 뽑아내는 것이 중요합니다.time.sleep()을 이용해 적절한 간격(5~10분)으로 데이터를 요청하는 것이 매너입니다.단순히 외부 날씨만 보여주는 건 조금 아쉽죠? 기능을 한 뼘 더 확장하면 내 방의 중심을 잡는 **’스마트 홈 통합 제어기’**가 탄생합니다. 제가 구상한 일석삼조의 기능은 이렇습니다.