#include <WiFi.h>
#include <IOXhop_FirebaseESP32.h>
#include <ArduinoJson.h>
#include <DHT.h>

#define PIR 25
#define LDR 2
#define LEDmotorON 19
#define LEDmotorOFF 5
#define LEDaquecON 21
#define LEDaquecOFF 18

#define DHTPIN 12
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
float humid, temp;

#define trigger 32
#define echo 33
float distancia;

#define WIFI_SSID "Newt"
#define WIFI_PASSWORD "newooxx11"
#define FIREBASE_HOST "https://av2dsi-default-rtdb.firebaseio.com/"
#define FIREBASE_AUTH "ejRdKdBNFHJ2bmldzd0RXD4Fl4vpc5fNZVDiOzoD"

String nome = "Maria";
String sobrenome = "Eduarda";
int id = 227333;
String data = "08/04/2024";
int turno = 01;
String setor = "Manutenção";

String modaquec;
String modbomba;
String digitacad;
String digitainicio;

int lepir;
int cont;

void setup() {
  Serial.begin(115200);
  Serial.println();
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.println("Conectando ao WiFi");
  
  while(WiFi.status()!= WL_CONNECTED){
    Serial.print("Conectando...");
    Serial.println();
    delay(1000);
  }
  Serial.println();
  Serial.print("Conectado");
  Serial.println();
  Firebase.begin(FIREBASE_HOST,FIREBASE_AUTH);
  
  dht.begin();
  
  digitalWrite(LEDmotorOFF, 1);
  delay(100);
  digitalWrite(LEDaquecOFF, 1);
  delay(100);
  digitalWrite(LEDmotorON, 0);
  delay(100);
  digitalWrite(LEDaquecON, 0);
  delay(100);
  
  pinMode(PIR, INPUT);
  pinMode(LDR, INPUT);
  pinMode(echo, INPUT);
  pinMode(trigger, OUTPUT);
  pinMode(LEDmotorON, OUTPUT);
  pinMode(LEDmotorOFF, OUTPUT);
  pinMode(LEDaquecON, OUTPUT);
  pinMode(LEDaquecOFF, OUTPUT);
}

void loop() {

  Serial.print("BEM VINDO.\n");
  cadastro();
}

void cadastro () {
  Serial.print("Digite 'CADASTRO' para dar inicio ao processo.\n\n");
  while (true) {
    if (Serial.available()) {
      digitacad = Serial.readStringUntil('\n');
      break;
    }
  }
  if (digitacad=="CADASTRO") {
    Serial.print("Cadastro executado.\n");
    Firebase.setString("/CADASTRO/1-Nome", nome);
    Firebase.setString("/CADASTRO/2-Sobrenome", sobrenome);
    Firebase.setInt("/CADASTRO/3-ID", id);
    Firebase.setInt("/CADASTRO/4-Turno", turno);
    Firebase.setString("/CADASTRO/5-Setor", setor);
    Firebase.setInt("/CADASTRO/6-Data de Operação", turno);
    inicio ();
  }
  else {
    Serial.print("Erro.\nDigite 'CADASTRO' para registrar as informações do usuário.");
    return cadastro();
  }
}

void inicio () {
  Serial.print("Digite 'INICIO' para iniciar o sensoriamento.\n\n");
  while (true) {
    if (Serial.available()) {
      digitainicio = Serial.readStringUntil('\n');
      break;
    }
  }
  if (digitainicio=="INICIO") {    
    Serial.print("Compartilhando informações. . .\nSENSORIAMENTO EM FUNCIONAMENTO.\n\n");
    contador ();
    int ldr = analogRead(LDR);
    float luxes = (0.519*ldr);
    int pir = digitalRead(PIR);
    distancia = Ultrasonic(trigger, echo);
    //humid, temp (DHT11)
    Firebase.pushFloat ("/SENSORIAMENTO/1-Temperatura", temp);
    Firebase.pushFloat ("/SENSORIAMENTO/2-Umidade", humid);
    Firebase.pushInt ("/SENSORIAMENTO/3-Luminosidade", luxes);
    Firebase.pushFloat ("/SENSORIAMENTO/4-Régua Eletrônica", distancia);
    Firebase.pushInt ("/SENSORIAMENTO/5-Contador", cont);
    controle ();
  }
  else {
    Serial.print("Erro.\nDigite 'INICIO' para ativar o sensoriamento.");
    return inicio();
  }
}

void controle () {
  modaquec = Firebase.getString ("/COMANDOS/Aquecedor");
  modbomba = Firebase.getString ("/COMANDOS/Bomba d'Água");
  if (modaquec=="LIGA") {
    digitalWrite(LEDaquecOFF, 0);
    delay(100);
    digitalWrite(LEDaquecON, 1);
    delay(100);
  }
  else if (modaquec=="DESLIGA") {
    digitalWrite(LEDaquecOFF, 1);
    delay(100);
    digitalWrite(LEDaquecON, 0);
    delay(100);
  }
  else {
    Serial.print("  ");
  }

  if (modbomba=="LIGA") {
    digitalWrite(LEDmotorOFF, 0);
    delay(100);
    digitalWrite(LEDmotorON, 1);
    delay(100);
  }
  else if (modbomba=="DESLIGA") {
    digitalWrite(LEDmotorOFF, 1);
    delay(100);
    digitalWrite(LEDmotorON, 0);
    delay(100);
  }
  else {
    Serial.print("  ");
  }
}

void contador () {
  int lepir=digitalRead(PIR);
  if (lepir==1) {
    cont = (cont+1);
  }
  else {
    Serial.print(" ");
  }
}

void leituraDHT () {
  delay(1000);
  humid = dht.readHumidity();
  temp = dht.readTemperature();
  if (isnan(humid) || isnan(temp)) {
    return;
  }
}

float Ultrasonic(int a, int b) {
  int distancia = 0;
  while (distancia == 0) {
    digitalWrite(a, 0);
    delayMicroseconds(5);
    digitalWrite(a, 1);
    delayMicroseconds(5);
    float tempo = pulseIn(b, 1);
    distancia = (tempo / 2 / 29.15);
  }
  return distancia;
}