# 버튼을 세 번 누르는 일을 없애려고 커스텀 PCB를 설계함

> Clean Markdown view of GeekNews topic #31941. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=31941](https://news.hada.io/topic?id=31941)
- GeekNews Markdown: [https://news.hada.io/topic/31941.md](https://news.hada.io/topic/31941.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-07-29T15:01:32+09:00
- Updated: 2026-07-29T15:01:32+09:00
- Original source: [blog.tymscar.com](https://blog.tymscar.com/posts/opensourcedimmer/)
- Points: 1
- Comments: 0

## Topic Body

- 항상 밝기 3단계로 켜지는 야간등을 1단계로 낮추기 위해, 전원이 들어오면 버튼을 세 번 대신 눌러주는 **ATtiny85 기반 PCB**를 제작함
- 커패시터 강하 전원은 수 mA만 공급하므로 ESP8266이나 Raspberry Pi Zero 대신, 1MHz에서 1mA 미만을 소비하고 절전 시 μA 수준으로 내려가는 **ATtiny85**를 선택함
- 8.3V를 3.3V로 낮추는 HT7333과 버튼을 접지로 단락하는 2N3904를 중심으로 회로를 구성하고, **EasyEDA와 JLCPCB**로 설계·제작함
- Raspberry Pi 3의 GPIO와 avrdude로 칩을 프로그래밍했으며, Home Assistant가 야간등을 켜면 잠시 기다린 뒤 버튼을 세 번 눌러 **최저 밝기**로 자동 전환함
- 설계 파일과 C 코드는 **MIT 라이선스**로 공개했지만, 내부 전압이 4~12V이고 버튼 입력이 접지로 단락되는 기기에만 적용할 수 있으며 변압기 없는 상용 전원 기기는 각별한 주의가 필요함

---

### 매일 반복하던 세 번의 버튼 조작
- Home Assistant는 휴대전화가 수면 집중 모드에 들어가면 Zigbee 벽면 플러그를 통해 야간등을 켜도록 구성돼 있음
- 저가형 야간등에는 자동 점등 여부를 정하는 스위치와 밝기 단계를 바꾸는 버튼이 있지만, 전원을 켤 때마다 **밝기 3단계**에서 시작함
  - 버튼을 한 번 누르면 4단계, 다시 누르면 5단계, 세 번째에 1단계가 됨
  - 원하는 최저 밝기를 얻으려면 매일 밤 버튼을 세 번 눌러야 했음
- 내부를 열어봤지만 칩 이름이 보이지 않았고 조절용 가변저항도 없었음
- 버튼을 약 10초간 누르면 EEPROM의 기본 밝기를 바꿀 수 있다는 온라인 방법도 해당 제품에서는 동작하지 않았음

### 제한된 전력에 맞춘 마이크로컨트롤러
- 버튼 입력을 자동으로 만드는 **마이크로컨트롤러**가 가장 적합한 해결책이었음
- 야간등은 변압기 대신 커패시터로 상용 전압을 낮추기 때문에 전원부에서 수 mA만 공급할 수 있음
  - Wemos D1 Mini의 ESP8266은 부팅하고 무선 기능을 켤 때 수백 mA가 필요함
  - Raspberry Pi Zero는 운영체제를 부팅해야 하는 완전한 Linux 컴퓨터임
  - 두 장치 모두 별도 전원이나 부팅 순간을 견딜 대형 저장 커패시터와 추가 회로가 필요했음
- 최종 선택한 **ATtiny85**는 고전적인 Arduino와 같은 AVR 계열이며 Arduino IDE로 코드를 작성할 수 있음
  - 1MHz 동작 시 소비 전류가 1mA 미만임
  - 절전 상태에서는 석영시계와 비슷한 μA 수준으로 내려감
  - 야간등 LED는 ATtiny85보다 수천 배 많은 전력을 사용함

### 실제 버튼 누름을 재현하는 회로
- 야간등 내부 전원 레일은 8.3V이고 ATtiny85에는 3.3V가 필요해 **HT7333 전압 레귤레이터**를 사용함
- **2N3904 트랜지스터**가 버튼 신호선을 접지로 단락해 실제로 버튼을 누르는 동작을 재현함
- 주변 부품은 전류 제한과 오입력 방지, 전원 안정화를 담당함
  - ATtiny85와 트랜지스터 사이의 1kΩ 저항은 트랜지스터로 흐르는 구동 전류를 제한함
  - 10kΩ 저항은 전원이 켜지는 동안 트랜지스터를 꺼진 상태로 유지해 의도하지 않은 버튼 입력을 막음
  - 소형 커패시터 3개는 전압 레귤레이터와 칩에 공급되는 전원을 평활함
  - 3핀 헤더는 전원·접지·버튼 신호선에 연결됨
- 정해진 횟수만큼 버튼을 대신 눌러주는 범용 장치로 활용하고 PCB 제작 과정도 배우기 위해 별도 기판으로 설계함

### EasyEDA에서 회로와 기판 설계
- **EasyEDA**에서 부품과 연결 관계를 먼저 회로도로 작성함
  - `GND`, `3V3`처럼 이름이 같은 연결점은 라우터가 서로 연결함
  - 실제 사용할 부품을 지정하면 PCB 배치와 부품 명세 작성에 활용할 수 있음
- PCB 편집 단계에서는 부품 위치와 배선 경로, 기판 모양, 인쇄 요소를 직접 정할 수 있음
  - 기판에는 오픈소스 하드웨어 로고와 사용자 이름을 인쇄함
- 회로가 단순해 **단면 기판**으로 만들었으며, 복잡한 배선이나 선 길이·형상 보정은 필요하지 않았음

### JLCPCB 제작과 부품 조립
- **JLCPCB**에서 실제 부품과 조립 여부를 선택해 기판을 주문함
- 최소 주문 수량은 5장이었지만 필요한 기판은 1장뿐이어서 부품 대부분을 직접 납땜함
  - 매우 작은 저항과 커패시터는 추가 비용이 적어 JLCPCB의 조립 서비스를 이용함
- 주문 후 **4일 만에** 기판을 받음

### ATtiny85 프로그래밍과 사전 검증
- 빈 ATtiny85에는 부트로더가 없어 Arduino처럼 USB에 직접 연결할 수 없으며 별도의 프로그래머가 필요함
- Raspberry Pi 3의 GPIO와 **avrdude**를 이용해 프로그래밍함
  - Pi 헤더와 칩을 점퍼선 6개로 연결한 뒤 명령 하나를 실행함
- 야간등에 곧바로 연결하지 않고 출력 핀에 LED를 달아 동작을 먼저 검증함
  - 최종 동작은 세 번 깜빡인 뒤 계속 멈추는 순서임
  - 테스트 영상에서는 필요한 횟수를 뒤늦게 수정해 네 번 깜빡임

### 설치 과정과 상용 전원 안전
- 완성된 기판을 야간등 내부에 납땜했으며, 부품과 공간이 매우 작아 작업이 어려웠음
- 기존 기판의 대형 커패시터는 극성이 반대로 설치돼 있었고 **멀티미터 검사**로 이를 확인함
- 야간등에 변압기가 없어 추가 PCB를 설치하면 회로 전체가 상용 전원에 연결됨
  - ATtiny85는 기기에 넣기 전에 플래시해야 함
  - 설치 후에는 USB 케이블이나 Raspberry Pi를 다시 연결하면 안 됨

### 취침 자동화와 최종 동작
- 시계가 취침 상태를 휴대전화에 전달하면 휴대전화가 Home Assistant에 알리고, Home Assistant가 Zigbee 플러그를 통해 야간등을 켬
- 전원이 들어온 PCB는 야간등이 오동작하지 않도록 **잠시 기다린 뒤** 버튼을 세 번 눌러 밝기 1단계로 전환함
- 확산판 뒤로 내부 배선의 그림자가 보이지만 방 벽에는 나타나지 않아 실제 사용에는 문제가 없었음

### 오픈소스 자료와 적용 조건
- [tymscar/button-presser](https://github.com/tymscar/button-presser)에 다음 자료를 **MIT 라이선스**로 공개함
  - 동일한 기판을 제작할 수 있는 Gerber 파일
  - 부품 명세와 회로도
  - ATtiny85에서 실행되는 짧은 C 코드
- 적용 전 README에 안내된 멀티미터 검사 두 가지를 수행해야 함
- 이 회로는 내부에 **4~12V 전원 레일**이 있고, 버튼을 누를 때 신호가 접지로 단락되는 기기에서만 동작함
- 여러 저가형 기기가 이 조건에 해당하지만 모든 제품에 적용되지는 않으며, 상용 전원으로 작동하는 기기는 작업 전에 안전 지침을 확인해야 함

## Comments



_No public comments on this page._
