#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
// --- Mapeamento de Pinos ---
#define POT_PIN 32
#define LDR_PIN 35
#define BUTTON_PIN 14
#define DHTPIN 4
#define BUZZER_PIN 23
#define LED_R_PIN 27
#define LED_G_PIN 26
#define LED_B_PIN 25
#define DHTTYPE DHT22
#define LUX_THRESHOLD 1500
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
const float GAMMA = 0.7;
const float RL10 = 50;
// Variáveis globais
volatile bool rgb_enabled = true;
volatile unsigned long last_interrupt_time = 0;
float temperature = 0.0;
int lux_value = 0;
int pot_value = 0;
bool temp_warning = false;
void IRAM_ATTR handleButtonInterrupt() {
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 200) {
rgb_enabled = !rgb_enabled;
last_interrupt_time = interrupt_time;
}
}
void writeRgb(int r, int g, int b) {
analogWrite(LED_R_PIN, r);
analogWrite(LED_G_PIN, g);
analogWrite(LED_B_PIN, b);
}
void readSensors() {
temperature = dht.readTemperature();
if ((temperature < 0 || temperature > 30)) {
temp_warning = true;
} else {
temp_warning = false;
}
int analogValue = analogRead(LDR_PIN);
float volts = analogValue / 4095.0 * 3.3;
float resistance = 2000 * volts / (3.3 - volts);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1.0 / GAMMA));
lux_value = lux / 10;
pot_value = analogRead(POT_PIN);
}
void setLedColorFromPot(int value) {
int r=0, g=0, b=0;
if (value < 820) { // Vermelho -> Laranja
r = 4095;
g = map(value, 0, 819, 0, 2650);
b = 0;
} else if (value < 1640) { // Laranja -> Amarelo
r = 4095;
g = map(value, 820, 1639, 2650, 4095);
b = 0;
} else if (value < 2460) { // Amarelo -> Branco
r = 4095;
g = 4095;
b = map(value, 1640, 2459, 0, 4095);
} else if (value < 3280) { // Branco -> Azul Claro
r = map(value, 2460, 3279, 4095, 0);
g = map(value, 2460, 3279, 4095, 3200);
b = 4095;
} else { // Azul Claro -> Azul
r = 0;
g = map(value, 3280, 4095, 3200, 0);
b = 4095;
}
writeRgb(r, g, b);
}
void updateRgbLed() {
if (!rgb_enabled || temp_warning || lux_value > LUX_THRESHOLD) {
writeRgb(0, 0, 0);
} else {
setLedColorFromPot(pot_value);
}
}
void updateBuzzer() {
if (rgb_enabled && temp_warning) {
tone(BUZZER_PIN, 2000);
} else {
noTone(BUZZER_PIN);
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LDR_PIN, INPUT);
pinMode(POT_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_R_PIN, OUTPUT);
pinMode(LED_G_PIN, OUTPUT);
pinMode(LED_B_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
writeRgb(0, 0, 0);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonInterrupt, FALLING);
lcd.init();
lcd.backlight();
}
void loop() {
if (rgb_enabled) {
readSensors();
updateBuzzer();
updateRgbLed();
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(temperature));
lcd.setCursor(0, 1);
lcd.print("Lux: " + String(lux_value));
} else {
updateBuzzer();
updateRgbLed();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("OFF");
}
delay(100);
}