#include <Arduino.h>
// --- Pinos ---
#define PIN_LED_R 5
#define PIN_LED_G 26
#define PIN_LED_B 27
#define PIN_POTENTIOMETER 35
#define PIN_PHOTORESISTOR 34
#define PIN_NTC_TEMP 33
#define PIN_BUTTON 18
#define PIN_BUZZER 25
// --- PWM ---
const int PWM_FREQUENCY = 5000;
const int PWM_RESOLUTION = 8;
const int BUZZER_RESOLUTION = 10;
// --- NTC ---
const int NTC_RESISTANCE = 10000;
const int NTC_B_CONSTANT = 3950;
const int SERIES_RESISTOR = 1000;
const int NTC_TEMP_REF = 25;
// --- Controle ---
volatile bool sistemaAtivo = true;
bool ledLigado = false;
// --- Interrupção ---
void IRAM_ATTR toggleSistema() {
sistemaAtivo = !sistemaAtivo;
}
void setup() {
Serial.begin(115200);
Serial.println("Sistema iniciado...");
// PWM
ledcAttach(PIN_LED_R, PWM_FREQUENCY, PWM_RESOLUTION);
ledcAttach(PIN_LED_G, PWM_FREQUENCY, PWM_RESOLUTION);
ledcAttach(PIN_LED_B, PWM_FREQUENCY, PWM_RESOLUTION);
ledcAttach(PIN_BUZZER, PWM_FREQUENCY, BUZZER_RESOLUTION);
// Botão com interrupção
pinMode(PIN_BUTTON, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_BUTTON), toggleSistema, FALLING);
}
float convertAdcToTemperature(int adcValue) {
float resistance = (4095.0 / (float)adcValue) - 1.0;
resistance = SERIES_RESISTOR / resistance;
float steinhart = resistance / NTC_RESISTANCE;
steinhart = log(steinhart);
steinhart /= NTC_B_CONSTANT;
steinhart += 1.0 / (NTC_TEMP_REF + 273.15);
steinhart = 1.0 / steinhart;
steinhart -= 273.15;
return steinhart;
}
uint32_t hsvToRgb(uint16_t h) {
float s = 1.0, v = 1.0;
float r, g, b;
int i = floor(h / 60.0);
float f = (h / 60.0) - i;
float p = v * (1.0 - s);
float q = v * (1.0 - s * f);
float t = v * (1.0 - s * (1.0 - f));
switch (i) {
case 0: r = v, g = t, b = p; break;
case 1: r = q, g = v, b = p; break;
case 2: r = p, g = v, b = t; break;
case 3: r = p, g = q, b = v; break;
case 4: r = t, g = p, b = v; break;
default: r = v, g = p, b = q; break;
}
return (uint32_t)(r * 255) << 16 | (uint32_t)(g * 255) << 8 | (uint32_t)(b * 255);
}
void loop() {
int potValue = analogRead(PIN_POTENTIOMETER);
int ldrValue = analogRead(PIN_PHOTORESISTOR);
int tempAdc = analogRead(PIN_NTC_TEMP);
float temperatura = convertAdcToTemperature(tempAdc);
bool perigoTermico = (temperatura < 0 || temperatura > 30);
bool ambienteEscuro = (ldrValue < 100); // Valor nominal ajustável
// Determina cor via potenciômetro
uint16_t hue = map(potValue, 0, 4095, 0, 360);
uint32_t rgb = hsvToRgb(hue);
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = rgb & 0xFF;
// Lógica de controle
if (sistemaAtivo && !perigoTermico && ambienteEscuro) {
ledcWrite(PIN_LED_R, r);
ledcWrite(PIN_LED_G, g);
ledcWrite(PIN_LED_B, b);
ledLigado = true;
} else {
ledcWrite(PIN_LED_R, 0);
ledcWrite(PIN_LED_G, 0);
ledcWrite(PIN_LED_B, 0);
ledLigado = false;
}
// Buzzer
if (sistemaAtivo && perigoTermico) {
ledcWriteTone(PIN_BUZZER, 1000);
} else {
ledcWriteTone(PIN_BUZZER, 0);
}
// Monitor Serial
Serial.print("LED RGB: ");
Serial.println(ledLigado ? "ON" : "OFF");
Serial.print("Temperatura: ");
Serial.print(temperatura, 2);
Serial.println(" °C");
if (perigoTermico) {
Serial.println("Perigo! Desligar!");
}
delay(500);
}