Prima versione di programma con arduino di gestione tramite scheda PWM, proporzionale in base a Delta T tra T esterna e Punto di Rugiada
Codice:
/* controllo proporzionale della fascia anti condensa
in base alla temperatura di rugiada e la temperatura misurata
con scheda di controllo arduino nano e MOS Module 1,5A
sensore di temperatura DS18B20, umidità DHT22, pressione bmp280 (non utilizzata), buzzer passivo
preso spunto da progetto di Simone Martina - 2018/05/02
** update by Giorgio Anzelini ** 2024/08/05
*/
#define DHT22_S1 3 // assegno PIN per sonda Temp. Umidità
#define DS18B20_1 4 // assegno PIN sonde temperatura DS18B20
#define DewHeather 9 // assegno PIN regolatore PWM
#define Buzzer_1 10 // assegno PIN Buzzer, avvisa che siamo prossimi alla temperatura di rugiada
// ******* LIBRERIE UTILIZZATE *******
#include <OneWire.h> // sonde DS18B20
#include <DallasTemperature.h> // sonde DS18B20
#include "DHT.h" // sonda DHT11 +-2° +-5% / DHT22 +-0,5° +-2%
#include <Adafruit_BMP280.h> // sonda BMP280 i2C pressione +-12hPa
DHT dht(DHT22_S1, DHT22);
OneWire oneWire(DS18B20_1);
DallasTemperature sensore(&oneWire);
#define precision 12 // OneWire precision Dallas Sensor
float temperaturaSonda;
//Pausa tra le letture
unsigned long intervallo = 300; //default 300 (secondi) = 5minuti
float t1, h1, hic1, tempsonda; // valori da sensore DHT22 e sonda Temperatura
float gamma, PuntoRugiada; // variabili calcolo temperatura di rugiada (DewPoint)
byte buzzON = 0; // abilita buzzer
//******** VARIABILI PRESSIONE BMP280 ********
Adafruit_BMP280 bmp; // I2C Interface
#define SEALEVELPRESSURE_HPA (1013.25) // definisci la pressione standard s.l.m.
float PressureRead;
byte MaxTemp = 25; // assegnare valore temperatura massimo di intervento oltre la quale PWM si spegne
byte differenziale = 10; // temperatura di sicurezza per la prevensione della condensa
byte minDiff = 2; // soglia di intervento, PWM al 100%
byte maxScarto = 5; // soglia di non intervento, PWM a 0%
byte PWM_powerOUT = 0; // 0-255 variabile regolazione potenza PWM di uscita regolatore 12V
byte PWM_minPower = 30; // minima potenza percentuale OUT
byte PWM_maxPower = 100; // massima potenza percentuale OUT
float deltaT;
void setup() {
Serial.begin(9600);
sensore.begin(); // inizializza i sensori su linea BUS DS18B20
sensore.setResolution(DS18B20_1, precision); // definisci la precisione del sensore (12bit = 0,0625°)
pinMode( DHT22_S1, INPUT ); //NON NECESARI
pinMode( DewHeather, OUTPUT ); //NON NECESARI
pinMode( Buzzer_1, OUTPUT ); //NON NECESARI
dht.begin();
bmp.begin(0x76); // inizializza il sensore pressione BMP280 e definisci l'indirizzo I2C = 0x76
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
intervallo = intervallo*1000; //trasforma in millisecondi
PWM_minPower = map(PWM_minPower, 0, 100, 0, 255); // conversione minima potenza 0-255 di OUT
PWM_maxPower = map(PWM_maxPower, 0, 100, 0, 255); // conversione massima potenza 0-255 OUT
}
void loop() {
sensore.requestTemperatures(); // richiedi lettura sensori temperatura su BUS OneWire dei DS18B20 //will take about 750ms to run
temperaturaSonda = getTempSonda();
umidity1(); // richiama i cicli sotto
Pressure();
//calcolatore Punto di Rugiada (dew point), utilizza la formula di Magnus-Tetens
gamma = log(h1 / 100) + ((17.62 * temperaturaSonda) / (243.5 + temperaturaSonda));
PuntoRugiada = 243.5 * gamma / (17.62 - gamma);
deltaT = temperaturaSonda-PuntoRugiada;
if(temperaturaSonda > MaxTemp || deltaT > (differenziale+maxScarto))
{ PWM_powerOUT = 0;
buzzON=0;
}
else if (deltaT>= minDiff)
PWM_powerOUT = map(deltaT, minDiff, differenziale, PWM_maxPower, PWM_minPower); // mappa deltaT in PWM 20%-100%
else if (deltaT<minDiff)
{ PWM_powerOUT = PWM_maxPower;
for(buzzON=0; buzzON<3; buzzON++)
{ analogWrite( Buzzer_1, 100 );
delay(350);
analogWrite( Buzzer_1, 0 );
delay(350);
}
}
analogWrite(DewHeather, PWM_powerOUT);
serialPrint();
delay(intervallo);
}
//****************** FUNZIONE: LETTURA TEMPERATURE SONDE ******************
float getTempSonda()
{ float tempsonda = sensore.getTempCByIndex(0);
return tempsonda;
}
void umidity1()
{ t1 = dht.readTemperature();
h1 = dht.readHumidity();
hic1 = dht.computeHeatIndex(t1, h1, false); // Compute heat index in Celsius (isFahreheit = false)
return t1;
return h1;
return hic1;
}
void Pressure()
{ PressureRead=(bmp.readPressure()/100); //(bme.readPressure() / 100.0F)
return PressureRead;
}
void serialPrint()
{ Serial.print("TemperaturaSonda: "); Serial.print (temperaturaSonda,2); Serial.println("°C");
Serial.print("Temp DHT22: "); Serial.print (t1,1); Serial.println("°C");
Serial.print("Humidity: "); Serial.print (h1,1); Serial.println("%");
Serial.print("T percepita: "); Serial.print (hic1,1); Serial.println("°C");
Serial.print("Temperatura BMP280 = "); Serial.print(bmp.readTemperature()); Serial.println("°C");
Serial.print("Pressure BMp280 = "); Serial.print(PressureRead); Serial.println("hPa");
Serial.print("PWM out: "); Serial.print (PWM_powerOUT*0.392,1); Serial.println("%");
Serial.print("Temperatura di rugiada: "); Serial.print (PuntoRugiada,1); Serial.println("°C");
Serial.println();
}