/* 
  Ejemplo de uso de Adafruit IO
  3 de noviembre de 2023
*/

#include "DHT.h"
#include "config.h"

const int DHT_PIN = 4;
const int BOTON_PIN = 2;
const int SENSOR_LDR = 32;
const int RELE_PIN = 33;
const int PERIODO = 15000;

unsigned long tiempoActual;
bool estadoPulsador = false;

DHT dht(DHT_PIN, DHT22);

// Adafruit IO Feeds
AdafruitIO_Feed *digitalOut = io.feed("pulsador");
AdafruitIO_Feed *digitalIn = io.feed("rele");
AdafruitIO_Feed *humedadOut = io.feed("humedad");
AdafruitIO_Feed *temperaturaOut = io.feed("temperatura");
AdafruitIO_Feed *luzEsp = io.feed("sensor-de-luz");

void setup() {

  pinMode(RELE_PIN, OUTPUT);
  pinMode(BOTON_PIN, INPUT);
  dht.begin();

  Serial.begin(9600);

  // Conectar a io.adafruit.com
  Serial.print("Conectando a Adafruit IO");
  io.connect();

  // Configurar un callback para el feed "rele".
  digitalIn -> onMessage(manejoRele);

  // Esperar a que se conecte
  while(io.status() < AIO_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  // Conexion exitosa
  Serial.println();
  Serial.println(io.statusText());
  digitalIn -> get();
}

void loop() {

  // La funcion io.run() debe estar presente al inicio del 
  // loop(). Mantiene al cliente conectado a io.adafruit.com, 
  // y procesa todos los datos entrantes.
  io.run();
 
  // Entradas digitales, lee el pulsador y lo envia al feed
  if(digitalRead(BOTON_PIN) == LOW) {
    
    estadoPulsador = !estadoPulsador;
    digitalOut-> save(estadoPulsador);

    Serial.print("Estado BOTON: ");
    Serial.println(estadoPulsador);  
  }

  // Obtener datos desde el sensor cada cinco segundos
  if (millis() >= tiempoActual + PERIODO) {

    tiempoActual = millis();
    float sensor_humedad = dht.readHumidity();
    float sensor_temperatura = dht.readTemperature();
    int lux = analogRead(SENSOR_LDR);

    humedadOut-> save(sensor_humedad);
    temperaturaOut-> save(sensor_temperatura);
    luzEsp -> save(lux);

    Serial.print("Humedad: ");
    Serial.println(sensor_humedad);
    Serial.print("Temperatura: ");
    Serial.println(sensor_temperatura);
    Serial.print("Luz: ");
    Serial.println(lux);
  }
}

// Esta funcion es llamada cada vez que un mensaje del feed
// "rele" es recibido desde Adafruit IO.
void manejoRele(AdafruitIO_Data *data) {

  bool datosRecibidos = data -> toPinLevel();
  Serial.print("Valor RELE: ");
  Serial.println(datosRecibidos);

  digitalWrite(RELE_PIN, datosRecibidos);
}
NOCOMNCVCCGNDINLED1PWRRelay Module