#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Ultrasonic.h>
#define NTC_PIN A1
#define SERVO_PIN 11
#define LED_PIN 4
#define ALARME_BUZZER_PIN 6
#define I2C_ADDRESS 0x27
Ultrasonic ultrasonic(2, 1);
Servo servoValvula;
LiquidCrystal_I2C lcd(I2C_ADDRESS, 16, 2);
const float BETA = 3950; // Coeficiente beta do termistor
void setup() {
Serial.begin(9600);
pinMode(ALARME_BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
servoValvula.attach(SERVO_PIN);
lcd.init();
lcd.backlight();
}
void loop() {
// Leitura da temperatura do NTC
int valorADC = analogRead(NTC_PIN);
int analogValue = analogRead(NTC_PIN);
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
float temperatura = celsius;
// Leitura da distância pelo sensor ultrassônico
float distancia = ultrasonic.distanceRead(CM);
// Calcula a posição do servo baseado na temperatura
int servoPos;
if (temperatura < 40) {
servoPos = map(temperatura, 0, 40, 180, 0); // Válvula mais fechada quando temperatura é baixa
} else {
servoPos = map(temperatura, 40, 80, 0, 180); // Válvula mais aberta quando temperatura é alta
}
// Ajusta a posição do servo da válvula
servoValvula.write(servoPos);
// Exibição dos parâmetros no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print(" C");
// Exibição do status da válvula no LCD
if (servoPos == 0) {
lcd.setCursor(0, 1);
lcd.print("Valvula: FECHADA");
} else {
lcd.setCursor(0, 1);
lcd.print("Valvula: ");
lcd.print(map(servoPos, 0, 180, 0, 100));
lcd.print("%");
}
// Verifica se a temperatura passou de 60 graus
if (temperatura > 60) {
digitalWrite(LED_PIN, HIGH); // Acende o LED
} else {
digitalWrite(LED_PIN, LOW);
}
// Verifica se a distância é maior que 40cm
if (distancia < 40) {
tone(ALARME_BUZZER_PIN, 1000); // Ativa o buzzer
} else {
noTone(ALARME_BUZZER_PIN); // Desativa o buzzer
}
delay(1000);
}