#include <DHT.h>
#include <ESP32Servo.h>
#define DHTTYPE DHT22
#define DHTPIN 4
#define BUZZER_PIN 23
// Variaveis de pinos
int sensorTemperatura = A0;
int sensorInclinacao = 5;
int motorPT1 = 11;
int motorPT2 = 6;
int led_verde = 16;
int led_vermelho = 17;
const int servoPin1 = 14;
const int servoPin2 = 12;
boolean volatile status = true;
// Variaveis globais
Servo servo;
float temperature = 0.0;
bool statusGeral = true;
volatile bool controleInc = false;
volatile bool temp_warning = false;
bool controleGas = false;
int posicaoServoAtual = 90; // Adicionada variável para controlar posição do servo
DHT dht(DHTPIN, DHTTYPE);
// Millis
unsigned long tempoAnterior = 0;
const long intervalo = 1000;
// Interrupcao
volatile bool flagInterrupcao = false;
bool estadoAnterior = false;
const unsigned long debounceDelay = 200;
unsigned long lastInterruptTime = 0;
bool calculoTemperatura() {
temperature = dht.readTemperature();
if((temperature < 20 || temperature > 30)){
return true;
}else{
return false;
}
}
void updateLed() {
// Condições para o LED estar DESLIGADO:
// 1. O sistema foi desabilitado pelo botão.
// 2. A temperatura está fora da faixa segura (0 a 30 ºC).
// 3. O ambiente está claro (valor do LDR acima do limiar).
while (!status || temp_warning) {
digitalWrite(led_vermelho, HIGH);
digitalWrite(led_verde, LOW);
Serial.println("Temperatura fora da faixa");
temp_warning = calculoTemperatura();
delay(1000);
}
digitalWrite(led_verde, HIGH);
digitalWrite(led_vermelho, LOW);
}
void updateBuzzer() {
// Condições para o Buzzer LIGAR:
// 1. O sistema está habilitado.
// 2. A temperatura é inferior a 0ºC OU superior a 30ºC.
if (status && temp_warning) {
tone(BUZZER_PIN, 2000); // Liga o buzzer
} else {
noTone(BUZZER_PIN);
}
}
void setup() {
Serial.begin(9600);
pinMode(26, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP);
pinMode(led_vermelho, OUTPUT);
pinMode(led_verde, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(sensorInclinacao, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(26), parada, FALLING);
servo.attach(servoPin1, 500, 2400);
servo.attach(servoPin2, 500, 2400);
digitalWrite(led_verde, HIGH);
}
void parada() {
unsigned long interruptTime = millis();
if (interruptTime - lastInterruptTime > debounceDelay) {
// Apenas registramos a mudança de estado
status =!status;
lastInterruptTime = interruptTime;
}
}
/*bool verificarInclinacao() {
return digitalRead(sensorInclinacao);
}*/
/*void atualizarMotores() {
if (statusGeral) {
analogWrite(motorPT1, valorMotorPT1);
analogWrite(motorPT2, valorMotorPT2);
} else {
analogWrite(motorPT1, 0);
analogWrite(motorPT2, 0);
}
} */
// Nova função para atualizar a posição do servo
void atualizarServo(bool inclinacaoCritica) {
int novaPosicao;
if (inclinacaoCritica) {
novaPosicao = 180; // Posição quando há inclinação crítica
} else {
novaPosicao = 90; // Posição normal/padrão
}
// Atualiza o servo apenas se a posição mudar
/* if (novaPosicao != posicaoServoAtual) {
meuServo.write(novaPosicao);
posicaoServoAtual = novaPosicao;
}*/
}
void loop() {
if(status){
digitalWrite(led_verde, HIGH);
digitalWrite(led_vermelho, LOW);
controleInc = digitalRead(13);
temp_warning = calculoTemperatura();
updateLed();
updateBuzzer();
Serial.print("inclinação: ");
Serial.println(String(controleInc));
}else{
digitalWrite(led_vermelho, HIGH);
digitalWrite(led_verde, LOW);
Serial.println("parada solicitada");
}
delay(100);
}