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)

temp_controller/temp_controller.cpp

Committer:
andrewklmn
Date:
2018-09-18
Revision:
38:a0753c2a4497
Child:
39:aa5f95061409

File content as of revision 38:a0753c2a4497:

#include "temp_controller.h"

extern Serial pc;
extern Watchdog wd;
extern DigitalOut myled; 
extern unsigned int eeprom_config_value;

#define MIN_MEBEL_TEMP 15 
#define MIN_LITOS_TEMP 10 
#define MIN_BACK_WATER_TEMP 10 
#define MAX_HOT_WATER_TEMP 35 

//unsigned int epprom_config_value = 0x0F0A0A23; 
/*
    epprom_config_value:
        1 unsigned char - Min mebel temp        (default +15)
        2 unsigned char   Min litos temp        (default +10)
        3 unsigned char   Min back water temp   (default +10)
        4 unsigned char   Max hot water temp    (default +35)
*/

float temp[5] = {
                    85,85,85,85,85  // initial temperature
                };
                
int temp_error[5] = {
                    0,0,0,0,0       // initial state
                };
                        
string labels[5] = {
                        "OUTDOOR", 
                        "LITOS", 
                        "MEBEL", 
                        "HOT WATER", 
                        "BACK WATER" 
                    };
    
DS1820  ds1820[5] = { 
                            DS1820(PA_9), // substitute PA_9 with actual mbed pin name connected to the OUTDOOR
                            DS1820(PA_8), // substitute PA_8 with actual mbed pin name connected to the INDOOR LITOS    
                            DS1820(PA_7), // substitute PA_7 with actual mbed pin name connected to the INDOOR MEBEL
                            DS1820(PA_6), // substitute PA_6 with actual mbed pin name connected to the HOT WATER
                            DS1820(PA_5)  // substitute PA_6 with actual mbed pin name connected to the HOT WATER
                        };
                        

void start_temp(){
    
    __disable_irq(); 
    
    for ( int j=0; j < 5; j++ ) {
        if(ds1820[j].begin()) { 
            ds1820[j].startConversion();
            pc.printf("%s sensor present!\r\n", labels[j].c_str()); 
        } else {
            pc.printf("No %s sensor found!\r\n", labels[j].c_str());         
        };
    };
    __enable_irq(); 
        
};

void check_temp(){
  
       myled = 0; // turn the LED on
       
       // kick the watchdog
       wd.Service();
       
       __disable_irq();
       
       for ( int j=0; j < 5; j++ ) {
            
            temp_error[j] = ds1820[j].read(temp[j]); // read temperature from DS1820 and perform cyclic redundancy check (CRC)
            
            switch(temp_error[j]) {
            case 0:    // no errors -> 'temp' contains the value of measured temperature
                pc.printf("%s = %3.1fC \r\n", labels[j].c_str() , temp[j]);
                break;
            case 1:    // no sensor present -> 'temp' is not updated
                pc.printf("no %s sensor present \r\n", labels[j].c_str() );
                break;
            case 2:    // CRC error -> 'temp' is not updated
                pc.printf("%s sensor CRC error \r\n", labels[j].c_str() );
            };
            // start temperature conversion from analog to digital
            ds1820[j].startConversion();             
        };
       
        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] );
        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] );
        pc.printf("RAM_config=%X, FLASH_config=%X\r\n", eeprom_config_value ,readEEPROMWord(0));
        pc.printf("=======================================");
        
        
        // save new config if it was changed
        if (readEEPROMWord(0)!= eeprom_config_value) {
            enableEEPROMWriting();
            writeEEPROMWord(0,eeprom_config_value);    
            disableEEPROMWriting();        
        };
        
        
        
        __enable_irq(); 
        
        myled = 1;      // turn the LED off
};

unsigned int get_temp_config_value(){
    
    unsigned int v = readEEPROMWord(0);
    if ( v == 0xFFFFFFFF ) {
        // if eeprom config value is not initialized
        // set default value 0x0F0A0A23;
        v =  MIN_MEBEL_TEMP;
        v = ( v << 8 ) | MIN_LITOS_TEMP;
        v = ( v << 8 ) | MIN_BACK_WATER_TEMP;
        v = ( v << 8 ) | MAX_HOT_WATER_TEMP;
    };  
    return v;  
};