#include <WiFi.h>
#include <ThingSpeak.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
// Configuración WiFi
const char* ssid = "Wokwi-GUEST"; // WiFi de Wokwi
const char* password = ""; // Contraseña vacía para Wokwi
WiFiClient client;
// Configuración ThingSpeak
unsigned long channelID = 2767550; // Reemplaza con tu Channel ID
const char* writeAPIKey = "NU1MBU26RR0LWT7R"; // Reemplaza con tu Write API Key
// Pines de sensores
#define ONE_WIRE_BUS 14 // Pin para el sensor DS18B20
#define DHTPIN 25 // Pin para el sensor DHT22
#define DHTTYPE DHT22 // Tipo de sensor DHT
#define POTENTIOMETER_PIN 35 // Pin del potenciómetro
// Pines de actuadores
#define RELAY_PIN 17 // Temperatura
#define histHaciaArriba 9 // Banda de histéresis hacia arriba
#define histHaciaAbajo 3 // Banda de histéresis hacia abajo
// Variables para el control de temperatura
float setPoint= 68; // Variable que almacena el valor del Set Point
#define LED_PIN 4 // Flujo
#define histHaciaArriba 6 // Banda de histéresis hacia arriba
#define histHaciaAbajo 2 // Banda de histéresis hacia abajo
// Variables para el control de temperatura
float SetPoint= 45; // Variable que almacena el valor del Set Point
#define LED2_PIN 12
#define histHaciaArriba 0.3 // Banda de histéresis hacia arriba
#define histHaciaAbajo 0.4 // Banda de histéresis hacia abajo
// Variables para el control de temperatura
float CetPoint= 1.5; // Variable que almacena el valor del Cet Point
// Rangos de validación
const float TEMP_MIN = 60.0, TEMP_MAX = 75.0; // °C
const float FLOW_MIN = 45.0, FLOW_MAX = 50.0; // L/min
const float CONC_MIN = 1.0, CONC_MAX = 1.5; // %
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// Configuración WiFi
Serial.begin(115200);//activar comunicación serial
// Inicialización de sensores
sensors.begin();
dht.begin();
// Configuración de actuadores
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
// Inicialización de actuadores apagados
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
WiFi.begin("Wokwi-GUEST","");
ThingSpeak.begin(client);
}
void loop() {
// Lectura del sensor DS18B20 (temperatura en °C)
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0); // En °C
int tempInt = (int)temp;
Serial.print(tempInt);
Serial.println("ºC");
// Lectura del sensor DHT22 (concentración en %)
float conc = dht.readHumidity();
int concInt = (int)conc;
Serial.print(concInt);
Serial.println("%");
// Lectura del potenciómetro(flujo en L/min)
int flow = analogRead(POTENTIOMETER_PIN); // Valor bruto del potenciómetro
int flowInt = (int)flow;
Serial.print(flowInt);
Serial.println("L/min");
// Lógica de control ON - OFF de actuadores
// Temperatura
if (temp >=(setPoint + histHaciaArriba)) { // Fuera del rango de temp
digitalWrite(RELAY_PIN, HIGH); // Activa el relé
Serial.println("Relé activado: Temperatura fuera de rango");
} if (temp <=(setPoint - histHaciaAbajo)) {
digitalWrite(RELAY_PIN, LOW); // Desactiva el relé
Serial.println("Relé apagado: Temperatura dentro de rango");
}
delay(500);//esperar
// Flujo / Caudal
if (flow >=(SetPoint + histHaciaArriba)) { // Fuera del rango de flow
digitalWrite(LED_PIN, HIGH); // Activa el led
Serial.println("LED activado: Flujo fuera de rango");
} if (flow <=(SetPoint - histHaciaAbajo)) {
digitalWrite(LED_PIN, LOW); // Apaga el led
Serial.println("LED apagado: Flujo dentro de rango");
}
delay(500);//esperar
// Concentració detergente
if (conc >=(CetPoint + histHaciaArriba)) { // Fuera del rango de conc
digitalWrite(LED2_PIN, HIGH); // Activa el led2
Serial.println("LED2 activado: Concentración fuera de rango");
} if (conc <=(CetPoint - histHaciaAbajo)) {
digitalWrite(LED2_PIN, LOW); // Apaga el led2
Serial.println("LED2 apagado: Concentración dentro de rango");
}
delay(500);//esperar
// Enviar datos a ThingSpeak
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, flow);
ThingSpeak.setField(3, conc);
int x = ThingSpeak.writeFields(2767550, "NU1MBU26RR0LWT7R");
if (x == 200) {
Serial.println("Datos enviados correctamente a ThingSpeak");
} else {
Serial.println("Error al enviar datos a ThingSpeak");
}
// Desde aqui el control remoto de bomaba de mezcla de deteregente
int estado = ThingSpeak.readIntField(2767550,3);
Serial.println(estado);
digitalWrite(LED2_PIN, estado);
delay(15000); // Espera 15 segundos entre actualizaciones
}