Danke UliMerkel ! It is mentioned indeed!
Second pass over the code without any additional functionality but just with the advices of Gordon implemented.
Will use:
Espruino pico as controller
I2C1 for communication with HTU21D
IE: pin B7 I2C1 SDA .... DATA, pin B6 I2C1 SCL... CLOCK
triac control is connected via a MOC3083 optocoupler whoes LED is sourced via a resistor on pin A8
var triac;
I2C1.setup( {scl: B6, sda: B7, bitrate 56000 } );
var htu = require('HTU21D').connect( I2C1 );
var temp;
var averageTemp;
var humidity;
var compHumidity; // improved accuracy for humidity
var targetTemp;
// for the finetuning of the regulation we will keep in TempHistory the
// historical values of the last hour
var tempHistory = Float32Array(60);
function onInit () {
// Before anything else we should turn off the triac
triac=A8;
digitalWrite(triac,0); //this shoud reset the pin and set it as output
temp = htu.readTemperature();
//at power-on we assume the temperature was constant for the last hour
tempHistory.fill(temp);
averageTemp = temp;
//turn HTU21D heater on for two seconds just to make sure the HTU21D sensor
//has no condensation
htu.setHeaterOn( true );
setTimeout('htu.setHeaterOn( false )'; 2000);
targetTemp = 8.50;
}
function pidControlLoop() {
temp = htu.readTemperature();
humidity = htu.readHumidity();
compHumdity = htu.getCompensatedHumidity( humidity, temp );
var regulatedTemp = targetTemp;
//we want to check that moving towards regulated temp does not produce
//condensation. Furthermore, if the current temp is close or bellow
//dew point we wish to move to higher temp
var dewPointTemp=htu.getDewPoint(temp,compHumdity);
if (((targetTemp-dewPointTemp) < 1) || ((temp - dewPointTemp) < 1)) {
regulatedTemp=dewPointTemp + 1;
}
//same, we want to check that the temperature one hour ago was above
//the dew point temperature
//this is because the metal and glass of the photo lenses has thermal
//inertia and we don't want condensation to occur on these. We better
//move slowly to higher temperature if such.
if ((tempHistory[59] - dewPointTemp) < 1) {
regulatedTemp = tempHistory[59] + 1;
}
// here we apply the proportional-integrative-derivative control with some
// coefficients we feel appropriate. We will make some temperature regulation
// graphs to finetune these coefficients once the system is running
var PIDresult =0.5 * (regulatedTemp-temp + 10 * (regulatedTemp-averageTemp) + 25 * (tempHistory[0]-temp));
//for summer days we should imagine vent./AC control if PIDresult is < zero...
calculatedPWM = E.clip (PIDresult, 0, 1);
analogWrite(triac, calculatedPWM, { freq : 2 });
//Prepare for the next loop
averageTemp = averageTemp - (tempHistory[59] - temp)/60;
for (i=59;i>0;i--) {
tempHistory[i] = tempHistory[i-1];
}
tempHistory[0] = temp;
}
//power on initialization
onInit();
// hereby we set the control loop to 60 seconds
setInterval('pidControlLoop()',60000);
My "mission" over the week-end: tweak the HTU21D module and define instead some sort of a function that reads the values of temperature and humidity from two potentiometers just to move forward with code debugging and triac control while awaiting for the prototype components.
Wish you will enjoy your weekend too !
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
Danke UliMerkel ! It is mentioned indeed!
Second pass over the code without any additional functionality but just with the advices of Gordon implemented.
Will use:
Espruino pico as controller
I2C1 for communication with HTU21D
IE: pin B7 I2C1 SDA .... DATA, pin B6 I2C1 SCL... CLOCK
triac control is connected via a MOC3083 optocoupler whoes LED is sourced via a resistor on pin A8
My "mission" over the week-end: tweak the HTU21D module and define instead some sort of a function that reads the values of temperature and humidity from two potentiometers just to move forward with code debugging and triac control while awaiting for the prototype components.
Wish you will enjoy your weekend too !