Hola a todos;
Es mi primer post.
Tengo un problema de realización de un PID bajo otras condiciones.
Ejemplo para dar la estructura del problema, formulare el escenario tengo un calentador o enfriador de agua que puede usar resistencia de calor sumergibles y celdas de peltier:
PID Maestro en trabajo de conjunto con varios PID:
Este PID MAESTROS toma los datos de 5 PID independiente y según su toma de datos proveniente de:
PID#1 que tiene un sensor temperatura DS18B20 #1 (Dato de entrada condicional y la lectura da PID#2, PID#3, PID #4 y PID#5 en estado OK)
PID#2 que tiene un sensor temperatura DS18B20 #2
(Dato real de trabajo del lugar a temperatura iniciada en el Setpoint "A1" por el usuario y de seguridad)
PID#3 que tiene un sensor temperatura DS18B20 #3 (Dato de estable ser resultados que busca el usuario puesto en Setpoint "B1" del usuario y está activado con las condiciones "OK" entre PID#4 y PID#5
PID#4 que tiene un sensor de caudal FS300A (el propósito es dar un dato más fiable y entrega estos datos para "<los PID #:1,4,5> para su activación cuando entre en funcionamiento la entrega de datos" y aparte estos datos le entrega PID#6 que es un control de potencia)
PID#5 que tiene toma de dato nivel ( es un PID de seguridad de punto de paso cero con H11AA1 para que este aislado en caso de un corto o el switch está en ON indica que cumple la condición de activar el proceso y en OFF de nunca activar el proceso)
PID#6 MAESTRO es un control de potencia que toma las condiciones de los PID 1,2,4 y 5 para que el PID#3 tenga su resultado más estable y el consumo de energía sea muy bajo.
Aparte hay dos punto de seguridad en la alimentación que se lo pone en la PID maestra
1.- tiene un switch térmico su posición en OFF desactiva con un H11AA1 el proceso por seguridad si existe un auto enclavamiento del triac y por prevención algo lo tiene que desconectar y reporta el error en pantalla.
1.1.- Pero también con una sentencia con el switch térmico si es posible de activar el proceso cuando este en ON con su dato limitante que dice que si pasa de “X temperatura se pagará el sistema de servicio”
Busco consejo para ver que sentencia son las mejor adecuadas a pesar de tomar la Liberia de Arduino
https://playground.arduino.cc/Code/PIDLibrary
que comandos son más adecuados, para un código más simple y más limpio dentro de un conjunto hasta cunado el datos aun es en CERO ósea se pone en un punto inicial ya que es una forma de recrear un bucle de varios PID para que UN PID maestros recree las condiciones adecuada.
Aparte idea es que un PID#6 "MAESTRO" calcule el Setpoint, para que el otro lo recoja y mande una señal más correcta a los TRIAC. ¿Es eso posible?
Lo digo porque el problema que tengo es que claro, Arduino lee las instrucciones de arriba abajo y no en un punto global dentro de un conjunto.
Entonces, al principio el Setpoint se declara como double y se inicializa con 0...hace todos los cálculos...obtiene un nuevo Setpoint y este quiero que sustituya al inicial. Es decir, que deje de ser un 0 y pase a ser el último valor calculado.
También con el H11AA1 y el dato del Switch térmico en falla indicaría la falla total y reportar alarma.
Me gustaría incorporar un sensor Modelo SEN-SCT-013-000 "100amp" y Modelo SEN-SCT-013-030 "30amp" o para que el sistema lea el consumo y limite por seguridad o esta demás pregunto.
a aparte si es aprovechable el código de esta página para un PID con 3 sensores en cascada en sensores de temperatura
#include <OneWire.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte addr[8];
Serial.println("Obteniendo direcciones:");
while (ourWire.search(addr))
{
Serial.print("Address = ");
for( int i = 0; i < 8; i++) {
Serial.print(" 0x");
Serial.print(addr, HEX);
}
Serial.println();
}
Serial.println();
ourWire.reset_search();
delay(2000);
}
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
DeviceAddress address1 = {0x28, 0xFF, 0xCA, 0x4A, 0x5, 0x16, 0x3, 0xBD};//dirección del sensor 1
DeviceAddress address2 = {0x28, 0xFF, 0x89, 0x3A, 0x1, 0x16, 0x4, 0xAF};//dirección del sensor 2
DeviceAddress address3 = {0x28, 0xFF, 0x23, 0x19, 0x1, 0x16, 0x4, 0xD9};//dirección del sensor 3
void setup() {
delay(1000);
Serial.begin(9600);
sensors.begin(); //Se inicia el sensor
}
void loop() {
sensors.requestTemperatures(); //envía el comando para obtener las temperaturas
float temp1= sensors.getTempC(address1);//Se obtiene la temperatura en °C del sensor 1
float temp2= sensors.getTempC(address2);//Se obtiene la temperatura en °C del sensor 2
float temp3= sensors.getTempC(address3);//Se obtiene la temperatura en °C del sensor 3
Serial.print("Temperatura 1 = ");
Serial.print(temp1);
Serial.print(" C");
Serial.print(" Temperatura 2 = ");
Serial.print(temp2);
Serial.print(" C");
Serial.print(" Temperatura 3 = ");
Serial.print(temp3);
Serial.println(" C");
delay(100);
delay(100);
}
pero dejando a los 3 sensores de temperatura la Resolución cada uno con temp#3 en 12 bits, temp#1 en 10bits y temp#2 en 9bits para que tenga una independencia y actué mejor PID por corrección
sensors.setResolution(Address, 9); // resolución de 9 bits
o este codigo de ejemplo
https://polaridad.es/medida-temperatura-arduino-ds18b20-1-wire/