#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args, BYTE);
#endif

SoftwareSerial espSerial(10, 11);    // RX, TX
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Adresse I2C de l'écran LCD
uint8_t heart[8] = { 0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0 };
uint8_t white[8] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };
int longueur;
void clear() {
  lcd.setCursor(0, 0);
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  lcd.setCursor(0, 3);
  lcd.print("                    ");
  digitalWrite(13, LOW);
}

void setup() {
  pinMode(13, OUTPUT);
  lcd.init();
  lcd.begin(20, 4);
  lcd.backlight();
  Serial.begin(9600);
  espSerial.begin(115200);
  lcd.createChar(3, heart);
  lcd.createChar(0, white);
  lcd.setCursor(2, 1);
  lcd.print("Bienvenue Juuu !");
  for (int k = 2; k < 17; k++) {
    lcd.setCursor(k, 2);
    lcd.printByte(3);
    delay(500);
  }
  delay(3000);
  clear();
}

void loop() {
  if (espSerial.available()) {
    String message = espSerial.readStringUntil('\n');
    longueur = message.length();
    message = message.substring(0, longueur - 1);
    Serial.print(message);
    if (message == "URGENCE") {
      lcd.setCursor(2, 1);
      lcd.print("Alerte generale !");
      lcd.setCursor(3, 2);
      lcd.print("Call me back !");
      digitalWrite(13, HIGH);
      for (int k = 0; k < 20; k++) {
        lcd.setCursor(k, 0);
        lcd.printByte(0);
      }
      lcd.setCursor(0, 1);
      lcd.printByte(0);
      lcd.setCursor(0, 2);
      lcd.printByte(0);
      for (int k = 0; k < 20; k++) {
        lcd.setCursor(k, 3);
        lcd.printByte(0);
      }
      lcd.setCursor(20, 1);
      lcd.printByte(0);
      lcd.setCursor(20, 2);
      lcd.printByte(0);
    }

    else if (message == "LOVE") {
      clear();
      lcd.setCursor(2, 1);
      lcd.print("Je t'aimeeeeeeee");
      for (int k = 0; k < 20; k++) {
        lcd.setCursor(k, 3);
        lcd.printByte(3);
        delay(500);
      }
    } else if (message == "BH") {
      clear();
      lcd.setCursor(7, 0);
      lcd.printByte(0);
      lcd.setCursor(10, 0);
      lcd.printByte(0);
      for (int k = 6; k < 12; k++) {
        lcd.setCursor(k, 1);
        lcd.printByte(0);
      }
      for (int k = 7; k < 11; k++) {
        lcd.setCursor(k, 2);
        lcd.printByte(0);
      }
        lcd.setCursor(8, 3);
        lcd.printByte(0);
        lcd.setCursor(9, 3);
        lcd.printByte(0);
    } else if (message == "BJ") {
      clear();
      lcd.setCursor(0, 1);
      lcd.print("Bonne journee my Juu");
      for (int k = 0; k < 20; k++) {
        lcd.setCursor(k, 3);
        lcd.printByte(3);
        delay(500);
      }
    } 
    else if (message == "clear") {
      clear();
      lcd.setCursor(0, 0);

      }
    else if (message == "L0") {
      lcd.setCursor(0, 0);
      }
    else if (message == "L1") {
      lcd.setCursor(0, 1);
      }
    else if (message == "L2") {
      lcd.setCursor(0, 2);
      }
    else if (message == "L3") {
      lcd.setCursor(0, 3);
      }
    else if (message == "Connected to WiFi") {
      delay(5000);
      clear();
      }
    else if (message == "%nuit") {
      lcd.noBacklight();
      }
    else if (message == "%jour") {
      lcd.backlight();
      }
    else {
      lcd.print(message);
    }
  }
}
