/*
Instrucciones de conexión de la pantalla
0.96 inch SSD1306 OLED display
Screen ESP32
Vin --> 3.3V
GND --> GND
SCL --> GPIO 22
SDA --> GPIO 21
*/
// conectamos nuestro archivo personal de íconos
#include <myimages.h>
// 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 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
// create an OLED display object connected to I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// definir el nombre de la conexión Serial del Bluetooth
BluetoothSerial SerialBT;
String ClientName ="ESP32_BT_RamiroA";
// 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 LuzA = 27;
const int LuzB = 26;
const int LuzC = 25;
const int LuzD = 33;
// defina acá los pines para otros dispositivos
// declaramos todos los entornos en Falso para mostrar ícono APAGADO en pantalla
bool ifLuzA = false;
bool ifLuzB = false;
bool ifLuzC = false;
bool ifLuzD = false;
// declare los condicionales para otros entornos
void setup() {
// initialize OLED display with I2C address 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
// declaro los LED como salida
pinMode(LuzA, OUTPUT);
pinMode(LuzB, OUTPUT);
pinMode(LuzC, OUTPUT);
pinMode(LuzD, OUTPUT);
// declare acá los demás dispositivos a usar
Serial.begin(115200);
DatosDHT.begin();
Serial.println("Humedad, Temperatura 'C");
SerialBT.begin(ClientName); // defina el nombre personalizado de su Bluetooth
oled.setTextColor(WHITE); // set text color
// activamos pantalla
oled.setRotation(2); //gira la pantalla 180 grados
oled.clearDisplay(); // clear display
}
void loop() {
oled.clearDisplay();
float humedadDHT = DatosDHT.readHumidity();
float TempDHT = DatosDHT.readTemperature();
// 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
oled.drawBitmap(20, 25, DHT_data, 15, 40, SSD1306_WHITE);
// Enviamos a pantalla los datos de Temp y Humedad
oled.setTextSize(1);
oled.setCursor(45, 25); // set position to display (x,y)
oled.setTextSize(2); // set text size
oled.print(TempDHT); // set text
oled.setTextSize(1); oled.print((char)247);
oled.setTextSize(2); oled.print("C ");
oled.setTextSize(1); // set text size
oled.setCursor(45, 40); // set position to display (x,y)
oled.setTextSize(2); // set text size
oled.print(humedadDHT); // set text
oled.print("% ");
// Verificamos la conexión de Bluetooth y comandos de botones
if (SerialBT.available()) // Compruebe si recibimos algo de Bluetooth
// se imprime el ícono de bluetooth activo
{ oled.drawBitmap(105, 2, BT_on, 15, 20, SSD1306_WHITE); }
else // se imprime el ícono de bluetooth inactivo
{ oled.drawBitmap(105, 2, BT_off, 15, 20, SSD1306_WHITE); }
if (SerialBT.available()) {
char input = SerialBT.read();
oled.setCursor(5, 55);oled.setTextSize(1);
switch(input) {
case 'A': ifLuzA = true; digitalWrite(LuzA, ifLuzA);
oled.print("Luz sala Encendida");
break;
case 'a': ifLuzA = false; digitalWrite(LuzA, ifLuzA); break;
case 'B': ifLuzB = true; digitalWrite(LuzB, ifLuzB); break;
case 'b': ifLuzB = false; digitalWrite(LuzB, ifLuzB); break;
case 'C': ifLuzC = true; digitalWrite(LuzC, ifLuzC); break;
case 'c': ifLuzC = false; digitalWrite(LuzC, ifLuzC); break;
case 'D': ifLuzD = true; digitalWrite(LuzD, ifLuzD); break;
case 'd': ifLuzD = false; digitalWrite(LuzD, ifLuzD); break;
// establezca acá los casos para los demás dispositivos
}
}
// para enviar el estado del led y el ID del espacio físico a controlar
// Esta función envía el primer valor con la condición,
// el segundo valor es la posición del ícono
// el tercer valor un valor indexado de entornos
mostrarIcono(ifLuzA, 5, 1);
mostrarIcono(ifLuzB, 30, 2);
mostrarIcono(ifLuzC, 55, 3);
mostrarIcono(ifLuzD, 80, 4);
// clear display
oled.display(); // display on OLED
delay(1000);
}
// Función para mostrar un ícono dependiendo del estado
void mostrarIcono(bool encendido, int posicion, int dispositivo) {
// Verificamos el estado del LED (ON - OFF) y mostraos el ícono correspondiente a cada estado.
oled.drawRoundRect(0 , 0, 128, 64, 5, WHITE); // Rectángulo a pantalla completa
oled.drawRoundRect(posicion-5, 1, 25, 22, 5, WHITE); // Cuadro para el ícono 1 (ubicado 5 pixeles a la izq del ícono)
// genere acá más rectángulos de acuerdo a la cantidad de dispositivos configurados
// en este código validamos el estado del dispositivo y mostrámos el ícono en pantalla On-OFF
if(encendido) {
if(dispositivo == 1){oled.drawBitmap(posicion, 2, bulb_on, 15, 20, SSD1306_WHITE);}
if(dispositivo == 2){oled.drawBitmap(posicion, 2, casa_on, 15, 20, SSD1306_WHITE);}
if(dispositivo == 3){oled.drawBitmap(posicion, 2, fan_on, 15, 20, SSD1306_WHITE);}
if(dispositivo == 4){oled.drawBitmap(posicion, 2, lamp_on, 15, 20, SSD1306_WHITE);}
// configure acá la condición para otros entornos ACTIVOS
} else {
if(dispositivo == 1){oled.drawBitmap(posicion, 2, bulb_off, 15, 20, SSD1306_WHITE);}
if(dispositivo == 2){oled.drawBitmap(posicion, 2, casa_off, 15, 20, SSD1306_WHITE);}
if(dispositivo == 3){oled.drawBitmap(posicion, 2, fan_off, 15, 20, SSD1306_WHITE);}
if(dispositivo == 4){oled.drawBitmap(posicion, 2, lamp_off, 15, 20, SSD1306_WHITE);}
// configure acá la condición para otros entornos INACTIVOS
}
}