#include <Arduino.h>
#include <AiEsp32RotaryEncoder.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
// Definición de pines para el encoder rotativo y el botón
#define ROTARY_ENCODER_A_PIN 14
#define ROTARY_ENCODER_B_PIN 13
#define ROTARY_ENCODER_BUTTON_PIN 12
#define ROTARY_ENCODER_VCC_PIN -1
// Definición de pines para la pantalla OLED
#define SCL 22
#define SDA 21
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED en píxeles
#define SCREEN_HEIGHT 64 // Alto de la pantalla OLED en píxeles
#define OLED_RESET -1 // Pin de reset de la pantalla OLED (no se usa)
// Definición de pines para el sensor DHT22
#define DHT_PIN 19
#define DHT_TYPE DHT22
// Variables para el menú
int selectedOption = 0;
const int numOptions = 5; // Actualizado con la nueva opción "Mediciones"
String menuOptions[] = {"Leer Datos DHT", "Leer datos POT", "Mediciones"}; // Nueva opción agregada
// Inicialización del objeto de la pantalla OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Inicialización del encoder rotativo
AiEsp32RotaryEncoder rotaryEncoder = AiEsp32RotaryEncoder(ROTARY_ENCODER_A_PIN,
ROTARY_ENCODER_B_PIN,
ROTARY_ENCODER_BUTTON_PIN,
ROTARY_ENCODER_VCC_PIN,
4);
// Inicialización del sensor DHT22
DHT dht(DHT_PIN, DHT_TYPE);
// Variables para el control del mensaje "Leyendo"
bool isReading = false;
// Lista para almacenar las mediciones del sensor DHT22
struct DHTReading {
float temperature;
float humidity;
};
const int maxReadings = 10; // Máximo de lecturas a almacenar
DHTReading readings[maxReadings]; // Lista de lecturas
int numReadings = 0; // Número actual de lecturas almacenadas
void setup() {
// Inicialización de la comunicación serie para la depuración
Serial.begin(115200);
// Inicialización de la pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// Mostrar "equipo 1" centrado y con letra grande en la pantalla OLED una sola vez
display.clearDisplay();
display.setTextSize(2); // Tamaño de letra grande
display.setTextColor(WHITE);
// Calcular las coordenadas del cursor para centrar el texto en la pantalla
int16_t textWidth = 11 * strlen("Bienvenido"); // Aproximación del ancho del texto
int16_t x = (SCREEN_WIDTH - textWidth) / 2;
int16_t y = (SCREEN_HEIGHT - 16) / 2; // Altura de la fuente
display.setCursor(x, y);
display.println("Bienvenido");
display.display();
// Esperar unos segundos antes de continuar con la inicialización
delay(2000);
// Inicialización del encoder rotativo
rotaryEncoder.begin();
rotaryEncoder.setup([] { rotaryEncoder.readEncoder_ISR(); });
rotaryEncoder.setBoundaries(0, numOptions - 1, false);
// Inicialización del sensor DHT22
dht.begin();
}
void loop() {
// Funciones principales del bucle
rotary_loop();
handle_rotary_button();
}
// Función para manejar el botón del encoder rotativo
void handle_rotary_button() {
static bool wasButtonDown = false;
bool isEncoderButtonDown = rotaryEncoder.isEncoderButtonDown();
if (isEncoderButtonDown && !wasButtonDown) {
wasButtonDown = true;
if (selectedOption == 0 && !isReading) {
isReading = true;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Leyendo");
display.display();
delay(1500);
// Leer el sensor DHT22 y almacenar la medición
if (numReadings < maxReadings) {
for (int i = numReadings; i < maxReadings; i++) {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
readings[i].temperature = temperature;
readings[i].humidity = humidity;
numReadings++;
} else {
break;
}
}
}
// Mostrar todas las mediciones leídas
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
for (int i = 0; i < numReadings; ++i) {
display.setCursor(0, i * 10);
display.print("Temp: ");
display.print(readings[i].temperature);
display.print("°C, Hum: ");
display.print(readings[i].humidity);
display.println("%");
}
display.display();
}
} else if (!isEncoderButtonDown && wasButtonDown) {
wasButtonDown = false;
}
if (isReading) {
delay(500); // Espera 0.5 segundos
isReading = false;
rotary_loop(); // Vuelve a mostrar el menú
}
}
// Función para manejar el loop del encoder rotativo
void rotary_loop() {
int encoderDelta = rotaryEncoder.encoderChanged();
if (encoderDelta != 0) {
selectedOption = (selectedOption + encoderDelta + numOptions) % numOptions;
}
// Mostrar el título y el menú en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
int16_t titleWidth = 11 * strlen("Opciones");
int16_t titleX = (SCREEN_WIDTH - titleWidth) / 2;
int16_t titleY = 5;
display.setCursor(titleX, titleY);
display.println("Opciones");
for (int i = 0; i < numOptions; ++i) {
if (i == selectedOption) {
display.setTextColor(BLACK, WHITE);
} else {
display.setTextColor(WHITE);
}
int16_t optionY = titleY + 20 + (i * 10);
display.setCursor(0, optionY);
display.println(menuOptions[i]);
}
display.display();
}