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

#define trigger 19
#define echo 18
#define pir 4
#define aquecedor 25
#define bomba 26

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

String nome = "Xuxa";
String sobrenome = "Meneguel";
int id = 229552;
String data = "07/08/1990";
int turno = 2;
String setor = "Produção";

float umidade = 34.2;
float temperatura = 16.4;
int luminosidade = 360;

float distance;
int leiturapir;
String digitacad;
String digitainicio;

void setup() {
  Serial.begin(115200);
  pinMode(echo, INPUT); //echo
  pinMode(pir, INPUT);
  pinMode(trigger, OUTPUT); // trigger
  pinMode(aquecedor, OUTPUT);
  pinMode(bomba, OUTPUT);

  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);
  Serial.print("Bem Vindo.");
  Serial.println();
}

void loop() {
  digitalWrite(aquecedor, 0);
  digitalWrite(bomba, 0);
  Serial.print("Antes de começar, digite 'CADASTRO' para realizar log-in.");
  Serial.println();
  while (true) {
    if (Serial.available()) {
      digitacad = Serial.readStringUntil('\n');
      break;
    }
  }
  if (digitacad=="CADASTRO") {
    cadastro ();
    Serial.print("Cadastro realizado.\n");
    inicio ();
  }
  else {
    Serial.print("Erro. Tente novamente.\n.");
    return loop ();
  }

}

void inicio () {
  Serial.print("Digite 'INICIO' para iniciar o sensoriamento.");
  while (true) {
    if (Serial.available()) {
      digitainicio = Serial.readStringUntil('\n');
      break;
    }
  }
  if (digitainicio=="INICIO") {
    Serial.print("Atualizando informações.\n\n");
    sensoriamentopush ();
    sensoriamentoset ();
    comandos ();
  }
  else {
    Serial.print("Erro. Tente novamente.\n.");
    return inicio ();
  }
}

void contador (){
  int cont = 0;
  leiturapir = digitalRead(pir);
  if (leiturapir=1) {
    cont = cont + 1;
  }
  Serial.print("Contagem: ");
  Serial.print(cont);
  Serial.println();
}

void sensoriamentopush () {
  distance = Ultrasonic(trigger, echo);
  Serial.print("Medida da régua: ");
  Serial.print(distance);
  Serial.print(" cm.");
  Serial.println();
  Firebase.pushFloat("/SENSORIAMENTO/4-Régua Eletrônica", distance);
  delay(100);
  contador();
  Firebase.pushFloat("/SENSORIAMENTO/5-Contador", cont);
  delay(100);
}

void sensoriamentoset () {
  Serial.print("Umidade: ");
  Serial.print(umidade);
  Serial.print(".");
  Serial.println();
  Firebase.setFloat("/SENSORIAMENTO/2-Umidade", umidade);
  delay(500);
 
  Serial.print("Luminosidade: ");
  Serial.print(luminosidade);
  Serial.print(" luxes.");
  Serial.println();
  Firebase.pushFloat("/SENSORIAMENTO/3-Luminosidade", luminosidade);
  delay(500);
  luminosidade = (luminosidade*1.34);

  Serial.print("Temperatura: ");
  Serial.print(temperatura);
  Serial.print(" °C.");
  Serial.println();
  Firebase.pushFloat("/SENSORIAMENTO/1-Temperatura", temperatura);
  delay(500);
  temperatura = (temperatura + 0.77);
}

void comandos () {
  Serial.println();
  Serial.print("Comando para ligar aquecedor: ");
  Serial.print(Firebase.getString("/COMANDOS/Aquecedor"));
  Serial.println();
  delay(300);
  Serial.print("Comando para ligar bomba dagua: ");
  Serial.print(Firebase.getString("/COMANDOS/Bomba d'Água"));
  Serial.println();
  delay(300);
  ligaascoisas();
}

void cadastro () {
  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);
}

void ligaascoisas () {
  String estadoaquecedor = Firebase.getString("/COMANDOS/Aquecedor");
  String estadobomba = Firebase.getString("/COMANDOS/Bomba d'Água");
  if (estadoaquecedor=="LIGA") {
    digitalWrite (aquecedor, 1);
  }
  else if (estadoaquecedor=="DESLIGA") {
    digitalWrite (aquecedor, 0);
  }

  if (estadobomba=="LIGA") {
    digitalWrite (bomba, 1);
  }
  else if (estadobomba=="DESLIGA") {
    digitalWrite (bomba, 0);
  }
}

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