STM32F103C8T6_WIFI_Heating_system

Dependencies:   mbed mbed-STM32F103C8T6 eeprom_flash Watchdog PinDetect DS1820

  1. Bluepill STM32F103C8T6 Heating system
    1. _This project is core part of bigger heating system project!_

Features - Reading temperature from four DS18B20 sensors - Making a decision about switching on/off heater and pomp - Executing simple user commands from UART - Storing state parameters to program memory (EEPROM emulation)

Committer:
andrewklmn
Date:
Sun Sep 23 15:04:46 2018 +0000
Revision:
45:abc682827659
Parent:
42:03cbc2a6f63b
Child:
46:0d60fbcfb245
standart heating algorithm added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewklmn 38:a0753c2a4497 1 #include "temp_controller.h"
andrewklmn 38:a0753c2a4497 2
andrewklmn 38:a0753c2a4497 3 extern Serial pc;
andrewklmn 38:a0753c2a4497 4 extern Watchdog wd;
andrewklmn 38:a0753c2a4497 5 extern DigitalOut myled;
andrewklmn 39:aa5f95061409 6 extern DigitalOut pomp_OFF;
andrewklmn 39:aa5f95061409 7 extern DigitalOut heater_OFF;
andrewklmn 39:aa5f95061409 8
andrewklmn 38:a0753c2a4497 9 extern unsigned int eeprom_config_value;
andrewklmn 38:a0753c2a4497 10
andrewklmn 38:a0753c2a4497 11 #define MIN_MEBEL_TEMP 15
andrewklmn 38:a0753c2a4497 12 #define MIN_LITOS_TEMP 10
andrewklmn 38:a0753c2a4497 13 #define MIN_BACK_WATER_TEMP 10
andrewklmn 38:a0753c2a4497 14 #define MAX_HOT_WATER_TEMP 35
andrewklmn 38:a0753c2a4497 15
andrewklmn 38:a0753c2a4497 16 //unsigned int epprom_config_value = 0x0F0A0A23;
andrewklmn 38:a0753c2a4497 17 /*
andrewklmn 38:a0753c2a4497 18 epprom_config_value:
andrewklmn 38:a0753c2a4497 19 1 unsigned char - Min mebel temp (default +15)
andrewklmn 38:a0753c2a4497 20 2 unsigned char Min litos temp (default +10)
andrewklmn 38:a0753c2a4497 21 3 unsigned char Min back water temp (default +10)
andrewklmn 38:a0753c2a4497 22 4 unsigned char Max hot water temp (default +35)
andrewklmn 38:a0753c2a4497 23 */
andrewklmn 38:a0753c2a4497 24
andrewklmn 38:a0753c2a4497 25 float temp[5] = {
andrewklmn 39:aa5f95061409 26 // initial temperature is maximum
andrewklmn 39:aa5f95061409 27 85, // OUTDOOR
andrewklmn 39:aa5f95061409 28 85, // LITOS
andrewklmn 39:aa5f95061409 29 85, // MEBEL
andrewklmn 39:aa5f95061409 30 85, // HOT WATER
andrewklmn 39:aa5f95061409 31 85 // BACK WATER
andrewklmn 39:aa5f95061409 32 };
andrewklmn 39:aa5f95061409 33
andrewklmn 39:aa5f95061409 34 float simulated_temp[5] = {
andrewklmn 39:aa5f95061409 35 // initial temperature for simulator
andrewklmn 39:aa5f95061409 36 7, // OUTDOOR
andrewklmn 39:aa5f95061409 37 10, // LITOS
andrewklmn 39:aa5f95061409 38 14, // MEBEL
andrewklmn 39:aa5f95061409 39 33, // HOT WATER
andrewklmn 39:aa5f95061409 40 18 // BACK WATER
andrewklmn 38:a0753c2a4497 41 };
andrewklmn 38:a0753c2a4497 42
andrewklmn 38:a0753c2a4497 43 int temp_error[5] = {
andrewklmn 39:aa5f95061409 44 1,1,1,1,1 // initial state is no sensors
andrewklmn 39:aa5f95061409 45 // 0 - sensor present
andrewklmn 39:aa5f95061409 46 // 1 - no sensor
andrewklmn 39:aa5f95061409 47 // 2 - sensor CRC error
andrewklmn 39:aa5f95061409 48 };
andrewklmn 38:a0753c2a4497 49
andrewklmn 38:a0753c2a4497 50 string labels[5] = {
andrewklmn 38:a0753c2a4497 51 "OUTDOOR",
andrewklmn 38:a0753c2a4497 52 "LITOS",
andrewklmn 38:a0753c2a4497 53 "MEBEL",
andrewklmn 38:a0753c2a4497 54 "HOT WATER",
andrewklmn 38:a0753c2a4497 55 "BACK WATER"
andrewklmn 38:a0753c2a4497 56 };
andrewklmn 38:a0753c2a4497 57
andrewklmn 38:a0753c2a4497 58 DS1820 ds1820[5] = {
andrewklmn 39:aa5f95061409 59 DS1820(PA_9), // substitute PA_9 with actual mbed pin name connected to the OUTDOOR
andrewklmn 39:aa5f95061409 60 DS1820(PA_8), // substitute PA_8 with actual mbed pin name connected to the INDOOR LITOS
andrewklmn 39:aa5f95061409 61 DS1820(PA_7), // substitute PA_7 with actual mbed pin name connected to the INDOOR MEBEL
andrewklmn 39:aa5f95061409 62 DS1820(PA_6), // substitute PA_6 with actual mbed pin name connected to the HOT WATER
andrewklmn 39:aa5f95061409 63 DS1820(PA_5) // substitute PA_6 with actual mbed pin name connected to the HOT WATER
andrewklmn 39:aa5f95061409 64 };
andrewklmn 38:a0753c2a4497 65
andrewklmn 39:aa5f95061409 66 unsigned char working_mode = 1; // default mode after powerup is ECO
andrewklmn 39:aa5f95061409 67 // 0 - OFF - heating off, pomp and heater are OFF
andrewklmn 39:aa5f95061409 68 // 1 - ECO - eco heating
andrewklmn 39:aa5f95061409 69 // 2 - STANDART - standart heating
andrewklmn 39:aa5f95061409 70 // 3 - SIMULATOR - simulator mode - work on simulated_temp
andrewklmn 39:aa5f95061409 71 // 4 - POMP - pomp is ON, heater is OFF
andrewklmn 39:aa5f95061409 72 // 5 - FULL - pomp and heater are ON
andrewklmn 38:a0753c2a4497 73
andrewklmn 38:a0753c2a4497 74 void start_temp(){
andrewklmn 38:a0753c2a4497 75
andrewklmn 38:a0753c2a4497 76 __disable_irq();
andrewklmn 38:a0753c2a4497 77
andrewklmn 38:a0753c2a4497 78 for ( int j=0; j < 5; j++ ) {
andrewklmn 38:a0753c2a4497 79 if(ds1820[j].begin()) {
andrewklmn 38:a0753c2a4497 80 ds1820[j].startConversion();
andrewklmn 39:aa5f95061409 81 //pc.printf("%s sensor present!\r\n", labels[j].c_str());
andrewklmn 39:aa5f95061409 82 };// else {
andrewklmn 39:aa5f95061409 83 //pc.printf("No %s sensor found!\r\n", labels[j].c_str());
andrewklmn 39:aa5f95061409 84 //};
andrewklmn 38:a0753c2a4497 85 };
andrewklmn 38:a0753c2a4497 86 __enable_irq();
andrewklmn 38:a0753c2a4497 87
andrewklmn 38:a0753c2a4497 88 };
andrewklmn 38:a0753c2a4497 89
andrewklmn 38:a0753c2a4497 90 void check_temp(){
andrewklmn 38:a0753c2a4497 91
andrewklmn 38:a0753c2a4497 92 myled = 0; // turn the LED on
andrewklmn 38:a0753c2a4497 93
andrewklmn 38:a0753c2a4497 94 // kick the watchdog
andrewklmn 38:a0753c2a4497 95 wd.Service();
andrewklmn 38:a0753c2a4497 96
andrewklmn 38:a0753c2a4497 97 __disable_irq();
andrewklmn 38:a0753c2a4497 98
andrewklmn 38:a0753c2a4497 99 for ( int j=0; j < 5; j++ ) {
andrewklmn 38:a0753c2a4497 100
andrewklmn 38:a0753c2a4497 101 temp_error[j] = ds1820[j].read(temp[j]); // read temperature from DS1820 and perform cyclic redundancy check (CRC)
andrewklmn 41:978c2d85a0e7 102 ds1820[j].startConversion(); // start temperature conversion from analog to digital before next reading
andrewklmn 39:aa5f95061409 103 };
andrewklmn 38:a0753c2a4497 104
andrewklmn 38:a0753c2a4497 105
andrewklmn 38:a0753c2a4497 106 // save new config if it was changed
andrewklmn 38:a0753c2a4497 107 if (readEEPROMWord(0)!= eeprom_config_value) {
andrewklmn 39:aa5f95061409 108 save_new_config();
andrewklmn 38:a0753c2a4497 109 };
andrewklmn 38:a0753c2a4497 110
andrewklmn 38:a0753c2a4497 111
andrewklmn 38:a0753c2a4497 112
andrewklmn 38:a0753c2a4497 113 __enable_irq();
andrewklmn 38:a0753c2a4497 114
andrewklmn 38:a0753c2a4497 115 myled = 1; // turn the LED off
andrewklmn 38:a0753c2a4497 116 };
andrewklmn 38:a0753c2a4497 117
andrewklmn 39:aa5f95061409 118
andrewklmn 39:aa5f95061409 119 void process_temp() {
andrewklmn 45:abc682827659 120
andrewklmn 39:aa5f95061409 121 switch(working_mode) {
andrewklmn 39:aa5f95061409 122 case 0:
andrewklmn 39:aa5f95061409 123 // 0 - OFF - heating off, pomp and heater are OFF
andrewklmn 39:aa5f95061409 124 pomp_OFF = 1;
andrewklmn 39:aa5f95061409 125 heater_OFF = 1;
andrewklmn 39:aa5f95061409 126 break;
andrewklmn 39:aa5f95061409 127 case 1:
andrewklmn 39:aa5f95061409 128 // 1 - ECO - eco heating
andrewklmn 45:abc682827659 129
andrewklmn 45:abc682827659 130 set_pomp_and_heater_by(temp);
andrewklmn 45:abc682827659 131
andrewklmn 42:03cbc2a6f63b 132 //pc.printf("State %d|%d|%d|%d|%d\r\n", temp_error[0], temp_error[1], temp_error[2], temp_error[3], temp_error[4] );
andrewklmn 42:03cbc2a6f63b 133 //pc.printf("Temp %3.1f|%3.1f|%3.1f|%3.1f|%3.1f\r\n", temp[0], temp[1], temp[2], temp[3], temp[4] );
andrewklmn 42:03cbc2a6f63b 134 //pc.printf("RAM_config=%X, FLASH_config=%X\r\n", eeprom_config_value ,readEEPROMWord(0));
andrewklmn 42:03cbc2a6f63b 135 //pc.printf("=======================================");
andrewklmn 39:aa5f95061409 136 pomp_OFF = !pomp_OFF;
andrewklmn 39:aa5f95061409 137 heater_OFF = !heater_OFF;
andrewklmn 39:aa5f95061409 138 break;
andrewklmn 39:aa5f95061409 139 case 2:
andrewklmn 45:abc682827659 140
andrewklmn 45:abc682827659 141 set_pomp_and_heater_by(temp);
andrewklmn 39:aa5f95061409 142 // 2 - STANDART - standart heating
andrewklmn 39:aa5f95061409 143 pomp_OFF = 1;
andrewklmn 39:aa5f95061409 144 heater_OFF = 1;
andrewklmn 39:aa5f95061409 145 break;
andrewklmn 39:aa5f95061409 146 case 3:
andrewklmn 39:aa5f95061409 147 // 3 - SIMULATOR - simulator mode - work on simulated_temp
andrewklmn 45:abc682827659 148 set_pomp_and_heater_by(simulated_temp);
andrewklmn 39:aa5f95061409 149 break;
andrewklmn 39:aa5f95061409 150 case 4:
andrewklmn 39:aa5f95061409 151 // 4 - POMP - pomp is ON, heater is OFF
andrewklmn 40:6168609574d0 152 pomp_OFF = 0;
andrewklmn 39:aa5f95061409 153 heater_OFF = 1;
andrewklmn 39:aa5f95061409 154 break;
andrewklmn 39:aa5f95061409 155 case 5:
andrewklmn 39:aa5f95061409 156 // 5 - FULL - pomp and heater are ON
andrewklmn 41:978c2d85a0e7 157 pomp_OFF = 0;
andrewklmn 41:978c2d85a0e7 158 heater_OFF = 0;
andrewklmn 39:aa5f95061409 159 break;
andrewklmn 39:aa5f95061409 160 default:
andrewklmn 39:aa5f95061409 161 pomp_OFF = 1;
andrewklmn 39:aa5f95061409 162 heater_OFF = 1;
andrewklmn 39:aa5f95061409 163 };
andrewklmn 39:aa5f95061409 164
andrewklmn 39:aa5f95061409 165 };
andrewklmn 39:aa5f95061409 166
andrewklmn 39:aa5f95061409 167
andrewklmn 39:aa5f95061409 168 void save_new_config() {
andrewklmn 39:aa5f95061409 169
andrewklmn 39:aa5f95061409 170 enableEEPROMWriting();
andrewklmn 39:aa5f95061409 171 writeEEPROMWord(0,eeprom_config_value);
andrewklmn 39:aa5f95061409 172 disableEEPROMWriting();
andrewklmn 39:aa5f95061409 173
andrewklmn 39:aa5f95061409 174 };
andrewklmn 39:aa5f95061409 175
andrewklmn 39:aa5f95061409 176
andrewklmn 38:a0753c2a4497 177 unsigned int get_temp_config_value(){
andrewklmn 38:a0753c2a4497 178
andrewklmn 38:a0753c2a4497 179 unsigned int v = readEEPROMWord(0);
andrewklmn 38:a0753c2a4497 180 if ( v == 0xFFFFFFFF ) {
andrewklmn 38:a0753c2a4497 181 // if eeprom config value is not initialized
andrewklmn 38:a0753c2a4497 182 // set default value 0x0F0A0A23;
andrewklmn 38:a0753c2a4497 183 v = MIN_MEBEL_TEMP;
andrewklmn 38:a0753c2a4497 184 v = ( v << 8 ) | MIN_LITOS_TEMP;
andrewklmn 38:a0753c2a4497 185 v = ( v << 8 ) | MIN_BACK_WATER_TEMP;
andrewklmn 38:a0753c2a4497 186 v = ( v << 8 ) | MAX_HOT_WATER_TEMP;
andrewklmn 38:a0753c2a4497 187 };
andrewklmn 38:a0753c2a4497 188 return v;
andrewklmn 45:abc682827659 189 };
andrewklmn 45:abc682827659 190
andrewklmn 45:abc682827659 191 void set_pomp_and_heater_by(float * work_temp) {
andrewklmn 45:abc682827659 192 // temp config array = outdoor|litos|mebel|hot_water|back_water
andrewklmn 45:abc682827659 193
andrewklmn 45:abc682827659 194 /*
andrewklmn 45:abc682827659 195 eeprom_config_value:
andrewklmn 45:abc682827659 196 1 unsigned char - Min mebel temp (default +15)
andrewklmn 45:abc682827659 197 2 unsigned char Min litos temp (default +10)
andrewklmn 45:abc682827659 198 3 unsigned char Min back water temp (default +10)
andrewklmn 45:abc682827659 199 4 unsigned char Max hot water temp (default +35)
andrewklmn 45:abc682827659 200 */
andrewklmn 45:abc682827659 201 unsigned char min_mebel_temp = eeprom_config_value >> 24;
andrewklmn 45:abc682827659 202 unsigned char min_litos_temp = ( 0x00FF0000 & eeprom_config_value) >> 16;
andrewklmn 45:abc682827659 203 unsigned char min_back_water_temp = ( 0x0000FF00 & eeprom_config_value) >> 8;
andrewklmn 45:abc682827659 204 unsigned char max_hot_water_temp = 0x000000FF & eeprom_config_value;
andrewklmn 45:abc682827659 205
andrewklmn 45:abc682827659 206 //__disable_irq();
andrewklmn 45:abc682827659 207 //pc.printf("Level %d|%d|%d|%d\r\n", min_mebel_temp, min_litos_temp, min_back_water_temp, max_hot_water_temp);
andrewklmn 45:abc682827659 208 //__enable_irq();
andrewklmn 45:abc682827659 209
andrewklmn 45:abc682827659 210 float outdoor = *(work_temp);
andrewklmn 45:abc682827659 211 float litos = *(work_temp + 1);
andrewklmn 45:abc682827659 212 float mebel = *(work_temp + 2);
andrewklmn 45:abc682827659 213 float hot_water = *(work_temp + 3);
andrewklmn 45:abc682827659 214 float back_water = *(work_temp + 4);
andrewklmn 45:abc682827659 215
andrewklmn 45:abc682827659 216 if (outdoor > litos) {
andrewklmn 45:abc682827659 217 // ============================================= SUMMER MODE
andrewklmn 45:abc682827659 218 // system off
andrewklmn 45:abc682827659 219 pomp_OFF = 1;
andrewklmn 45:abc682827659 220 heater_OFF = 1;
andrewklmn 45:abc682827659 221
andrewklmn 45:abc682827659 222 } else if ( outdoor < 3) {
andrewklmn 45:abc682827659 223 // ============================================== WINTER MODE
andrewklmn 45:abc682827659 224 // pomp is always on
andrewklmn 45:abc682827659 225 pomp_OFF = 0;
andrewklmn 45:abc682827659 226
andrewklmn 45:abc682827659 227 if (mebel < min_mebel_temp ||
andrewklmn 45:abc682827659 228 litos < min_litos_temp ||
andrewklmn 45:abc682827659 229 back_water < min_back_water_temp) {
andrewklmn 45:abc682827659 230 // when if somewhere is colder than it must be
andrewklmn 45:abc682827659 231 if (hot_water > max_hot_water_temp) {
andrewklmn 45:abc682827659 232 heater_OFF = 1;
andrewklmn 45:abc682827659 233 } else {
andrewklmn 45:abc682827659 234 if ( heater_OFF == 1 ) {
andrewklmn 45:abc682827659 235 if (hot_water < (max_hot_water_temp - 10)) {
andrewklmn 45:abc682827659 236 heater_OFF = 0;
andrewklmn 45:abc682827659 237 } else {
andrewklmn 45:abc682827659 238 heater_OFF = 1;
andrewklmn 45:abc682827659 239 };
andrewklmn 45:abc682827659 240 } else {
andrewklmn 45:abc682827659 241 heater_OFF = 0;
andrewklmn 45:abc682827659 242 };
andrewklmn 45:abc682827659 243 };
andrewklmn 45:abc682827659 244 } else {
andrewklmn 45:abc682827659 245 heater_OFF = 1;
andrewklmn 45:abc682827659 246 };
andrewklmn 45:abc682827659 247
andrewklmn 45:abc682827659 248 } else {
andrewklmn 45:abc682827659 249 // ======================================== DEMI SEASON MODE
andrewklmn 45:abc682827659 250
andrewklmn 45:abc682827659 251 if (mebel < min_mebel_temp ||
andrewklmn 45:abc682827659 252 litos < min_litos_temp ||
andrewklmn 45:abc682827659 253 back_water < min_back_water_temp) {
andrewklmn 45:abc682827659 254 // when if somewhere is colder than it must be
andrewklmn 45:abc682827659 255 pomp_OFF = 0;
andrewklmn 45:abc682827659 256 if ( hot_water > (max_hot_water_temp-10) ) {
andrewklmn 45:abc682827659 257 heater_OFF = 1;
andrewklmn 45:abc682827659 258 } else {
andrewklmn 45:abc682827659 259 if ( heater_OFF == 1 ) {
andrewklmn 45:abc682827659 260 if ( hot_water < (min_back_water_temp + 2) ) {
andrewklmn 45:abc682827659 261 heater_OFF = 0;
andrewklmn 45:abc682827659 262 } else {
andrewklmn 45:abc682827659 263 heater_OFF = 1;
andrewklmn 45:abc682827659 264 };
andrewklmn 45:abc682827659 265 } else {
andrewklmn 45:abc682827659 266 heater_OFF = 0;
andrewklmn 45:abc682827659 267 };
andrewklmn 45:abc682827659 268 };
andrewklmn 45:abc682827659 269 } else {
andrewklmn 45:abc682827659 270 heater_OFF = 1;
andrewklmn 45:abc682827659 271 if ( hot_water > min_back_water_temp ) {
andrewklmn 45:abc682827659 272 pomp_OFF = 0;
andrewklmn 45:abc682827659 273 } else {
andrewklmn 45:abc682827659 274 pomp_OFF = 1;
andrewklmn 45:abc682827659 275 };
andrewklmn 45:abc682827659 276 };
andrewklmn 45:abc682827659 277 };
andrewklmn 45:abc682827659 278
andrewklmn 45:abc682827659 279 //__disable_irq();
andrewklmn 45:abc682827659 280 //pc.printf("Temp %3.1f|%3.1f|%3.1f|%3.1f|%3.1f\r\n", *(work_temp), *(work_temp + 1), *(work_temp + 2), *(work_temp + 3), *(work_temp + 4) );
andrewklmn 45:abc682827659 281 //__enable_irq();
andrewklmn 45:abc682827659 282 };