/*
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
  }
}