#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <WiFi.h>
#include <ThingSpeak.h>
const int myChannelNumber = 3338293;
const char* myAPIKey = "ZP0D7VVIA5EMNIOO";
const char* server ="api.thingspeak.com" ;
char* ssid = "Wokwi-GUEST";
char* pass = "";
WiFiClient client;
// Configuración de la pantalla OLED
#define I2C_SDA 21
#define I2C_SCL 22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Configuración del sensor de humedad y la bomba de agua
const int pinSensorHumedad = 34; // Pin analógico para el sensor de humedad
const int DHT_PIN = 13; // Pin digital para el sensor DHT
const int pinBomba = 23; // Pin digital para la bomba de agua
const int umbralHumedad = 500; // Umbral de humedad
DHTesp dht;
void setup() {
Serial.begin(115200); // Inicializa el monitor serial para depuración
// Inicializa la comunicación I2C
Wire.begin(I2C_SDA, I2C_SCL);
// Inicializar la pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Error al inicializar SSD1306"));
for (;;); // Bucle infinito si falla la inicialización
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Conectando WiFi...");
display.display();
// Conectar WiFi
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Conectado");
ThingSpeak.begin(client); // Inicializar ThingSpeak
// Configurar el pin de la bomba como salida
pinMode(pinBomba, OUTPUT);
digitalWrite(pinBomba, LOW);
// Inicializar el sensor DHT
dht.setup(DHT_PIN, DHTesp::DHT22);
}
void mostrarDatos(int humedad, float temperatura, bool estadoRiego) {
display.clearDisplay(); // Limpiar pantalla
display.setTextSize(1); // Tamaño de texto
display.setTextColor(SSD1306_WHITE); // Color del texto
display.setCursor(0, 0);
display.print("Humedad Suelo: % ");
display.println(humedad);
display.print("Temperatura: C ");
display.println(temperatura);
display.print("Riego: ");
display.println(estadoRiego ? "Activado" : "Desactivado");
display.display(); // Mostrar en la pantalla
}
void controlRiego() {
// Leer el valor del sensor de humedad
int valorHumedad = analogRead(pinSensorHumedad);
Serial.print("Humedad del suelo: ");
Serial.println(valorHumedad);
// Leer datos del sensor DHT
float temperatura = dht.getTemperature();
int humedadDHT = dht.getHumidity();
// Verificar si se debe activar el riego
bool estadoRiego = false;
if (valorHumedad < umbralHumedad) {
digitalWrite(pinBomba, HIGH); // Activar la bomba
estadoRiego = true;
} else {
digitalWrite(pinBomba, LOW); // Desactivar la bomba
}
// Mostrar datos en la pantalla OLED
mostrarDatos(valorHumedad, temperatura, estadoRiego);
ThingSpeak.setField(1, valorHumedad);
ThingSpeak.setField(2, temperatura);
int x = ThingSpeak.writeFields(myChannelNumber, myAPIKey);
if(x == 200){
Serial.println("Canal actualizado en ThingSpeak.");
} else {
Serial.println("Error actualizando ThingSpeak: ");
}
Serial.println("---");
delay (150000);
}
void loop(){
controlRiego();
delay(1000);
}