/*
Instrucciones de conexión de la pantalla
0.96 inch PantallaOled display
Screen vs ESP32
Vin --> 3.3V
GND --> GND
SCL --> GPIO 22
SDA --> GPIO 21
*/
// conectamos nuestro archivo personal de íconos
#include <myimages.h> // librería personalizada de imágenes
// configuración de las librerías
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <BluetoothSerial.h>
#define SCREEN_WIDTH 128 // PantallaOled width, in pixels
#define SCREEN_HEIGHT 64 // PantallaOled height, in pixels
// create an PantallaOled display object connected to I2C
Adafruit_SSD1306 PantallaOled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// definir el nombre de la conexión Serial del Bluetooth
BluetoothSerial SerialBT;
// librerias y configuraciòn del sensor de temperatura/humedad
#define DHTPIN 32
#define DHTTYPE DHT11
DHT DatosDHT(DHTPIN, DHTTYPE);
// Pines para los LEDs de los entornos a usar
const int DispositivoA = 33; // SALA
const int DispositivoB = 25; // GARAGE
const int DispositivoC = 26; // VENTILADOR
const int DispositivoD = 27; // LAMPARA
// TODO: defina acá los pines para otros dispositivos
// declaramos todos los entornos en Falso para mostrar ícono APAGADO en pantalla
bool EstadoDispA = false;
bool EstadoDispB = false;
bool EstadoDispC = false;
bool EstadoDispD = false;
// TODO: declare los estados para otros entornos
void setup() {
// CORRECCIÓN 1: Serial se inicia primero para que los mensajes de error se impriman
Serial.begin(115200);
// initialize PantallaOled display with I2C address 0x3C (SSD1306)
if (!PantallaOled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 PantallaOled"));
while (1);
}
// declaro los LED como salida
pinMode(DispositivoA, OUTPUT);
pinMode(DispositivoB, OUTPUT);
pinMode(DispositivoC, OUTPUT);
pinMode(DispositivoD, OUTPUT);
// TODO: declare acá los demás dispositivos a usar
DatosDHT.begin();
// desde acá se genera la estructura del archivo plano por puerto serial
Serial.println("Humedad, Temperatura 'C");
SerialBT.begin("ESP32_BT_RamiroA"); // TODO: defina el nombre personalizado de su Bluetooth
PantallaOled.setTextColor(SSD1306_WHITE); // set text color
// activamos pantalla
PantallaOled.setRotation(2); // gira la pantalla 180 grados
PantallaOled.print("ESP32_BT_RamiroA");
PantallaOled.display();
delay(2000);
PantallaOled.clearDisplay();
}
void loop() {
PantallaOled.clearDisplay();
float humedadDHT = DatosDHT.readHumidity();
float TempDHT = DatosDHT.readTemperature();
// asignar un valor aleatorio para testeo, se oculta para usar el DHT real
// humedadDHT = random(0,100);
// TempDHT = random(0,500)/10.00;
// Enviamos los datos DHT como archivo plano en el puerto serial
Serial.print(humedadDHT); Serial.print("%, "); Serial.print(TempDHT); Serial.println("");
// se imprime los íconos de temperatura-humedad en pantalla
if (TempDHT < 20) { PantallaOled.drawBitmap(2, 26, temp_baja, 15, 20, SSD1306_WHITE); }
if (TempDHT >= 20 && TempDHT < 30) { PantallaOled.drawBitmap(2, 26, temp_media, 15, 20, SSD1306_WHITE); }
if (TempDHT >= 30) { PantallaOled.drawBitmap(2, 26, temp_alta, 15, 20, SSD1306_WHITE); }
if (humedadDHT < 40) { PantallaOled.drawBitmap(80, 26, hum_baja, 15, 20, SSD1306_WHITE); }
if (humedadDHT >= 40 && humedadDHT < 70) { PantallaOled.drawBitmap(80, 26, hum_media, 15, 20, SSD1306_WHITE); }
if (humedadDHT >= 70) { PantallaOled.drawBitmap(80, 26, hum_alta, 15, 20, SSD1306_WHITE); }
// Enviamos a pantalla los datos de Temp y Humedad
PantallaOled.setTextSize(2);
PantallaOled.setCursor(17, 30); // (col, fila)
PantallaOled.print(TempDHT, 1);
PantallaOled.setTextSize(1); PantallaOled.print((char)247);
PantallaOled.print("C ");
PantallaOled.setTextSize(2);
PantallaOled.setCursor(95, 30);
PantallaOled.print(humedadDHT, 0);
PantallaOled.setTextSize(1); PantallaOled.print("% ");
// Ícono de estado de la conexión Bluetooth
PantallaOled.drawRoundRect(100, 1, 25, 25, 5, SSD1306_WHITE);
// CORRECCIÓN 2: hasClient() indica si hay un dispositivo conectado
// (available() solo indica que hay datos por leer)
if (SerialBT.hasClient()) {
PantallaOled.drawBitmap(105, 3, BT_on, 15, 20, SSD1306_WHITE); // conectado
} else {
PantallaOled.drawBitmap(105, 3, BT_off, 15, 20, SSD1306_WHITE); // desconectado
}
// Leemos comandos de botones por Bluetooth
if (SerialBT.available()) {
char input = SerialBT.read();
switch (input) {
case 'A': EstadoDispA = true; digitalWrite(DispositivoA, EstadoDispA); break;
case 'a': EstadoDispA = false; digitalWrite(DispositivoA, EstadoDispA); break;
case 'B': EstadoDispB = true; digitalWrite(DispositivoB, EstadoDispB); break;
case 'b': EstadoDispB = false; digitalWrite(DispositivoB, EstadoDispB); break;
case 'C': EstadoDispC = true; digitalWrite(DispositivoC, EstadoDispC); break;
case 'c': EstadoDispC = false; digitalWrite(DispositivoC, EstadoDispC); break;
case 'D': EstadoDispD = true; digitalWrite(DispositivoD, EstadoDispD); break;
case 'd': EstadoDispD = false; digitalWrite(DispositivoD, EstadoDispD); break;
// TODO: establezca acá los casos para los demás dispositivos
}
}
// Parámetros: estado, posición X del ícono, ID indexado del entorno
mostrarIcono(EstadoDispA, 5, 1); // luz de sala
mostrarIcono(EstadoDispB, 30, 2); // puerta garage
mostrarIcono(EstadoDispC, 55, 3); // ventilador
mostrarIcono(EstadoDispD, 80, 4); // lampara
PantallaOled.display();
delay(1000);
}
// Función para mostrar un ícono dependiendo del estado
void mostrarIcono(bool encendido, int posicion, int dispositivo) {
PantallaOled.drawRoundRect(0, 0, 128, 64, 5, SSD1306_WHITE); // Rectángulo a pantalla completa
PantallaOled.drawRoundRect(posicion - 5, 1, 25, 25, 5, SSD1306_WHITE); // Cuadro del ícono (5 px a la izq.)
// TODO: genere acá más rectángulos según la cantidad de dispositivos
if (encendido) {
if (dispositivo == 1) { PantallaOled.drawBitmap(posicion, 3, bulb_on, 15, 20, SSD1306_WHITE); }
if (dispositivo == 2) { PantallaOled.drawBitmap(posicion, 3, casa_on, 15, 20, SSD1306_WHITE); }
if (dispositivo == 3) { PantallaOled.drawBitmap(posicion, 3, fan_on, 15, 20, SSD1306_WHITE); }
if (dispositivo == 4) { PantallaOled.drawBitmap(posicion, 3, lamp_on, 15, 20, SSD1306_WHITE); }
} else {
if (dispositivo == 1) { PantallaOled.drawBitmap(posicion, 3, bulb_off, 15, 20, SSD1306_WHITE); }
if (dispositivo == 2) { PantallaOled.drawBitmap(posicion, 3, casa_off, 15, 20, SSD1306_WHITE); }
if (dispositivo == 3) { PantallaOled.drawBitmap(posicion, 3, fan_off, 15, 20, SSD1306_WHITE); }
if (dispositivo == 4) { PantallaOled.drawBitmap(posicion, 3, lamp_off, 15, 20, SSD1306_WHITE); }
}
}