#include <DHT.h>
#include <LedControl.h>
// DHT22 configuration
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// MAX7219 configuration
#define DIN_PIN 8
#define CS_PIN 9
#define CLK_PIN 10
LedControl lc = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 1);
// Temperature thresholds
const float TEMP_MIN = 22.0;
const float TEMP_MAX = 30.0;
// Happy face pattern (8x8)
byte happyFace[8] = {
B00000000,
B01000010,
B10100101,
B00000000,
B00111100,
B00100100,
B00011000,
B00000000
};
// Sad face pattern (8x8)
byte sadFace[8] = {
B00000000, // ..####..
B00000000, // .#....#.
B11100111, // #.#..#.#
B01000010, // #......#
B00011000, // #..##..#
B00100100, // #.#..#.#
B00100100, // .#....#.
B00000000 // ..####..
};
void setup() {
Serial.begin(9600);
Serial.println("DHT22 Temperature Monitor with LED Matrix");
// Initialize DHT22 sensor
dht.begin();
// Initialize MAX7219
lc.shutdown(0, false); // Wake up display
lc.setIntensity(0, 8); // Set brightness (0-15)
lc.clearDisplay(0); // Clear display
delay(1000); // Wait for sensor to stabilize
}
void loop() {
// Read temperature from DHT22
float temperature = dht.readTemperature();
// Check if reading was successful
if (isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
delay(2000);
return;
}
// Print temperature to serial monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
// Determine which face to display
if (temperature >= TEMP_MIN && temperature <= TEMP_MAX) {
displayHappyFace();
Serial.println("Status: HAPPY - Temperature in range");
} else {
displaySadFace();
if (temperature < TEMP_MIN) {
Serial.println("Status: SAD - Too cold!");
} else {
Serial.println("Status: SAD - Too hot!");
}
}
delay(2000); // Update every 2 seconds
}
void displayHappyFace() {
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, happyFace[row]);
}
}
void displaySadFace() {
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, sadFace[row]);
}
}