#include "DHTesp.h"
#include "ESP32Servo.h"
#define BUZZER_PIN 12
#define PIN_SWITCH 2
#define PIN_LED 4
#define DHT_PIN 15
#define SERVO_PIN 18
#define LDR_PIN 13
#define PIN_BUTTON_OPEN 23
#define PIN_BUTTON_CLOSE 22
#define PIN_VENT 14
#define LVL_TEMP 25
#define LVL_HUM 50
#define MAX_LUX 100
#define MIN_LUX 250
#define MAX_DEGREE 180
#define MIN_DEGREE 0
bool mode_toldo = false; //Cuando sea verdadero es manual y falso es automatico
bool state_toldo = false; //Cuando sea falso esta cerrado y verdadero abierto
int temperature = 0;
int humidity = 0;
int pos = 0;
int lux = 0;
DHTesp dhtSensor;
Servo servo;
void print_info_serial(int temperature, int humidity, bool state_toldo, bool mode_toldo){
Serial.println("--------------");
if (mode_toldo == false){
Serial.println("Toldo modo: Automático");
}else{
Serial.println("Toldo modo: Manual");
}
Serial.println("Temperatura: " + String(temperature) + "ºC");
Serial.println("Humedad: " + String(humidity) + "%");
if (state_toldo == false){
Serial.println("Estado toldo: Cerrado");
}else{
Serial.println("Estado toldo: Abierto");
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
servo.attach(SERVO_PIN, 500, 2400);
servo.write(pos);
pinMode(PIN_SWITCH, INPUT);
pinMode(PIN_LED, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(PIN_BUTTON_OPEN, INPUT);
pinMode(PIN_BUTTON_CLOSE, INPUT);
pinMode(PIN_VENT, OUTPUT);
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
temperature = data.temperature;
humidity = data.humidity;
lux = analogRead(LDR_PIN);
if (digitalRead(PIN_SWITCH) == HIGH){
mode_toldo = !mode_toldo;
Serial.println("--------------");
if (mode_toldo == false){
Serial.println("Toldo modo: Automático");
}else{
Serial.println("Toldo modo: Manual");
}
delay(500);
}
if (mode_toldo == true){
digitalWrite(PIN_LED, HIGH);
if ((digitalRead(PIN_BUTTON_OPEN) == HIGH) && (pos < MAX_DEGREE)){
pos++;
servo.write(pos);
delay(10);
}
if ((digitalRead(PIN_BUTTON_CLOSE) == HIGH) && (pos > MIN_DEGREE)){
pos--;
servo.write(pos);
delay(10);
}
}else{
digitalWrite(PIN_LED, LOW);
if (state_toldo == false){
if((lux < MAX_LUX) && (humidity <= LVL_HUM)){
for (pos = MIN_DEGREE; pos <= MAX_DEGREE; pos += 1) {
servo.write(pos);
delay(15);
if(pos == MAX_DEGREE){
state_toldo = true;
print_info_serial(temperature, humidity, state_toldo, mode_toldo);
analogWrite(BUZZER_PIN, 200);
}
}
}
}else{
if((humidity > LVL_HUM) || (lux > MIN_LUX)){
for (pos = MAX_DEGREE; pos >= MIN_DEGREE; pos -= 1) {
servo.write(pos);
delay(15);
if(pos == MIN_DEGREE){
state_toldo = false;
print_info_serial(temperature, humidity, state_toldo, mode_toldo);
analogWrite(BUZZER_PIN, 200);
}
}
}
}
if (temperature >= LVL_TEMP){
digitalWrite(PIN_VENT, HIGH);
}else{
digitalWrite(PIN_VENT, LOW);
}
}
}