#include <Arduino_FreeRTOS.h>
#include <semphr.h>
#include <OneWire.h> //Se importan las librerías
#include <DallasTemperature.h>
#include <Wire.h>
#define SENSOR_PIN A0
#define RELAY_PIN 3
#define FAN_PIN 2
#define WATER_PUMP_PIN 4
#define DEFAULT_DESIRED_TEMP 25
#define DEFAULT_TEMP_TOLERANCE 1
#define Pin 5
OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación OneWire
DallasTemperature sensors(&ourWire); //Se llama a la librería DallasTemperature
SemaphoreHandle_t semaforo;
float currentTemp = 0;
bool isConfiguring = false;
int TEMP_TOLERANCE = DEFAULT_TEMP_TOLERANCE;
int DESIRED_TEMP = DEFAULT_DESIRED_TEMP;
String string_from_UART = "";
//Crear el objeto lcd dirección 0x3F y 16 columnas x 2 filas
//LiquidCrystal_I2C lcd(0x3F,16,2); //
//TinyLiquidCrystal_I2C lcd(0x27,20,4)
void taskMonitorTemperature(void * param);
void taskControlTemperature(void * param);
void taskPrintTemperature(void * param);
//void taskConfigureTemperature(void * param);
void setup()
{
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
pinMode(WATER_PUMP_PIN, OUTPUT);
/*
// Inicializar el LCD
lcd.init();
//Encender la luz de fondo.
lcd.backlight();*/
if(semaforo == NULL)
{
semaforo = xSemaphoreCreateMutex();
if(semaforo != NULL)
{
xSemaphoreGive(semaforo); //Establecer semáforo en verde
}
}
xTaskCreate(taskMonitorTemperature, "Monitor", 128, NULL, 3, NULL);
xTaskCreate(taskControlTemperature, "Control", 128, NULL, 2, NULL);
xTaskCreate(taskPrintTemperature, "Print", 128, NULL, 1, NULL);
//xTaskCreate(taskConfigureTemperature, "Configure", 128, NULL, 4, NULL);
}
void loop(){
/* if(Serial.available())
{
char c = Serial.read();
if(c == 't'){
if(!isConfiguring)
{
Serial.println("Configurando temperatura. Ingrese los valores deseados por el puerto serial...");
isConfiguring = true;
}
else
{
Serial.println("Configuración de temperatura cancelada.");
isConfiguring = false;
}
}
}*/
if (Serial.available()) {
char c = Serial.read();
Serial.print(c);
if (c != '\n' && c != '\r') {
string_from_UART += c;
} else {
if (string_from_UART.startsWith("TEMP")) {
// Procesar comando "TEMP"
String args = string_from_UART.substring(5);
int index_of_space = args.indexOf(' ');
if (index_of_space != -1) {
String arg1 = args.substring(0, index_of_space);
String arg2 = args.substring(index_of_space + 1);
// Actualizar variables críticas
DESIRED_TEMP = arg1.toFloat();
TEMP_TOLERANCE = arg2.toFloat();
Serial.println("Umbrales de Temperatura actualizados.");
} else {
Serial.println("Comando incompleto.");
}
}
string_from_UART = "";
}
}
}
void taskMonitorTemperature(void * param)
{
TickType_t espera = (TickType_t) 1000;
for(;;)
{
if(xSemaphoreTake(semaforo, espera) == pdTRUE)
{
//currentTemp = analogRead(SENSOR_PIN) ; //Convertir lectura analógica a temperatura en grados Celsius
sensors.requestTemperatures();
currentTemp = sensors.getTempCByIndex(0) ;
//Serial.print("Temperatura actual: ");
/* lcd.print("Hola Mundo");
lcd.setCursor(0, 1);
lcd.print(currentTemp);*/
//Serial.println(currentTemp);
xSemaphoreGive(semaforo);
}
vTaskDelay(espera / portTICK_PERIOD_MS);
}
}
void taskControlTemperature(void * param)
{
TickType_t espera = (TickType_t) 1000;
for(;;)
{
if(xSemaphoreTake(semaforo, espera) == pdTRUE)
{
if(currentTemp <= (DESIRED_TEMP - TEMP_TOLERANCE))
{
digitalWrite(RELAY_PIN, HIGH); //Encender la calefacción
digitalWrite(FAN_PIN, LOW); //Apagar el ventilador
digitalWrite(WATER_PUMP_PIN, LOW); //Apagar la bomba de agua
//Serial.println("Refrigeracion apagada...");
}
else if(currentTemp >= (DESIRED_TEMP + TEMP_TOLERANCE))
{
digitalWrite(RELAY_PIN, LOW); //Apagar la calefacción
digitalWrite(FAN_PIN, HIGH); //Encender el ventilador
digitalWrite(WATER_PUMP_PIN, HIGH); //Encender la bomba de agua
// Serial.println("Encendiendo ventilador y bomba de agua...");
}
/*else
{
digitalWrite(RELAY_PIN, LOW); //Apagar la calefacción
digitalWrite(FAN_PIN, LOW); //Apagar el ventilador
digitalWrite(WATER_PUMP_PIN, LOW); //Apagar la bomba de agua
// Serial.println("Temperatura en rango deseado.");
}*/
xSemaphoreGive(semaforo);
}
vTaskDelay(espera / portTICK_PERIOD_MS);
}
}
/*
void taskConfigureTemperature(void * param)
{
TickType_t espera = (TickType_t) 1000;
for(;;)
{
if(xSemaphoreTake(semaforo, espera) == pdTRUE)
{
if(isConfiguring)
{
Serial.println("Ingrese el umbral de temperatura deseado:");
while(!Serial.available());
DESIRED_TEMP = Serial.parseInt();
Serial.print("Umbral de temperatura actualizado: ");
Serial.println(DESIRED_TEMP);
Serial.println("Ingrese la tolerancia de temperatura deseada:");
while(!Serial.available());
TEMP_TOLERANCE = Serial.parseInt();
Serial.print("Tolerancia de temperatura actualizada: ");
Serial.println(TEMP_TOLERANCE,DESIRED_TEMP);
isConfiguring = false;
}
xSemaphoreGive(semaforo);
}
vTaskDelay(espera / portTICK_PERIOD_MS);
}
}*/
void taskPrintTemperature(void * param)
{
TickType_t espera = (TickType_t) 1000;
bool ventiladorActivado = false;
for(;;)
{
if(xSemaphoreTake(semaforo, espera) == pdTRUE)
{
Serial.print("Temperatura actual: ");
Serial.println(currentTemp);
if(currentTemp > (DESIRED_TEMP + TEMP_TOLERANCE) && !ventiladorActivado)
{
Serial.println("La temperatura ha superado el umbral superior. Encendiendo ventilador...");
ventiladorActivado = true;
}
else if(currentTemp <= (DESIRED_TEMP - TEMP_TOLERANCE) && ventiladorActivado)
{
Serial.println("Apagando ventilador...");
ventiladorActivado = false;
}
if((currentTemp < (DESIRED_TEMP + TEMP_TOLERANCE)) && (currentTemp > (DESIRED_TEMP - TEMP_TOLERANCE))){
Serial.println("Temperatura en rango deseado.");
}
xSemaphoreGive(semaforo);
}
vTaskDelay(espera / portTICK_PERIOD_MS);
}
}