아두이노 우노를 활용한 햄스터 움직임 카운팅

Programming/Arduino|2025. 4. 30. 10:41
728x90
반응형

시작: 내가 자는 동안 햄스터가 얼마나 움직였는지 아침에 일어나서 확인해 보자!

 

아두이노와 연결된 16 x 2 I2C 캐릭터 LCD 창

 

 

 

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

 

 

 

위 사진상 Pin 좌측: GND / 가운데: Signal / 우측: 5V

 

 

 

Pin 1 - 2 또는 Pin 3 - 4를 스위치로 사용

 

소스 코드:

#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); // 안정적인 동작을 위한 딜레이
}

 

 

 

결과물:

(좌) 잠들기 전 카운터를 0으로 초기화 → (우) 아침에 일어나서 카운터 14 확인

 

 

 

도토리가 밤새 14번 챗바퀴 앞을 지나다녔구나..

 

 

 

다행이야! ^ㅡ^

반응형

댓글()