Setup universal heating function & heating strategy
This commit is contained in:
parent
3ef9b13ce7
commit
068ce0b865
73
main.c
73
main.c
@ -99,30 +99,21 @@ int fetchClimate(int8_t* humidity, int8_t* temperature) {
|
|||||||
#define __delay_ms2(ms) {uint8_t __delay_ms_i = (ms); while(__delay_ms_i > 0){ __delay_ms_i--; __delay_us(1000); }}
|
#define __delay_ms2(ms) {uint8_t __delay_ms_i = (ms); while(__delay_ms_i > 0){ __delay_ms_i--; __delay_us(1000); }}
|
||||||
|
|
||||||
#define HEAT_DURATION 60 // When heating, heating for a minute
|
#define HEAT_DURATION 60 // When heating, heating for a minute
|
||||||
// Water heating at about 100% if 255, and 0% if 0.
|
// Heating at about 50% if 255, and 0% if 0. Do not exceed 128.
|
||||||
void heat1(uint8_t rate) {
|
// This function can?t be used to heat at more than 50% power.
|
||||||
// For each tenth of second of HEAT_DURATION, heats in the proportion of rate.
|
void heat(uint8_t rate_water, uint8_t rate_heat) {
|
||||||
uint8_t delay_on = (uint8_t) (rate / 2.55); // Total elapsed time is 16s
|
// Calculate time repartition for 100 ms
|
||||||
uint8_t delay_off = 101 - delay_on;
|
uint8_t delay_on_water = (uint8_t) (rate_water / 5.1);
|
||||||
|
uint8_t delay_on_heat = (uint8_t) (rate_heat / 5.1);
|
||||||
|
uint8_t delay_off = 101 - delay_on_water - delay_on_heat;
|
||||||
|
|
||||||
for(int i = 0; i < HEAT_DURATION; i++){
|
for(int i = 0; i < HEAT_DURATION; i++){
|
||||||
for(int j = 0; j < 10; j++){
|
for(int j = 0; j < 10; j++){
|
||||||
CTRL_1 = 1;
|
CTRL_1 = 1;
|
||||||
__delay_ms2(delay_on);
|
__delay_ms2(delay_on_water);
|
||||||
CTRL_1 = 0;
|
CTRL_1 = 0;
|
||||||
__delay_ms2(delay_off);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
// Global heating at about 100% if 255, and 0% if 0.
|
|
||||||
void heat2(uint8_t rate) {
|
|
||||||
// For each tenth of second of HEAT_DURATION, heats in the proportion of rate.
|
|
||||||
uint8_t delay_on = (uint8_t) (rate / 2.55); // Total elapsed time is 16s
|
|
||||||
uint8_t delay_off = 101 - delay_on;
|
|
||||||
for(int i = 0; i < HEAT_DURATION; i++){
|
|
||||||
for(int j = 0; j < 10; j++){
|
|
||||||
CTRL_2 = 1;
|
CTRL_2 = 1;
|
||||||
__delay_ms2(delay_on);
|
__delay_ms2(delay_on_water);
|
||||||
CTRL_2 = 0;
|
CTRL_2 = 0;
|
||||||
__delay_ms2(delay_off);
|
__delay_ms2(delay_off);
|
||||||
}
|
}
|
||||||
@ -154,36 +145,12 @@ void main() {
|
|||||||
OPTION_REGbits.TMR0CS = 0; // Use internal clock
|
OPTION_REGbits.TMR0CS = 0; // Use internal clock
|
||||||
OPTION_REGbits.TMR0SE = 0; // Increment on rising edge
|
OPTION_REGbits.TMR0SE = 0; // Increment on rising edge
|
||||||
|
|
||||||
// Not using PWM as it is not working.
|
|
||||||
// PWM config PWM1 on RA5 and PWM3 on RA2
|
|
||||||
PWM3CLKCON = 0b01110000; // - Divide source clock by 128 -> 62500Hz - - FOSC clock source
|
|
||||||
PWM3PRH = 0xff; // Count to 65535 -> 1Hz full loop
|
|
||||||
PWM3PRL = 0xff;
|
|
||||||
PWM3PHH = 0; // No phase count
|
|
||||||
PWM3PHL = 0;
|
|
||||||
PWM3OFH = 0; // No offset
|
|
||||||
PWM3OFL = 0;
|
|
||||||
PWM3DCH = 0; // Comparator set to 0 -> always off
|
|
||||||
PWM3DCL = 0;
|
|
||||||
//PWM3CON = 0b11000000; // Module enable - Output enable - Output state 0 (off) - Output active state is high - Standard PWM mode
|
|
||||||
APFCONbits.P1SEL = 1; // PWM1 on RA5
|
|
||||||
PWM1CLKCON = 0b01110000; // - Divide source clock by 128 -> 62500Hz - - FOSC clock source
|
|
||||||
PWM1PRH = 0xff; // Count to 65535 -> 1Hz full loop
|
|
||||||
PWM1PRL = 0xff;
|
|
||||||
PWM1PHH = 0; // No phase count
|
|
||||||
PWM1PHL = 0;
|
|
||||||
PWM1OFH = 0; // No offset
|
|
||||||
PWM1OFL = 0;
|
|
||||||
PWM1DCH = 0; // Comparator set to 0 -> always off
|
|
||||||
PWM1DCL = 0;
|
|
||||||
//PWM1CON = 0b11000000; // Module enable - Output enable - Output state 0 (off) - Output active state is high - Standard PWM mode
|
|
||||||
|
|
||||||
|
|
||||||
// Target (except from nov. to feb.: 15°):
|
// Target (except from nov. to feb.: 15°):
|
||||||
// temp = 24 to 28°
|
// temp = 24 to 28°
|
||||||
// hum = 60 to 80%
|
// hum = 60 to 80%
|
||||||
int8_t hum_target = ((int8_t) 80);
|
int8_t hum_target = ((int8_t) 62);
|
||||||
int8_t temp_target = ((int8_t) 40);
|
int8_t temp_target = ((int8_t) 25);
|
||||||
|
int8_t temp_max = ((int8_t) 28);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int8_t hum = 0;
|
int8_t hum = 0;
|
||||||
@ -193,26 +160,28 @@ void main() {
|
|||||||
__delay_ms(100);
|
__delay_ms(100);
|
||||||
|
|
||||||
hist_step_count++;
|
hist_step_count++;
|
||||||
if(hist_step_count == 10) {
|
if(hist_step_count == 30) { // Stores one value per 30min.
|
||||||
hist_step_count = 0;
|
hist_step_count = 0;
|
||||||
|
if (hist_count < 72) {
|
||||||
temp_hist[hist_count] = temp;
|
temp_hist[hist_count] = temp;
|
||||||
hum_hist[hist_count] = hum;
|
hum_hist[hist_count] = hum;
|
||||||
hist_count++;
|
hist_count++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(is_error){
|
if(is_error){
|
||||||
LATAbits.LATA4 = 0;
|
LATAbits.LATA4 = 0;
|
||||||
__delay_ms(1000);
|
__delay_ms(1000);
|
||||||
}else{
|
}else{
|
||||||
if(hum < hum_target){
|
if(hum < hum_target && temp < temp_target){
|
||||||
heat1(128); // 50% Power
|
heat(127, 127); // 25% humidify, 25% heat
|
||||||
|
}else if(hum < hum_target && temp < temp_max){
|
||||||
|
heat(127, 0); // 25% humidify
|
||||||
}else if(temp < temp_target){
|
}else if(temp < temp_target){
|
||||||
heat2(128);
|
heat(0, 127); // 25% heat
|
||||||
}else {
|
}else {
|
||||||
__delay_s(HEAT_DURATION);
|
__delay_s(HEAT_DURATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//PWM3DCH = 128; // 50% power
|
|
||||||
//PWM1DCH = 128; // 50% power
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user