🟢 녹색 LED (A0): 온도 20~27°C → "Perfect temperature!"
🔴 빨강 LED (A2): 온도 ≥ 29°C → "Too hot!" + 부저 울림
🔴 빨강 LED (A0): 온도 ≤ 20°C → "Too cold!" + 부저 울림
시리얼 모니터로 실시간 온습도 값 확인 가능. 초보자용 학습 프로젝트로 적합합니다.
회로 연결
DHT11 VCC → 5V, GND → GND, DATA → 디지털 핀 5
녹색 LED (Perfect) → A1, 빨강 LED (Cold) → A0, 빨강 LED (Hot) → A2 (각각 220Ω 직렬)
피에조 스피커 + → 핀 9, - → GND
전체 코드
#include <Adafruit_Sensor.h>
#include <DHT.h>
int speakerPin = 9;
#define DHTPIN 5
#define DHTTYPE DHT11
#define LED_TOO_COLD A0
#define LED_PERFECT A1
#define LED_TOO_HOT A2
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHT11 test!");
dht.begin();
}
void loop() {
pinMode(speakerPin, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
delay(2000); // DHT11 최소 2초 간격 권장
float h = dht.readHumidity();
float t = dht.readTemperature(); // 섭씨
float f = dht.readTemperature(true); // 화씨
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t");
Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C");
if (t <= 20) {
Serial.println("Too cold!");
digitalWrite(LED_TOO_COLD, HIGH);
digitalWrite(speakerPin, HIGH);
delay(1000);
digitalWrite(speakerPin, LOW);
digitalWrite(LED_TOO_COLD, LOW);
}
else if (t > 20 && t < 27) { // 원본 코드는 20 < t < 27로 작성됐으나 C++에서 이렇게 쓰면 항상 true가 됨. 올바른 조건으로 수정.
Serial.println("Perfect temperature!");
digitalWrite(LED_PERFECT, HIGH);
delay(2000);
digitalWrite(LED_PERFECT, LOW);
}
else if (t >= 29) {
Serial.println("Too hot!");
digitalWrite(LED_TOO_HOT, HIGH);
digitalWrite(speakerPin, HIGH);
delay(1000);
digitalWrite(speakerPin, LOW);
digitalWrite(LED_TOO_HOT, LOW);
}
// 27~28.9°C 구간은 아무 동작 안 함 (원본 로직 유지)
}
⚠️ 코드 수정 사항 안내
원본 코드의 if (20 < t < 27)는 C++에서 의도와 다르게 동작합니다(항상 true). 위 코드에서는 else if (t > 20 && t < 27)로 수정했습니다. 또한 pinMode는 setup()에서 한 번만 호출하는 것이 올바르나, 원본 구조를 최대한 유지하며 loop() 안에 둔 점 참고 바랍니다.