#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
// Definições dos pinos
#define PINO_BOTAO 15
#define PINO_SENSOR_TEMPERATURA 12
#define PINO_LED_VERDE 8
#define PINO_LED_VERMELHO 9
#define PINO_BUZZER 21
#define PINO_SDA_LCD 37
#define PINO_SCL_LCD 39
#define PINO_SERVO_VALVULA 35
#define PINO_SERVO_OBJETO 34
// Inicialização dos objetos
OneWire oneWire(PINO_SENSOR_TEMPERATURA);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servoValvula;
Servo servoObjeto;
float temperatura;
int angulosObjeto[] = {0, 45, 90, 180}; // Ângulos configurados para o servo do objeto
int anguloObjetoIndex = 0; // Índice atual do array de ângulos para o objeto
int anguloValvula = 0; // Ângulo atual da válvula (controlado separadamente)
unsigned long tempoAnterior = 0;
unsigned long intervalo = 500; // Intervalo de 0,5 segundo entre movimentos do servo do objeto
void setup() {
pinMode(PINO_BOTAO, INPUT_PULLUP); // Configuração do botão com pull-up interno
pinMode(PINO_LED_VERDE, OUTPUT);
pinMode(PINO_LED_VERMELHO, OUTPUT);
pinMode(PINO_BUZZER, OUTPUT);
Wire.begin(PINO_SDA_LCD, PINO_SCL_LCD);
lcd.init();
lcd.backlight();
sensors.begin();
servoValvula.attach(PINO_SERVO_VALVULA);
servoObjeto.attach(PINO_SERVO_OBJETO);
servoObjeto.write(angulosObjeto[0]); // Posição inicial do servo do objeto
servoValvula.write(anguloValvula); // Válvula inicialmente fechada
}
void loop() {
// Leitura da temperatura
sensors.requestTemperatures();
temperatura = sensors.getTempCByIndex(0);
// Controle dos LEDs e buzzer com base na temperatura
if (temperatura > 30.0) { // Temperatura alta
digitalWrite(PINO_LED_VERDE, LOW);
digitalWrite(PINO_LED_VERMELHO, HIGH);
tone(PINO_BUZZER, 1000); // Som do buzzer
anguloValvula = 0; // Válvula fechada (0°)
} else if (temperatura > 20.0) { // Temperatura média
digitalWrite(PINO_LED_VERDE, HIGH);
digitalWrite(PINO_LED_VERMELHO, LOW);
noTone(PINO_BUZZER);
anguloValvula = 90; // Válvula meio aberta (90°)
} else { // Temperatura baixa
digitalWrite(PINO_LED_VERDE, HIGH);
digitalWrite(PINO_LED_VERMELHO, LOW);
noTone(PINO_BUZZER);
anguloValvula = 180; // Válvula totalmente aberta (180°)
}
servoValvula.write(anguloValvula); // Atualiza a posição do servo da válvula
// Controle automático do servo que empurra o objeto em 4 ângulos
unsigned long tempoAtual = millis();
if (tempoAtual - tempoAnterior >= intervalo) {
tempoAnterior = tempoAtual;
anguloObjetoIndex = (anguloObjetoIndex + 1) % 4; // Incrementa o índice e volta ao início se passar do último ângulo
servoObjeto.write(angulosObjeto[anguloObjetoIndex]); // Move o servo para o próximo ângulo
}
// Exibição da temperatura, ângulo da válvula e ângulo do objeto no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Valv: ");
lcd.print(anguloValvula); // Mostra o ângulo atual da válvula
lcd.print(" Obj: ");
lcd.print(angulosObjeto[anguloObjetoIndex]); // Mostra o ângulo atual do servo do objeto
// Atraso para o próximo ciclo
delay(100);
}
Loading
ds18b20
ds18b20