#include "WiFi.h"
#include "ThingSpeak.h"
#include "DHTesp.h" // Librería para el sensor AM2301
// Datos relativos a la conexión a la red Wifi y a ThingSpeak
char* ssid = "HomeA"; // Nombre de la red WiFi
const char* pass = "HomeAHomeA@@"; // Contraseña de la red WiFi
const int ChannelNumber = 2498549; // Número de mi canal de ThingSpeak
const char* ApiKey = "RK96GC7BY38DWBFE"; // Clave de API de ThingSpeak
const char* server = "api.thingspeak.com"; // Dirección del servidor de ThingSpeak
DHTesp dhtSensor; // Crear una instancia de la biblioteca DHTesp
WiFiClient client; // Crear un objeto cliente WiFi
// Conexión de los pines a la placa de Arduino
const int higrometroPin = 27; // Pin digital para leer la humedad del suelo (Higrometro FC28). Valores de 0 (humedo) a 1023 (seco)
const int termohigrometroPin = 12; // Pin para leer la temperatura y humedad del aire (Termohigrómetro AM2301)
const int ventiladorPin = 2; // Pin para controlar el ventilador de 12V
const int relePin = 26; // Pin para controlar el relé que activa la bomba de agua
//Aquí se indican los valores máximos y minímos para el control de las condiciones ambientales del semillero
float temperaturaLow = 20; // Valor bajo de temperatura, modificable según necesidad.
float temperaturaDeseada = 22; // Valor medio ideal de temperatura, modificable según necesidad.
float temperaturaUp = 24; // Valor alto de temperatura, modificable según necesidad.
float humedadLow = 30; // Valor bajo de humedad, modificable según necesidad.
float humedadDeseada = 45; // Valor medio ideal de humedad, modificable según necesidad.
float humedadUp = 65; // Valor alto de humedad, modificable según necesidad.
float humedadSueloLow = 10; // Valor bajo de humedad en SUELO, modificable según necesidad.
float humedadSueloMedia = 35; // Valor medio ideal de humedad en SUELO, modificable según necesidad.
float humedadSueloUp = 60; // Valor alto de humedad en SUELO, modificable según necesidad.
// Funciones para obtener lecturas de sensores
float obtenerTemperaturaAire() {
// Aquí iría tu código para leer la temperatura del aire desde el sensor
// Supongamos que el valor se obtiene de alguna manera y se almacena en una variable llamada temperatura
float temperatura = 25.5; // Ejemplo de valor de temperatura
return temperatura;
}
float obtenerHumedadAire() {
// Aquí iría tu código para leer la humedad del aire desde el sensor
// Supongamos que el valor se obtiene de alguna manera y se almacena en una variable llamada humedad
float humedad = 50.0; // Ejemplo de valor de humedad
return humedad;
}
float obtenerHumedadTierra() {
// Aquí iría tu código para leer la humedad del suelo desde el sensor
// Supongamos que el valor se obtiene de alguna manera y se almacena en una variable llamada humedadSuelo
float humedadTierra = 40.0; // Ejemplo de valor de humedad del suelo
return humedadTierra;
}
unsigned long tiempoUltimaLectura = 0;
// Inicializar el sensor DHT
void setup() {
// Inicializar la comunicación serial
Serial.begin(115200);
dhtSensor.setup(termohigrometroPin, DHTesp::DHT22); // Inicializar el sensor DHT22
pinMode(termohigrometroPin, INPUT); // Declara el DHT22 (Temperatura y Humedad)
pinMode(higrometroPin, INPUT); // Declara el FC28 (Suelo) de Entrada de datos
pinMode(ventiladorPin,OUTPUT); // Actuador ventilador
pinMode(relePin,OUTPUT); // Actuador relé deposito de agua
// Iniciar la conexión WiFi
WiFi.begin(ssid, pass);
delay(2000);
Serial.print("Conectando a red...");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print("...");
}
Serial.println("Conectado a la red WiFi");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Inicializar ThingSpeak
ThingSpeak.begin(client);
}
void loop() {
float temperaturaAire = obtenerTemperaturaAire();
float humedadAire = obtenerHumedadAire();
float humedadSuelo = obtenerHumedadTierra();
enviarDatosThingSpeak(humedadAire, temperaturaAire, humedadSuelo);
// Como actua rele en base a temperatura y humedad
if (temperaturaAire > temperaturaLow || temperaturaAire < temperaturaUp && humedadAire > humedadLow || humedadAire < humedadUp && humedadSuelo>humedadSueloLow || humedadSuelo<humedadSueloUp);{
digitalWrite(relePin,LOW);
digitalWrite(ventiladorPin,LOW);
}
if (temperaturaAire >= temperaturaUp && humedadAire <= humedadUp && humedadSuelo <= humedadSueloUp);{
digitalWrite(relePin,HIGH);
digitalWrite(ventiladorPin,HIGH);
}
if (temperaturaAire < temperaturaLow && humedadAire >= humedadLow && humedadSuelo <= humedadSueloUp);{
digitalWrite(relePin,LOW);
digitalWrite(ventiladorPin,LOW);
}
if (temperaturaAire < temperaturaLow && humedadAire <= humedadUp && humedadSuelo >= humedadSueloLow);{
digitalWrite(relePin,LOW);
digitalWrite(ventiladorPin,HIGH);
}
if (temperaturaAire > temperaturaLow && humedadAire >= humedadLow && humedadSuelo >= humedadSueloUp);{
digitalWrite(relePin,LOW);
digitalWrite(ventiladorPin,LOW);
}
if (temperaturaAire < temperaturaUp && humedadAire >= humedadLow && humedadSuelo >= humedadSueloUp);{
digitalWrite(relePin,LOW);
digitalWrite(ventiladorPin,HIGH);
}
}
unsigned long tiempoActual = millis(); // Obtener Tiempo actual
void enviarDatosThingSpeak(float humedadAire, float temperaturaAire, float humedadSuelo) {
// Enviar los datos a ThingSpeak
ThingSpeak.setField(1, humedadAire);
ThingSpeak.setField(2, temperaturaAire);
ThingSpeak.setField(3, humedadSuelo);
int resultCode = ThingSpeak.writeFields(ChannelNumber, ApiKey);
if (resultCode == 200) {
Serial.println("Datos enviados a ThingSpeak con éxito");
} else {
Serial.println("Error al enviar datos a ThingSpeak. Código de error: " + String(resultCode));
}
}