// Bibliotecas----------------------------------------------------------
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <math.h>
// Pinos
const int OneWireBus = 4; // DS18B20
const int sensorPin = 34; // NTC
const float BETA = 3950;
// LED RGB
const int ledR = 19;
const int ledV = 18;
const int ledB = 17;
// Timer
unsigned long tempoAnterior = 0;
const long intervalo = 1000; // 1 segundo
// Instâncias
OneWire oneWire(OneWireBus);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
sensors.begin();
lcd.init();
lcd.backlight();
// LED RGB
pinMode(ledR, OUTPUT);
pinMode(ledV, OUTPUT);
pinMode(ledB, OUTPUT);
}
void loop() {
unsigned long tempoAtual = millis();
if (tempoAtual - tempoAnterior >= intervalo) {
tempoAnterior = tempoAtual;
//NTC
float somaTemperaturas = 0;
for (int i = 0; i < 10; i++) {
int analogValue = analogRead(sensorPin);
float celsius = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
somaTemperaturas += celsius;
delay(50);
}
float mediaCelsius = somaTemperaturas / 10;
//DS18B20
sensors.requestTemperatures();
float temperaturaDS = sensors.getTempCByIndex(0);
//Serial
Serial.print("NTC: ");
Serial.print(mediaCelsius, 2);
Serial.print(" | DS: ");
Serial.println(temperaturaDS, 2);
//LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NTC:");
lcd.print(mediaCelsius, 1);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("DS:");
lcd.print(temperaturaDS, 1);
lcd.print((char)223);
lcd.print("C");
// LED RGB
if (abs(mediaCelsius - temperaturaDS) < 0.2) {
// VERDE (valores praticamente iguais)
digitalWrite(ledR, HIGH);
digitalWrite(ledV, LOW);
digitalWrite(ledB, HIGH);
} else if (mediaCelsius > temperaturaDS) {
// VERMELHO
digitalWrite(ledR, LOW);
digitalWrite(ledV, HIGH);
digitalWrite(ledB, HIGH);
} else {
// AZUL
digitalWrite(ledR, HIGH);
digitalWrite(ledV, HIGH);
digitalWrite(ledB, LOW);
}
}
}