//Librerías
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Time.h>
#include <DHT.h>
#include <ESP32Servo.h> //Librería Servomotor
#define Buzzer_pin 2 //Pin del buzzer
#define LED_pin 17 //Pin del led
#define Servo_pin 15 //Pin del servo
#define Rele_pin 16 //Pin del relé
#define IN1_pin 18 //Pin IN1 de L298N
#define IN2_pin 5 //Pin IN2 de L298N
#define ENA_pin 26 //Pin ENA de L298N
Servo servo;
int PULSOMIN = 1000; //Pulso mínimo de servomotor para calibración del servomotor
int PULSOMAX = 2000; //Pulso máximo de servomotor para calibración del servomotor
int ANGULO = 0; //Inicia el valor del ángulo en 0
//Inicialización de la pantalla OLED
#define ANCHO 128
#define ALTO 64
#define OLED_RESET 4
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);
//Pines
#define JSV_pin 36 //Pin del eje vertical del joystick
#define JSH_pin 39 //Pin del eje horizontal del joystick
#define JSS_pin 14 //Pin pulsador del joystick
#define LDR_pin 35 //Pin del sensor LDR
#define PIR_pin 32 //Pin del sensor PIR
#define DHT_pin 33 //Pin del sensor DHT
ESP32Time rtc; //Inicia la estructura ESP32Time
DHT dht(DHT_pin, DHT22);
int Contador_desplazamiento = 0; //Contador de desplazamiento en el menú
int ID = 0; //Variable global de ID de menú
void Menu (String lista[], int n, int JS_Vertical) {
oled.setCursor(0, 5);
for (int i = Contador_desplazamiento; i < n; i++) {
if (i == Contador_desplazamiento) {
oled.setTextSize(2);
} else {
oled.setTextSize(1);
}
oled.println(lista[i]);
}
if (JS_Vertical == -1 && Contador_desplazamiento < n - 1) {
Contador_desplazamiento++;
} else if (JS_Vertical == 1 && Contador_desplazamiento > 0) {
Contador_desplazamiento--;
}
}
void setup() {
Serial.begin(9600); //Inicialización de la comunicación Serial
Wire.begin(); //Inicialización de la comunicación con la pantalla OLED
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Inicialización de la pantalla OLED
pinMode(JSS_pin, INPUT_PULLUP); //Pin del pulsador del joystick como entrada
pinMode(PIR_pin, INPUT); //Pin del pulsador del joystick como entrada
rtc.setTime(0, 30, 15, 5, 2, 2024); //(segundo, minuto, hora, día, mes, año)
dht.begin();
}
void loop() {
String Menu_Principal[] = {"Monitoreo", "Salidas", "Reloj", "Memoria"};
String Menu_Monitoreo[] = {"Luz", "Movimiento", "Temp", "Humedad", "Sonido"};
String Menu_Salidas[] = {"Servo", "Rele", "Motor"};
String Menu_Reloj[] = {"Mostrar", "Conf"};
String Menu_Servo[] = {"+10", "-10"};
String Menu_Rele[] = {"ON", "OFF"};
String Menu_Motor[] = {"ON", "OFF", "Giro R", "Giro L"};
int JS_Vertical = map(analogRead(JSV_pin), 0, 4095, -1, 1);
int JS_Horizontal = map(analogRead(JSH_pin), 0, 4095, -1, 1);
int JS_Switch = digitalRead(JSS_pin);
int LDR_data = 9194*pow(2.72, (-0.00258*analogRead(LDR_pin)));
int PIR_data = digitalRead(PIR_pin);
oled.clearDisplay(); //Limpia la pantalla
oled.setTextColor(WHITE); //Color de la pantalla monocromática
if (JS_Switch == 0) {
if (ID == 0) {
ID = 10*(Contador_desplazamiento + 1);
Contador_desplazamiento = 0;
} else if (ID == 10 || ID == 20 || ID == 30) {
ID = ID + Contador_desplazamiento + 1;
Contador_desplazamiento = 0;
} else if (ID == 22) {
if (Contador_desplazamiento == 0) {
digitalWrite(Rele_pin, 1);
} else {
digitalWrite(Rele_pin, 0);
}
}
}
if (JS_Horizontal == 1) {
if (ID%10 == 0) {
ID = 0;
} else {
ID = ID - (ID%10);
}
Contador_desplazamiento = 0;
}
if (ID == 0) {
Menu(Menu_Principal, 4, JS_Vertical);
} else if (ID == 10) {
Menu(Menu_Monitoreo, 5, JS_Vertical);
} else if (ID == 20) {
Menu(Menu_Salidas, 3, JS_Vertical);
} else if (ID == 30) {
Menu(Menu_Reloj, 2, JS_Vertical);
} else if (ID == 21) {
Menu(Menu_Servo, 2, JS_Vertical);
} else if (ID == 22) {
Menu(Menu_Rele, 2, JS_Vertical);
} else if (ID == 23) {
Menu(Menu_Motor, 4, JS_Vertical);
} else if (ID == 31) {
oled.setTextSize(2);
oled.setCursor(0, 10);
oled.print(rtc.getDay());
oled.print("/");
oled.print(rtc.getMonth() + 1);
oled.print("/");
oled.println(rtc.getYear());
oled.print(rtc.getTime());
} else if (ID == 11) {
oled.setTextSize(2);
oled.setCursor(0, 5);
oled.print("Luz"); //Titulo
oled.setCursor(0, 25);
oled.print(LDR_data); //Dato convertido a lux
oled.print(" lux");
} else if (ID == 12) {
oled.setTextSize(2);
oled.setCursor(0, 5);
oled.print("Movimiento"); //Titulo
oled.setCursor(0, 25);
if (PIR_data == 1) {
oled.print("SI");
} else {
oled.print("NO");
}
} else if (ID == 13) {
oled.setTextSize(2);
oled.setCursor(0, 5);
oled.print("Temp"); //Titulo
oled.setCursor(0, 25);
oled.print(dht.readTemperature());
oled.print("' C");
} else if (ID == 14) {
oled.setTextSize(2);
oled.setCursor(0, 5);
oled.print("Humedad"); //Titulo
oled.setCursor(0, 25);
oled.print(dht.readHumidity());
oled.print("%");
}
Serial.println(JS_Vertical);
Serial.println(JS_Switch);
oled.display();
delay(200);
}