#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHTPIN 13 // Sensor de temperatura no pino 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int releSentidoHorario = 7;
int releSentidoAntiHorario = 8; // Pino do relé para sentido anti-horário
int botaoSentidoAntiHorario = 12; // Botão de controle do sentido anti-horário
int botaoPausarMotor = 4; // Botão para pausar o motor
int botaoSentidoHorario = 2; // Botão de controle do sentido horário
const byte ledPin = 12;
const byte interruptPin = 3;
volatile byte state = LOW;
bool motorLigado = false;
bool motorAtivo = true;
bool sentidoHorarioAtivo = false;
bool sentidoAntiHorarioAtivo = false;
volatile bool interrupcaoAtiva = false;
void interrupcao() {
motorAtivo = false;
sentidoHorarioAtivo = false;
sentidoAntiHorarioAtivo = false;
digitalWrite(releSentidoHorario, LOW);
digitalWrite(releSentidoAntiHorario, LOW);
lcd.setCursor(0, 0);
lcd.print("Motor pausado");
lcd.setCursor(0, 1);
lcd.print("pelo operador");
interrupcaoAtiva = true;
}
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Motor desligado");
pinMode(releSentidoHorario, OUTPUT);
pinMode(releSentidoAntiHorario, OUTPUT);
pinMode(botaoSentidoAntiHorario, INPUT);
pinMode(botaoPausarMotor, INPUT);
pinMode(botaoSentidoHorario, INPUT);
pinMode(interruptPin, INPUT_PULLUP);
digitalWrite(releSentidoHorario, LOW);
digitalWrite(releSentidoAntiHorario, LOW);
pinMode(ledPin, INPUT_PULLUP); // O botão do pino 12 é um botão de pressão
attachInterrupt(digitalPinToInterrupt(interruptPin), interrupcao, FALLING);
dht.begin();
Serial.begin(9600);
}
void loop() {
digitalWrite(ledPin, state);
if (!interrupcaoAtiva) {
if (digitalRead(botaoSentidoAntiHorario) == HIGH && motorAtivo && !sentidoAntiHorarioAtivo) {
motorLigado = true;
sentidoAntiHorarioAtivo = true;
sentidoHorarioAtivo = false;
digitalWrite(releSentidoAntiHorario, HIGH);
digitalWrite(releSentidoHorario, LOW);
lcd.setCursor(0, 0);
lcd.print("Motor ligado");
lcd.setCursor(0, 1);
lcd.print("Sentido anti-horário");
delay(1000); // Atraso de 1 segundo
} else if (digitalRead(botaoPausarMotor) == HIGH) {
interrupcao();
} else if (digitalRead(botaoSentidoHorario) == HIGH && motorAtivo && !sentidoHorarioAtivo) {
motorLigado = true;
sentidoHorarioAtivo = true;
sentidoAntiHorarioAtivo = false;
digitalWrite(releSentidoHorario, HIGH);
digitalWrite(releSentidoAntiHorario, LOW);
lcd.setCursor(0, 0);
lcd.print("Motor ligado");
lcd.setCursor(0, 1);
lcd.print("Sentido horário");
delay(1000); // Atraso de 1 segundo
}
if (motorLigado && motorAtivo) {
float temperatura = dht.readTemperature();
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" °C");
if (temperatura >= 60.0) {
motorLigado = false;
digitalWrite(releSentidoHorario, LOW);
digitalWrite(releSentidoAntiHorario, LOW);
lcd.setCursor(0, 0);
lcd.print("Motor desligado");
lcd.setCursor(0, 1);
lcd.print("Alta temperatura");
delay(5000); // Atraso de 5 segundos
}
}
} else {
if (digitalRead(interruptPin) == HIGH) {
interrupcaoAtiva = false;
lcd.clear();
}
}
}