#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_NeoPixel.h>
#define DHTPIN 2 // Pino do DHT22
#define DHTTYPE DHT22 // Tipo do sensor DHT22
#define ONE_WIRE_BUS 3 // Pino do DS18B20
#define LED_PIN_TEMP 6 // Pino de controle dos LEDs WS2812B para temperatura
#define LED_PIN_HUM 9 // Pino de controle dos LEDs WS2812B para umidade
#define BUZZER_PIN 7 // Pino do buzzer
#define BUTTON_PIN_ON 8 // Pino do push button ON
#define BUTTON_PIN_OFF 4 // Pino do push button OFF
#define NUMPIXELS_TEMP 18 // Número de LEDs WS2812B para temperatura
#define NUMPIXELS_HUM 6 // Número de LEDs WS2812B para umidade
DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_NeoPixel pixelsTemp(NUMPIXELS_TEMP, LED_PIN_TEMP, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixelsHum(NUMPIXELS_HUM, LED_PIN_HUM, NEO_GRB + NEO_KHZ800);
float lastTemperature = -999.0; // Armazena a última leitura da temperatura
unsigned long lastToneTime = 0; // Armazena o tempo da última emissão de som
unsigned long toneDuration = 2000; // Duração máxima do som
unsigned long previousMillis = 0; // Variável para armazenar o tempo anterior no efeito arco-íris
const long interval = 100; // Intervalo para o efeito de arco-íris
bool soundOnOff = true; // Controle de som
void setup() {
Serial.begin(9600);
dht.begin();
sensors.begin();
pixelsTemp.begin();
pixelsHum.begin();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN_ON, INPUT_PULLUP); // Configura o botão como entrada com pull-up interno
pinMode(BUTTON_PIN_OFF, INPUT_PULLUP); // Configura o botão como entrada com pull-up interno
noTone(BUZZER_PIN); // Garante que o buzzer esteja desligado inicialmente
// Inicializa os LEDs com as cores do arco-íris para temperatura
setRainbow();
Serial.print("Sound Enabled: ");
Serial.println(soundOnOff);
}
void loop() {
// Leitura da temperatura e umidade
float humidity = dht.readHumidity();
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
// Verifica se a leitura falhou
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Falha na leitura do sensor!");
return;
}
// Exibe os valores lidos no Serial Monitor
Serial.print("Temperatura: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Umidade: ");
Serial.print(humidity);
Serial.println(" %");
// Verifica o estado do botão
if (digitalRead(BUTTON_PIN_OFF) == LOW) {
soundOnOff = false; // Desativa o som se o botão for pressionado
Serial.print("Sound Desativa: ");
}
// Verifica o estado do botão
if (digitalRead(BUTTON_PIN_ON) == LOW) {
soundOnOff = true; // Ativa o som se o botão for pressionado
Serial.print("Sound Ativa: ");
}
// Verifica se a temperatura mudou significativamente
if (abs(temperature - lastTemperature) > 0.1) {
if (temperature > lastTemperature) {
emitTone(400); // Som para aumento de temperatura
} else {
emitTone(300); // Som para diminuição de temperatura
}
lastTemperature = temperature; // Atualiza a última temperatura lida
}
// Verifica se a temperatura ou umidade está fora do intervalo desejado
if (millis() - lastToneTime > toneDuration) { // Limita o som a no máximo 2 segundos
if (temperature > 35) {
emitTone(500); // Tom para temperatura alta
} else if (humidity < 20 || humidity > 80) {
emitTone(600); // Tom para umidade fora do intervalo
}
lastToneTime = millis(); // Atualiza o tempo do último tom emitido
}
// Atualiza os LEDs de acordo com a temperatura
updateLEDsTemperature(temperature);
// Atualiza os LEDs de acordo com a umidade
updateLEDsHumidity(humidity);
delay(500); // Controle de tempo para o loop
}
void setRainbow() {
// Define as cores do arco-íris nos LEDs de temperatura
for (int i = 0; i < NUMPIXELS_TEMP; i++) {
if (i < 3) {
pixelsTemp.setPixelColor(i, pixelsTemp.Color(0, 0, 255)); // Azul para temperaturas negativas
} else if (i < 6) {
pixelsTemp.setPixelColor(i, pixelsTemp.Color(75, 0, 130)); // Roxo para temperaturas de 0 a 10
} else if (i < 9) {
pixelsTemp.setPixelColor(i, pixelsTemp.Color(0, 255, 0)); // Verde para temperaturas de 10 a 24
} else if (i < 12) {
pixelsTemp.setPixelColor(i, pixelsTemp.Color(255, 165, 0)); // Laranja para temperaturas de 25 a 29
} else {
pixelsTemp.setPixelColor(i, pixelsTemp.Color(255, 0, 0)); // Vermelho para temperaturas acima de 29
}
}
pixelsTemp.show();
}
void updateLEDsTemperature(float temperature) {
// Determina o índice do LED que pisca
int blinkIndex = getLedIndex(temperature);
// Pisca o LED correspondente à temperatura atual
pixelsTemp.setPixelColor(blinkIndex, pixelsTemp.Color(255, 255, 255)); // Branco piscando
pixelsTemp.show();
delay(250); // Pisca por 250ms
setRainbow(); // Retorna à cor padrão do arco-íris
// Verifica a temperatura para aplicar o efeito de arco-íris
if (temperature > 50) {
rainbowEffect(); // Aplica efeito de arco-íris nos últimos 3 LEDs
} else {
setRedLastThree(); // Mantém os últimos 3 LEDs vermelhos
}
pixelsTemp.show();
}
void updateLEDsHumidity(float humidity) {
// Define as cores dos LEDs de umidade de acordo com os parâmetros ideais e críticos
for (int i = 0; i < NUMPIXELS_HUM; i++) {
if (humidity < 20 || humidity > 80) {
pixelsHum.setPixelColor(i, pixelsHum.Color(255, 0, 0)); // Vermelho para umidade crítica
} else if (humidity >= 20 && humidity < 30) {
pixelsHum.setPixelColor(i, pixelsHum.Color(255, 255, 0)); // Amarelo para umidade moderadamente baixa
} else if (humidity >= 30 && humidity <= 60) {
pixelsHum.setPixelColor(i, pixelsHum.Color(0, 255, 0)); // Verde para umidade ideal
} else if (humidity > 60 && humidity <= 80) {
pixelsHum.setPixelColor(i, pixelsHum.Color(0, 0, 255)); // Azul para umidade moderadamente alta
}
}
pixelsHum.show();
}
void setRedLastThree() {
// Configura os últimos 3 LEDs como vermelho
for (int i = 15; i < 18; i++) {
pixelsTemp.setPixelColor(i, pixelsTemp.Color(255, 0, 0)); // Vermelho
}
pixelsTemp.show();
}
void rainbowEffect() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Move as cores do arco-íris nos últimos 3 LEDs
for (int i = 15; i < 18; i++) {
int pixelHue = (millis() / 5 + i * 10) % 255; // Ajuste a velocidade conforme necessário
pixelsTemp.setPixelColor(i, pixelsTemp.ColorHSV(pixelHue * 256, 255, 255));
}
pixelsTemp.show();
}
}
int getLedIndex(float temperature) {
// Define o índice do LED que deve piscar com base na temperatura
if (temperature < 0) return 0; // Temperaturas negativas
else if (temperature < 10) return 2; // 0 a 10 graus Celsius
else if (temperature < 24) return 5; // 10 a 24 graus Celsius
else if (temperature < 29) return 10; // 25 a 29 graus Celsius
else if (temperature < 50) return 15; // 29 a 50 graus Celsius
else return 17; // Acima de 50 graus Celsius
}
void emitTone(int frequency) {
if (soundOnOff) { // Verifica se o som está ativado
tone(BUZZER_PIN, frequency, 700); // Toca o tom por 1 segundo
delay(500); // Espera 1 segundo
noTone(BUZZER_PIN); // Desliga o som
}
}