Header image  
Electricidad, Electrónica, automatización industrial, láser, vacío  
line decor
    INICIO  || Traductor de idiomas ||
line decor
 
 
 
 

 
 

Automatismo mejorado de control presión y temperatura con Arduino

Diseño e implementación de un control PID para ajustar la presión en conductos de ventilación de AC, teniendo en cuenta la temperatura:

Solución con Arduino y regulador Dimmer monofásico:

El problema del Dimmer:

Circuito o esquema final:

 

Resultado final:

automatismo presion

Resumen del programa y funcionamiento general.

Nota: Repasar código, hay más funciones implementadas, ya que es la última versión comercial.

Código programa:

// Automatismo control presión. Mantiene la presión constante del ventilador sin pasarse al cerrar compuertas.
// Diseño por Alfonso Torres Rodríguez, y Jordi Hortal, 22-7-2013
#include <DallasTemperature.h>
// #include <Wire.h>
#include <OneWire.h>
// #include <LiquidCrystal_I2C.h>
// #include <Time.h>
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature tempSensor(&oneWire);
#include <avr/wdt.h> // Libreria watchdog

// #include <Servo.h>
#include <PID_v1.h>

//Define las variables que se usarán en el PID
double Setpoint, Input, Output;

//Especifica los valores iniciales del PID y las variables que se usarán
PID myPID(&Input, &Output, &Setpoint,20,10,0.1, DIRECT);

// Servo myservo; // Crea un objeto de servo

float temp;
int potpin = 0; // VALOR SONDA PRESION
int setpin = 6; // VALOR SET POTENCIOMETRO
int pinldr = 9;
int pincompresor = 10;
float val = 0, valset = 0; // variables de trabajo
float pcalibrado = 0, presion = 0; // Variables de trabajo
const float convmbar = 0.014; // Valor conversión bits de entrada analógica a presión en mBar
unsigned long lasttime = 0;
boolean canviestat = false;

void setup()
{
analogReference(INTERNAL); // Posa la referencia a 1,1V
tempSensor.begin(); //per defecte 9 bits
// myservo.attach(9); // Configura servo en el pin 9
Serial.begin(9600);
Serial.println(" ----------------- Inicio programa ---------------- ");
Serial.println("Diseno programa por Alfonso Torres Rodriguez (Altortech), y Jordi Hortal 24-4-2013");
Serial.println("Automatismo control presion para motores monofásicos 230VAC");
Serial.println();
Serial.println("Espera 10 segundos con motor parado para calibrar sonda presion ...");
// myservo.write(150); // Pone el servo a 150 grados, que es el 0% de potencia del motor
analogWrite(pinldr,0); // Detiene el ventilador
delay(10000); // Espera 10 segundos a que el motor esté parado
for(int i=0;i<100;i++){ // Media de 100 lecturas
pcalibrado = pcalibrado + (analogRead(potpin)*convmbar); // Acumulador de la media de 100 lecturas, del valor de presión de la sonda.
}
pcalibrado = pcalibrado / 100; // Divide y obtiene la media
Serial.println("Valor presión calibrado mBar = ");
Serial.print(pcalibrado);
Serial.println();
Serial.println("Fin setup -----------");

myPID.SetMode(AUTOMATIC); // Configuración del PID en modo Automático
// .......................................................
wdt_enable(WDTO_8S); // Activa watchdog cada 8s
wdtSetup(); // Activa el Watchdog
// .......................................................
// wdt_reset(); // Llamada a la función reset del watchdog, si no la llamamos, se resetea
/* Configuración timers watchdog --------------------------------------------------------------
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S
*/
pinMode(pincompresor, OUTPUT);
digitalWrite(pincompresor, HIGH);

}

void loop()
{
tempSensor.requestTemperatures();//demano xl bus a tothom que agafi valor de temperatura
temp = tempSensor.getTempCByIndex(0); //crec que es per si tenim mes de una sonda les poguem identificar no ho tinc molt clar

if(temp < 5){
digitalWrite(pincompresor, LOW);
Serial.println("Temperatura inferior a 5 graus en evaporador");
lasttime = millis();
}else{
if(millis() > lasttime + 300000){
digitalWrite(pincompresor, HIGH);
}
}
for(int i=0;i<200;i++){ // Media de 100 lecturas
val = analogRead(potpin); // Lectura de la sonda de presión
Input = Input + ((val*convmbar) - pcalibrado); // Conversión de la lectura a presión y entrada al algoritmo PID
Setpoint = Setpoint + (analogRead(setpin)*convmbar); // Lectura setpoint i entrada al algoritmo PID

}
Setpoint = analogRead(setpin); // Lectura corregida del SETPOINT
Input = Input / 200; // Lectura sensor corregida INPUT
myPID.Compute(); // Cálculo del PID
// myservo.write(map(Output,0,255,150,20)); // Salida OUTPUT aplicado al control del servo.
analogWrite(pinldr, Output); // Salida OUTPUT aplicado al control del servo.
delay(5); // Delay para que el servo actue
wdt_reset(); // Resetea el watchdog
Serial.print("Presión mBar= ");
Serial.print(Input);
Serial.print(" Setpoint mBar= ");
Serial.print(Setpoint);
Serial.print(" Sortida PWM = ");
Serial.print(Output);
Serial.print(" Temperatura actual = ");
Serial.println(temp);
}

void wdtSetup() { // Watchdog
cli();
MCUSR = 0;
WDTCSR |= B00011000;
WDTCSR = B01100001; // Set a 8 segundos el watchdog
sei();
}


Notas:
- El sensor de presión lleva un tubito conectado a la salida de la impulsión.

Programa para descargar:

Descarga programa Versión 03 Comercial.INO

Dudas y comentarios a alfonatr@hotmail.com

Volver al index