diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -89,6 +89,7 @@ int main(void) uint32_t last_vcp_tx = 0; uint32_t last_led = 0; uint32_t last_pid = 0; + uint32_t last_thermostat = 0; int16_t ssr_output = 0; // Duty cycle of ssr, 0 to SSR_PERIOD // Main loop @@ -101,7 +102,7 @@ int main(void) last_led = HAL_GetTick(); } - if((HAL_GetTick() - last_pid > PID_PERIOD)) + if(set.val.control_mode == MODE_PID && (HAL_GetTick() - last_pid > PID_PERIOD)) { #ifdef MAX31865_RTD_SENSOR @@ -115,6 +116,10 @@ int main(void) { // Get ssr output for next time int16_t power_percent = pid_update(&set, &status, &pid_state); + + if(set.val.plant_type == PLANT_HEATER) + power_percent *= -1; + //power-percent is 0-1000? ssr_output = power_percent; //(((uint32_t)SSR_PERIOD * (uint32_t)10 * (uint32_t)100) * power_percent) / (uint32_t)1000000; @@ -134,20 +139,19 @@ int main(void) } // Kill SSR once the desired on-time has elapsed - if(HAL_GetTick() - last_ssr_on > ssr_output || ssr_output <= 0) + if(set.val.control_mode == MODE_PID && (HAL_GetTick() - last_ssr_on > ssr_output || ssr_output <= 0)) { HAL_GPIO_WritePin(SSR_PIN, 0); HAL_GPIO_WritePin(LED_POWER, 0); } + // Every 200ms, set the SSR on unless output is 0 - if(HAL_GetTick() - last_ssr_on > SSR_PERIOD) + if(set.val.control_mode == MODE_PID && HAL_GetTick() - last_ssr_on > SSR_PERIOD) { - - // Only support heating (ssr_output > 0) right now + // Heat or cool, if we need to if(ssr_output > 0) { - HAL_GPIO_WritePin(SSR_PIN, 1); HAL_GPIO_WritePin(LED_POWER, 1); last_ssr_on = HAL_GetTick(); @@ -160,6 +164,55 @@ int main(void) } + + // Thermostatic control + if(set.val.control_mode == MODE_THERMOSTAT && HAL_GetTick() - last_thermostat > SSR_PERIOD) + { + + #ifdef MAX31865_RTD_SENSOR + max31865_readtemp(spi_get(), &set, &status); + #else + max31855_readtemp(spi_get(), &set, &status); // Read MAX31855 + #endif + + // TODO: Migrate this FxP conversion to the readtemp code or similar + int8_t temp_frac = status.temp_frac > 9 ? status.temp_frac / 10 : status.temp_frac; + temp_frac = status.temp > 0 ? temp_frac : temp_frac * -1; + int32_t temp = (status.temp * 10) + temp_frac; + + uint8_t plant_on = 0; + + // EMZ FIXME: This could be way simpler + if(set.val.plant_type == PLANT_HEATER && status.setpoint * 10 < temp) + plant_on = 1; + else if(set.val.plant_type == PLANT_COOLER && status.setpoint * 10 > temp) + plant_on = 1; + + // EMZ: TODO: Refactor to output_enabled or something + if(status.pid_enabled && plant_on) + { + // EMZ TODO: functionalize this + // put ssr output on display + ssd1306_drawstring(" ", 0, 90); //fixme: this is bad, but I can't get the old digits to clear otherwise + char tempstr[6]; + itoa(ssr_output, tempstr, 10); + ssd1306_drawstring(tempstr, 0, 90); + + + + HAL_GPIO_WritePin(SSR_PIN, 1); + HAL_GPIO_WritePin(LED_POWER, 1); + } + else + { + HAL_GPIO_WritePin(SSR_PIN, 0); + HAL_GPIO_WritePin(LED_POWER, 0); + } + + last_thermostat = HAL_GetTick(); + } + + // Transmit temperature over USB-CDC on a regular basis if(HAL_GetTick() - last_vcp_tx > VCP_TX_FREQ) {