#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SSD1306_I2C_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
float hum;
float temp;
const int HigherTemp = 27;
const int LowerTemp = 15;
const int ledCount = 10;
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; // an array of pin numbers to which LEDs are attached
enum State {
Red,
Green,
Blue
};
State currentState;
const int LED1_Red = 2;
const int LED2_Blue = 4;
const int LED3_Green = 3;
void setup() {
// Initialize serial communication
Serial.begin(9600);
// Initialize DHT sensor
dht.begin();
// Initialize I2C communication and OLED display
Wire.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// Initialize LED pins as OUTPUT
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT);
}
pinMode(LED1_Red, OUTPUT);
pinMode(LED2_Blue, OUTPUT);
pinMode(LED3_Green, OUTPUT);
}
void loop() {
// Read humidity and temperature from DHT sensor
hum = dht.readHumidity();
temp = dht.readTemperature();
// Calculate the LED level based on temperature
int ledLevel = map(temp, LowerTemp, HigherTemp, 0, ledCount);
// Clear the OLED display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Temperature: " + String(temp) + "C");
display.display();
// Set LED states based on the LED level
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
if (thisLed < ledLevel) {
digitalWrite(ledPins[thisLed], HIGH);
} else {
digitalWrite(ledPins[thisLed], LOW);
}
}
// Determine LED state based on temperature for the RGB LEDs
if (temp >= LowerTemp && temp <= HigherTemp) {
currentState = Green;
} else if (temp < LowerTemp) {
currentState = Blue;
} else if (temp > HigherTemp) {
currentState = Red;
}
// Set RGB LED states based on the current state
switch (currentState) {
case Green:
digitalWrite(LED1_Red, LOW);
digitalWrite(LED2_Blue, LOW);
digitalWrite(LED3_Green, HIGH);
break;
case Blue:
digitalWrite(LED1_Red, LOW);
digitalWrite(LED2_Blue, HIGH);
digitalWrite(LED3_Green, LOW);
break;
case Red:
digitalWrite(LED1_Red, HIGH);
digitalWrite(LED2_Blue, LOW);
digitalWrite(LED3_Green, LOW);
break;
}
// Delay for a while (you can adjust the delay time)
delay(2000);
}