#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// Configuração do pino do DS18B20
#define ONE_WIRE_BUS 4 // Pino conectado ao DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Configuração do LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pinos do LED RGB
#define RED_PIN 13
#define GREEN_PIN 12
#define BLUE_PIN 14
// Configuração do WiFi e NTP
const char* ssid = "CBPF-IoT";
const char* password = "i20ocbt7";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", -3 * 3600); // UTC -3 para o horário de Brasília
void setup() {
// Inicializa o sensor DS18B20 e o monitor serial
sensors.begin();
lcd.init();
Serial.begin(9600);
// Configura os pinos do LED RGB como saída
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
// Conecta ao WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando ao WiFi...");
}
Serial.println("Conectado ao WiFi!");
// Inicializa o NTP
timeClient.begin();
}
void loop() {
timeClient.update();
// Solicita e lê a temperatura
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0); // Temperatura em °C
float temperatureF = temperature * 9.0 / 5.0 + 32.0;
float temperatureK = temperature + 273;
// Exibe a temperatura no monitor serial
Serial.print("Temperatura: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print(temperatureF);
Serial.println(" °F");
Serial.print(temperatureK);
Serial.println(" K");
// Formata a hora e a temperatura para exibir no LCD
int hour = timeClient.getHours();
int minute = timeClient.getMinutes();
int second = timeClient.getSeconds();
// Exibe a hora e a temperatura no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hora: ");
lcd.print(hour < 10 ? "0" : "");
lcd.print(hour);
lcd.print(":");
lcd.print(minute < 10 ? "0" : "");
lcd.print(minute);
lcd.print(":");
lcd.print(second < 10 ? "0" : "");
lcd.print(second);
lcd.setCursor(0, 1);
lcd.print("Temp C: ");
lcd.print(temperature, 1);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Temp F: ");
lcd.print(temperatureF, 1);
lcd.print(" F");
lcd.setCursor(0, 3);
lcd.print("Temp F: ");
lcd.print(temperatureK, 1);
lcd.print(" K");
// Atualiza a cor do LED RGB com transição suave
updateLEDColor(temperature);
delay(500); // Atualização a cada meio segundo
}
void updateLEDColor(float temperature) {
int redValue = 0;
int greenValue = 0;
int blueValue = 0;
if (temperature <= 23.0) {
// Gradiente de azul para verde: 15°C a 23°C
blueValue = map(temperature * 100, 1500, 2300, 255, 0); // Multiplica temperatura por 100 para precisão decimal
greenValue = map(temperature * 100, 1500, 2300, 0, 255);
redValue = 0;
} else if (temperature > 23.0 && temperature <= 26.0) {
// Gradiente de verde para vermelho: 23°C a 26°C
greenValue = map(temperature * 100, 2300, 2600, 255, 0);
redValue = map(temperature * 100, 2300, 2600, 0, 255);
blueValue = 0;
} else {
// Temperatura acima de 26°C: vermelho total
redValue = 255;
greenValue = 0;
blueValue = 0;
}
// Ajuste dos valores PWM para cada cor
analogWrite(RED_PIN, redValue);
analogWrite(GREEN_PIN, greenValue);
analogWrite(BLUE_PIN, blueValue);
}