buongiorno, prendendo spunto da una vecchia discussione qui su questo forum, sto implementando una cella di lievitazione che attraverso una cella di peltier possa gestire il caldo ed il freddo a seconda delle esigenze (ed in futuro la gestione dell'umidità).
I componenti hardware sono:
Cella di peltier TEC1-12710
Dissipatore Alpine 11 plus
Ponte H : BTS7960 da 43 A
Alimentatore 12v 30A
Arduino Uno
Sonda di temperatura DS18B20
DHT22 per valutazione dell'umidità
Il codice che gestiva il caldo ed il freddo, SEPARATAMENTE, con un approccio Sign and Magnitude e gestione PWM, è il seguente
situazione SETPOINT < T.Ambiente (FUNZIONE FREDDO)
/*
Il programma misura la temperatura tramite il sensore DS18B20 e lo usa come ingresso al PID
L'uscita del PID pilota un circuito H-bridge
Vengono utilizzati i seguenti pin per DS18B20
Pin +5V -> Alimentazione
Pin GND -> Alimentazione
Pin Digital 2 -> Linea dati sensore DS18B20
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
/* Definizioni globali */
// Il terminale data del sensore è connesso alla porta 2 di Arduino
#define ONE_WIRE_BUS 2
// Imposta la comunicazione oneWire per comunicare
// con un dispositivo compatibile
OneWire oneWire(ONE_WIRE_BUS);
// Passaggio oneWire reference alla Dallas Temperature.
DallasTemperature sensors(&oneWire);
double Setpoint, Input, Output;
int SNS_A = A0; // current read
int LPWM = 9; // H-bridge leg 1 ->LPWM
int enL = 8; // H-bridge enable pin 1 -> L_EN
int RPWM = 6; // H-bridge leg 2 ->RPWM
int enR = 7; // H-bridge enable pin 2 -> R_EN
/* Impostazione dell'hardware */
//Inizializzazione del PID, impostazione a DIRECT (frigo)
PID myPID_COLD(&Input, &Output, &Setpoint,2,5,1, REVERSE);
void setup()
{
Setpoint = 15; //definizione del set point
Serial.begin(9600);
Serial.println("Temperatura PIDout Corrente\n");
//turn the PID on
myPID.SetMode(AUTOMATIC);
// Start up the OneWire library
sensors.begin();
// Configurazione PIN direzione e freno H-bridge
pinMode(LPWM, OUTPUT);
pinMode(RPWM, OUTPUT);
pinMode(enL, OUTPUT);
pinMode(enR, OUTPUT);
digitalWrite(enL, HIGH);
digitalWrite(enR, HIGH);
}
void loop()
{
sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
double temp = sensors.getTempCByIndex(0); // legge il valore della temperatura e la memorizza nella var. temp.
Input = temp; //temperatura passata in ingresso a PID
myPID.Compute();
digitalWrite(LPWM, LOW);
analogWrite(RPWM,Output); //PWM con segnale in uscita pari a uscita PID
Serial.print( temp); // invia i valori alla seriale
Serial.print("\t");
Serial.print((Output/255*100));
Serial.print("\t");
Serial.print(analogRead(SNS_A));
Serial.print("\n");
delay (1000);
}
per quanto riguarda invece la situazione opposta, SETPOINT > T.ambiente (funzione caldo), il funzionamento prevederebbe il funzionamento inverso del pid e lo scambio dei valori sul ponte H:
...
PID myPID_COLD(&Input, &Output, &Setpoint,2,5,1, DIRECT);
...
digitalWrite(LPWM, Output);
analogWrite(RPWM, LOW);
Ora: come posso gestire il funzionamento completo caldo/freddo considerando i problemi che si potrebbero avere ad esempio:
- sovraelongazioni durante la stabilizzazione pid che farebbero invertire la polarità;
- setpoint molto vicino alla temperatura ambiente e cambi repentini di polarità;
- frequenza del PWM rispetto alla tolleranza della cella di peltier (ho letto che si può modificare);
Un altro requisito, a cose funzionanti, è "l'inseguimento" del punto di rugiada: volendo evitare condense sul dissipatore vorrei poi impostare la temperatura del dissipatore leggermente di sopra di quella temperatura in corrispondenza della quale l'umidità relativa all'interno del box condensa. In loop, valuterei poi sempre questa temperatura, sulla base di quella che via via si abbassa e dell'umidità all'interno della cella.
Successivamente poi vorrei anche poter gestire la riduzione dell'umidità. Credo sia abbastanza semplice poichè sarebbe sufficiente far refrigerare un dissipatore con una seconda cella di peltier sulla quale far condensare appositamente l'umidità e raccoglierla in un contenitore.
L'immissione di umidità avverrebbe tramite un vaporizzatore/atomizzatore gestito in on/off valutando il tutto con un DHT22.
Insomma, tanta carne sul fuoco. Spero che a qualcuno possa interessare in modo tale da "aggiungersi" in questo viaggio..