/*
   Código demonstrativo para a aula de Sistemas Embarcados,
   Curso de Ciência da Computação e Engenharia da Computação
   EEP.
*/

#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"

#define DHTPIN 15
#define DHTTYPE DHT22

#define PINO_TRIGGER 13
#define PINO_ECHO    12

// Substituir seu_dispositivo pelo nome que identifica o dispositivo - API LABEL.
// const String url = "http://things.ubidots.com/api/v1.6/devices/seu_dispositivo";

const String url = "http://things.ubidots.com/api/v1.6/devices/seu_dispositivo";


long readUltrasonicDistance() {

  digitalWrite(PINO_TRIGGER, LOW);
  delayMicroseconds(2);
  digitalWrite(PINO_TRIGGER, HIGH);
  delayMicroseconds(10);
  digitalWrite(PINO_TRIGGER, LOW);

  return pulseIn(PINO_ECHO, HIGH);

}

DHT dht(DHTPIN, DHTTYPE);

HTTPClient cliente;

void setup() {

  pinMode(PINO_ECHO, INPUT);
  pinMode(PINO_TRIGGER, OUTPUT);

  Serial.begin(115200);
  while (!Serial)    {     }

  dht.begin();

  WiFi.begin("Wokwi-GUEST", "");

  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
  }

  Serial.println("-----------------------------------------------");
  Serial.print("Endereco IP: ");
  Serial.println(WiFi.localIP());
  Serial.println("-----------------------------------------------");

  delay(1000);

}

void loop() {

  char payload[200];

  int umidade_ar = dht.readHumidity();
  int temperatura_celsius = dht.readTemperature(false);
  int temperatura_fahrenheit = dht.readTemperature(true);
  int sensacao_termica = dht.computeHeatIndex(temperatura_celsius, umidade_ar);

  int centimetros = 0.01723 * readUltrasonicDistance();
  int polegadas = (centimetros / 2.54);

  Serial.println("--------------------------------------------------------------------------------");
  Serial.print("CM: ");
  Serial.println(centimetros);
  Serial.print("POL: ");
  Serial.println(polegadas);
  Serial.print("C: ");
  Serial.println(temperatura_celsius);
  Serial.print("F: ");
  Serial.println(temperatura_fahrenheit);
  Serial.println("--------------------------------------------------------------------------------");
  Serial.println("");

  // Substituir sua_variavel pelo nome que identifica a variável desejada - API LABEL.
  // sprintf(payload, "{\"sua_variavel\":%d,\"sua_variavel\":%d,\"sua_variavel\":%d,\"sua_variavel\":%d}", temperatura_celsius, temperatura_fahrenheit, centimetros, polegadas);

  sprintf(payload, "{\"sua_variavel\":%d,\"sua_variavel\":%d,\"sua_variavel\":%d,\"sua_variavel\":%d}", temperatura_celsius, temperatura_fahrenheit, centimetros, polegadas);
  int contentLength  = strlen(payload);

  Serial.println("Requisicao: POST");

  cliente.begin(url);

  cliente.addHeader("Content-Type", "application/json");
  cliente.addHeader("Content-Length", String(contentLength));

  // Substituir seu_token_default pela chave que identifica o seu token - TOKEN default.
  // cliente.addHeader("X-Auth-Token","seu_token_default");

  cliente.addHeader("X-Auth-Token", "seu_token_default");

  int statusCode = cliente.POST(payload);
  String response = cliente.getString();

  Serial.print("Status: ");
  Serial.println(statusCode);
  Serial.print("Retorno: ");
  Serial.println(response);
  Serial.println();

  delay(15000);

}