/*
  Librería LiquidCrystal: Caracteres personalizados

  Algunos enlaces de interés:
  http://www.arduino.cc/en/Tutorial/LiquidCrystalCustomCharacter
  https://www.automatismos-mdq.com.ar/blog/2020/12/generador-de-caracteres-especiales-para-lcd.html
  https://www.automatismos-mdq.com.ar/blog/tools/LCD_ccg/lcd-ccg.html
  
*/ 

#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//Flecha abajo
byte arrowUp[8] = { 
  B00100, B00100, B00100, B00100, B00100, B11111, B01110, B00100 
};

// Flecha arriba
byte arrowDown[8] = { 
  B00100, B01110, B11111, B00100, B00100, B00100, B00100, B00100 
};

// Flecha derecha
byte arrowRight[8] = { 
  B00000, B00100, B00110, B11111, B00110, B00100, B00000, B00000 
};

// Flecha izquierda
byte arrowLeft[8] = { 
  B00000, B00100, B01100, B11111, B01100, B00100, B00000, B00000 
};

// Humedad
byte hum[8] = { 
  B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110 
};

// Temperatura
byte temp[8] = { 
  B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110 
};

// Grados 1
byte degrees1[8] = { 
  B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000
};

// Grados 2
byte degrees2[8] = { 
  B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000 
};

// Corazón
byte heart[8] = { 
  B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000 
};

// [
byte bracket1[8] = { 
  B11000, B10000, B10000, B10000, B10000, B10000, B10000, B11000 
};

// ]
byte bracket2[8] = { 
  B00011, B00001, B00001, B00001, B00001, B00001, B00001, B00011 
};

// Candado cerrado
byte lock[8] = { 
  B00000, B01110, B10001, B10001, B11111, B11011, B11011, B11111 
};

// Candado abierto
byte unlock[8] = { 
  B00000, B01110, B10000, B10000, B11111, B11011, B11011, B11111 
};

// Bateria vacía
byte battEmpty[8] = { 
  B01110, B01010, B11011, B10001, B10001, B10001, B10001, B11111 
};

// Bateria mitad
byte battHalf[8] = { 
  B01110, B01010, B11011, B10001, B10001, B11111, B11111, B11111 
};

// Bateria llena
byte battFull[8] = { 
  B01110, B01110, B11111, B11111, B11111, B11111, B11111, B11111 
};

void setup() {

  lcd.begin(16, 2);

  // crear nuevos caracteres
  lcd.createChar(0, arrowUp);
  lcd.createChar(1, lock);
  lcd.createChar(2, unlock);
  lcd.createChar(3, heart);
  lcd.createChar(4, degrees1);
  lcd.createChar(5, degrees2);
  lcd.createChar(6, hum);
  lcd.createChar(7, temp);

  lcd.setCursor(0, 0);
  lcd.print("Set de iconos:");

  lcd.setCursor(0, 1);
  lcd.write(byte(0));  // El '0' debe ser casteado como byte
  lcd.write(1);
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
  lcd.write(6);
  lcd.write(7);

  // Ejemplo temperatura y humedad  
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.write(7);
  lcd.setCursor(1, 0);
  lcd.print(" 30 C");
  lcd.setCursor(4, 0);
  lcd.write(5);
  lcd.setCursor(6, 0);
  lcd.print("    70%RH");
  lcd.setCursor(8, 0);
  lcd.write(6);  
}

void loop() {
  // ...
}