프로젝트 07: 🌬️ 인공지능 자동 온도조절 선풍기

더우면 빨리 돌고 시원하면 멈추는, 온도를 스스로 판단하는 선풍기를 만들어 봅시다.

1. 프로젝트 원리: 온도와 속도의 상관관계

이 선풍기는 온도 센서(TMP36 또는 DHT11)를 통해 현재 온도를 실시간으로 감시합니다. 아두이노는 읽어온 온도가 설정값(예: 28도)보다 높으면 DC 모터에 전류를 보내 선풍기를 돌립니다. 이때 온도가 높을수록 PWM 신호의 듀티 사이클을 높여 팬을 더 빨리 돌리게 됩니다.

온도 센서 아두이노 DC 모터 팬
▲ 인공지능 선풍기 시스템 흐름: 감지(Input) -> 판단(Process) -> 동작(Output)

📦 준비물

아두이노 우노 x 1 온도 센서 (TMP36) x 1 DC 모터 x 1 NPN 트랜지스터 (2N2222) x 1 다이오드 (1N4004) x 1 점퍼 와이어 & 브레드보드

2. 핵심 지식: 트랜지스터(Transistor)의 역할

아두이노의 디지털 핀에서 나오는 전류는 약 40mA로 매우 약합니다. 하지만 DC 모터는 돌기 위해 훨씬 많은 전류(약 200mA 이상)가 필요하죠.

이때 트랜지스터를 사용합니다. 트랜지스터는 아두이노의 약한 신호를 받아 외부 전원의 큰 전류를 모터로 흘려보내는 전자식 스위치 역할을 합니다.

⚠️ 다이오드를 잊지 마세요!

모터가 멈출 때 역기전력(반대로 흐르는 전기)이 발생해 아두이노를 고장 낼 수 있습니다. 이를 방지하기 위해 모터와 나란히 다이오드를 연결하여 한 방향으로만 전기가 흐르게 보호해야 합니다.

3. 상세 회로 결선도 (Wiring Diagram)

온도 센서는 A0에, 트랜지스터의 베이스(Base)는 PWM 출력이 가능한 9번 핀에 연결합니다.

Arduino Uno A0(Temp) | ~D9(Motor) | 5V | GND Transistor TMP36 DC Fan
▲ 선풍기 결선도: 트랜지스터가 모터의 전원을 통제하는 관문 역할을 합니다.

4. 코드 작성하기

TMP36 센서의 전압값을 섭씨 온도로 변환한 뒤, map() 함수를 사용해 모터 속도로 변환합니다.

int tempPin = A0;   // 온도 센서 핀
int motorPin = 9;   // 모터 제어 핀 (PWM)

void setup() {
    pinMode(motorPin, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    // 1. 온도 센서 값 읽기
    int rawValue = analogRead(tempPin);
    
    // 2. 전압을 섭씨 온도로 변환 (TMP36 기준 공식)
    float voltage = rawValue * 5.0 / 1024.0;
    float tempC = (voltage - 0.5) * 100.0;

    Serial.print("현재 온도: "); Serial.print(tempC); Serial.println(" C");

    // 3. 온도에 따른 모터 속도 결정
    int motorSpeed = 0;
    
    if (tempC > 25) { // 25도보다 높을 때만 작동
        // 25도~35도를 속도 100~255로 매칭
        motorSpeed = map(tempC, 25, 35, 100, 255);
        motorSpeed = constrain(motorSpeed, 100, 255);
    } else {
        motorSpeed = 0; // 시원하면 정지
    }

    analogWrite(motorPin, motorSpeed);
    delay(500);
}

5. 🎯 심화 챌린지: LCD 화면 추가

컴퓨터를 켜지 않고도 현재 온도와 선풍기 세기(%)를 확인할 수 있도록 **I2C LCD 모듈**을 추가해 보세요. 실제 가전제품처럼 정보가 표시되는 훨씬 완성도 높은 프로젝트가 됩니다!