알렉사(Alexa)로 천장 선풍기 제어하기 - 단계별 가이드
부품 및 소모품
| 라즈베리 파이 3 모델 B (로컬 서버용) |
1개 |
| 아두이노 우노 (릴레이 제어용) |
1개 |
| 릴레이 모듈 (5V, 아두이노 직접 구동 가능) |
1개 |
| 팬 레귤레이터 (구형 저항식 권장, 단자 접근 용이) |
1개 |
필요 도구
앱 및 온라인 서비스
- 아두이노 IDE
- Amazon Alexa Skills Kit (개발자 콘솔)
- ngrok (로컬 서버 외부 노출용 터널링)
프로젝트 소개
일반 천장 선풍기를 알렉사 음성 명령으로 켜기/끄기, 풍속 올리기/내리기 제어하는 시스템입니다. 아키텍처: 알렉사 → ngrok 터널 → 라즈베리파이(Flask 서버) → 시리얼 → 아두이노 → 릴레이 → 팬 레귤레이터
라즈베리파이 서버 설정
- 패키지 설치:
sudo apt-get install python-pip
pip install flask flask-ask
sudo apt-get install python-serial libpython2.7-dev
- 파이썬 서버 코드 실행 (자동 시작 등록 권장):
from flask import Flask
from flask_ask import Ask, statement
import serial
ser = serial.Serial("/dev/ttyAMA0", 9600)
app = Flask(__name__)
ask = Ask(app, '/')
@ask.launch
@ask.intent("FanOn")
def on():
ser.write(b'1')
return statement("Ceiling Fan turned on.")
@ask.intent("FanOff")
def off():
ser.write(b'0')
return statement("Ceiling Fan turned off.")
@ask.intent("FanLevelUp")
def up():
ser.write(b'+')
return statement("Ceiling Fan speed up.")
@ask.intent("FanLevelDown")
def down():
ser.write(b'-')
return statement("Ceiling Fan speed down.")
if __name__ == "__main__":
app.run(debug=True)
- ngrok 다운로드(ARM용) → 압축 해제 →
./ngrok http 5000 실행 → 생성된 HTTPS URL 복사
알렉사 스킬 생성
- Amazon Developer Console 로그인 → Alexa Skills Kit → 'Add new skill'
- 스킬 이름/호출 이름 설정 (예: "천장 선풍기", "팬")
- 인텐트 스키마 정의:
{ "intents": [
{ "intent": "FanOn" }, { "intent": "FanOff" },
{ "intent": "FanLevelUp" }, { "intent": "FanLevelDown" }
] }
- 샘플 발화(utterances) 등록:
FanOn say fan on
FanOn say on
FanOff say off
FanOff say fan off
FanLevelUp say fan level up
FanLevelUp say increase fan speed
FanLevelDown say fan level down
FanLevelDown say decrease fan speed
- 엔드포인트: HTTPS 선택 → ngrok HTTPS URL 붙여넣기 → SSL 인증서 '두 번째 옵션' 선택
- 테스트: ngrok과 파이썬 서버 실행 중일 때 알렉사 시뮬레이터 또는 실기기에서 "알렉사, 팬 켜줘" 등 테스트
아두이노 코드
int Fan[] = {13, 12, 11, 10, 9, 8}; // 릴레이 6개 (풍속 0~5단계)
int n = 0;
void reset() {
for (int i = 0; i < 6; i++) digitalWrite(Fan[i], LOW);
}
void set(char x) {
switch (x) {
case '1': n = 1; break; // 켜기 (1단)
case '+': n++; break; // 풍속 올리기
case '-': n--; break; // 풍속 내리기
case '0': n = 0; break; // 끄기
}
if (n < 0) n = 0;
if (n > 5) n = 5;
digitalWrite(Fan[n], HIGH);
}
void setup() {
for (int i = 0; i < 6; i++) pinMode(Fan[i], OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
char x = Serial.read();
reset();
set(x);
}
}
하드웨어 연결
- 아두이노 D8~D13 → 릴레이 모듈 IN1~IN6
- 릴레이 COM/NO → 팬 레귤레이터의 각 풍속 단자 탭 연결 (공통선은 전원선)
- 아두이노 USB → 라즈베리파이 USB (시리얼 통신, /dev/ttyAMA0 또는 /dev/ttyUSB0)
- 팬 레귤레이터 입력 → 메인 전원

확장 아이디어
같은 방식으로 다른 가전제품(에어컨, 조명 등)도 음성 제어 가능. 릴레이 채널 수와 인텐트만 확장하면 됨.