#include <DHT.h>
#include <Servo.h>
// Pin setup
#define DHTPIN 2
#define DHTTYPE DHT22
#define RED_PIN 9
#define GREEN_PIN 10
#define BLUE_PIN 11
#define SERVO_PIN 6
DHT dht(DHTPIN, DHTTYPE);
Servo tempServo;
// Define the temperature range for mapping (adjust as needed)
float minTempF = -40.0; // = Servo at 0°
float maxTempF = 176.0; // = Servo at 180°
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
tempServo.attach(SERVO_PIN);
}
void loop() {
float tempF = dht.readTemperature(true); // true = Fahrenheit
if (isnan(tempF)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Temperature: ");
Serial.print(tempF, 1); // print with 0.1°F precision
Serial.println(" °F");
// Clamp tempF to min/max range
tempF = constrain(tempF, minTempF, maxTempF);
// Map temp to angle
float angle = mapFloat(tempF, minTempF, maxTempF, 0, 180);
tempServo.write(angle);
// Set RGB color based on general temp zone
if (tempF < 68) {
setColor(0, 0, 255); // Cold - Blue
} else if (tempF <= 82) {
setColor(0, 255, 0); // Normal - Green
} else {
setColor(255, 0, 0); // Hot - Red
}
delay(100); // Update every second
}
void setColor(int red, int green, int blue) {
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}
// Custom float map function
float mapFloat(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}