아두이노 우노를 활용한 햄스터 움직임 카운팅
Programming/Arduino2025. 4. 30. 10:41
728x90
반응형
시작: 내가 자는 동안 햄스터가 얼마나 움직였는지 아침에 일어나서 확인해 보자!
3일 전 분양 받은 햄스터가 톱밥을 파고 들어가서는 나오질 않는다...
아무리 야행성 동물이라고 하지만
출근 할 때 사료량과 퇴근할 때 확인한 사료량이 아무래도 변함이 없다.
아직은 적응기간이라 최대한 스트레스 주지 않으려고 했지만
건강 상에 문제가 있어서 그런가 슬슬 걱정이 된다.
첫 날은 챗바퀴도 잘 타더니 그 다음날 부터는 쭉 보이질 않는다..
그래서 항상 케이지는 빈 집 같아 보여 마음이 씁쓸했다.
아! 가지고 놀아보려고 샀다가 LED만 켜보고 구석에 짱박아 뒀던 아두이노 코딩 키트가 있었지!?
준비물:
1. Arduino Uno Board 1EA
2. I2C LCD 1EA
3. PIR Sensor 1EA
4. Push Button 1EA
5. Breadboard 1EA
6. USB Type A 보조배터리 1EA
회로 연결:
부품 | 핀 이름 | 아두이노 우노 핀 |
I2C LCD | VCC | 5V |
GND | GND | |
SDA | A4 | |
SCL | A5 | |
PIR Sensor | VCC | 5V |
GND | GND | |
OUT (Signal) | 2 | |
Push Button | 1 | GND |
2 | 3 |
소스 코드:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD 객체 생성 (PCF8574 주소, 가로 글자 수, 세로 줄 수)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// PIR 센서 핀 설정
const int pirPin = 2;
// 버튼 핀 설정
const int buttonPin = 3;
// 움직임 카운터 변수
volatile int moveCount = 0;
// 버튼 상태 변수
int buttonState = 0;
int lastButtonState = 0;
// PIR 센서 상태 변수
int pirState = LOW;
// 인터럽트 서비스 루틴 (PIR 센서 감지 시 호출)
void pirInterruptHandler() {
pirState = HIGH;
}
void setup() {
Serial.begin(9600);
// LCD 초기화
lcd.init();
lcd.backlight();
lcd.print("Hamster Counter"); // 첫 번째 줄 제목
lcd.setCursor(0, 1);
lcd.print("Movements:");
// PIR 센서 핀 모드 설정
pinMode(pirPin, INPUT);
// 버튼 핀 모드 설정 및 풀업 저항 활성화
pinMode(buttonPin, INPUT_PULLUP);
// PIR 센서에 인터럽트 연결 (핀 번호, 인터럽트 발생 조건, 호출할 함수)
attachInterrupt(digitalPinToInterrupt(pirPin), pirInterruptHandler, RISING);
}
void loop() {
// PIR 센서 감지 시 움직임 카운터 증가
if (pirState == HIGH) {
moveCount++;
pirState = LOW;
lcd.setCursor(11, 1);
lcd.print(moveCount);
lcd.print(" ");
delay(500); // 연속적인 빠른 감지 방지
}
// 버튼 상태 읽기 및 초기화
buttonState = digitalRead(buttonPin);
if (buttonState == LOW && lastButtonState == HIGH) {
moveCount = 0;
Serial.println("Counter reset!");
lcd.setCursor(11, 1);
lcd.print(moveCount);
lcd.print(" ");
}
lastButtonState = buttonState;
delay(100); // 안정적인 동작을 위한 딜레이
}
결과물:
도토리가 밤새 14번 챗바퀴 앞을 지나다녔구나..
다행이야! ^ㅡ^
반응형
댓글()