파블로프의 고양이: IoT 저녁 타이머로 고양이 훈련시키기
부품 및 소모품
앱 및 온라인 서비스
프로젝트 개요
고양이에게 특정 멜로디를 들으면 먹이가 나온다는 조건 반사(파블로프의 개 실험)를 심어주는 IoT 장치입니다. MKR1000 보드와 번들 부품(서보, 포토트랜지스터, 부저)만으로 제작 가능합니다. 텔레그램 봇으로 먹이 양과 멜로디 재생을 제어하고, 광센서로 고양이 접근을 감지합니다. 웹 서버 기능을 추가해 통계 웹페이지도 호스팅할 수 있습니다.
핵심 구성 요소
- 서보 모터: 골판지 상자 뚜껑을 열어 사료 배출
- 포토트랜지스터 + 220Ω 저항: 고양이 통과 시 빛 차단 감지
- 부저: 멜로디 재생 (tone() 함수 활용)
- 텔레그램 봇: 커스텀 키보드로 "멜로디+먹이", "멜로디만", "1~3인분" 버튼 제공
텔레그램 봇 커스텀 키보드 구현
TelegramKeyboard keyboard_one;
const char* MusicAndFood = "\U0001F3B6 + \U0001F36A"; // 음표 + 쿠키
const char* MusicNoFood = "\U0001F3B6 NO \U0001F36A";
const char* OnePortion = "\U0001F408"; // 고양이 1마리
const char* TwoPortion = "\U0001F408 \U0001F408";
const char* ThreePortion = "\U0001F408 \U0001F408 \U0001F408";
const char* row_one[] = {MusicAndFood, MusicNoFood};
const char* row_two[] = {OnePortion, TwoPortion, ThreePortion};
keyboard_one.addRow(row_one, 2);
keyboard_one.addRow(row_two, 3);
봇이 받는 이모지는 유니코드 이스케이프 시퀀스(예: ud83cudfb6)로 수신됨에 주의.
고양이 감지 로직
unsigned long timer;
bool startDetecting = true;
int threshold = 200; // 환경에 맞게 조정
void loop() {
if (startDetecting) {
int value = analogRead(A6);
if (value < threshold) {
Serial.println("cat detected!");
startDetecting = false;
} else if (millis() - timer > 120000) { // 2분 타임아웃
Serial.println("no cat detected in the past two minutes");
startDetecting = false;
}
}
}
서보 제어 (먹이 양 조절)
int PortionAmount = 1; // 텔레그램으로 변경 가능
void moveServo() {
for (pos = 0; pos <= 90; pos++) { myservo.write(pos); delay(15); }
delay(PortionAmount * 300); // 열린 시간으로 양 조절
for (pos = 90; pos >= 0; pos--) { myservo.write(pos); delay(15); }
}
#ProTip: 웹 서버로 통계 확인
MKR1000의 AP 모드로 웹페이지 호스팅. 텔레그램으로 "Server" 명령 시 IP 주소 전송, 브라우저에서 접속해 고양이 감지 기록(먹이 여부, 감지 여부, 소요 시간) 테이블 확인 가능. "BACKBUTTON"으로 봇 모드 복귀.
회로도 및 케이스
- 회로도:

- 케이스: 2mm 골판지 DXF 파일 (
pavlovcase_ShVm1OJRIF.dxf)
학습 목표
- 텔레그램 봇 커스텀 키보드 관리
- MKR1000 웹 서버(AP 모드) 구축