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)

main.cpp

Committer:
andrewklmn
Date:
2018-09-18
Revision:
37:c9b96afec535
Parent:
35:74a546766adb
Child:
38:a0753c2a4497

File content as of revision 37:c9b96afec535:

#include "stm32f103c8t6.h"
#include "mbed.h"
#include "mbed_events.h"
#include <stdio.h>
#include "DS1820.h"
#include "PinDetect.h"
#include "Watchdog.h"
#include "eeprom_flash.h"
#include <string> 

// Create a queue that can hold a maximum of 32 events
EventQueue queue(32 * EVENTS_EVENT_SIZE);
// Create a thread that'll run the event queue's dispatch function
//Thread t;

Watchdog wd;

char a[128] = "";       // RX command buffer
char i = 0;             // RX char pointer
static char recieved = 0;

Serial  pc(PA_2, PA_3);
DigitalOut  myled(LED1);

DigitalOut  pomp_OFF(PA_12);          // pomp off
DigitalOut  heater_OFF(PA_15);        // heater off

unsigned int epprom_value = 0;

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
                        };



// This function is called when a character goes into the RX buffer.
void rxCallback() {
    char c;
    c = pc.getc();
    if (recieved == 0){ // skip if command was already received
        if ( c  == 0x0d || c  == 0x0a ) { 
             while ( pc.readable() ) c = pc.getc();
             recieved = 1;
        } else {
            if (i==16){     // max length of command from SERIAL
                a[0] = c;
                a[1] = '\0';
                i = 0;
            } else { 
                a[i] = c;
                i++;
                a[i] = '\0';
            };
       };
    };
};
 
 
void pb_hit_interrupt (void) {
    //writeEEPROMWord(0, 666 );
    epprom_value++;
    pc.printf("Button pressed\r\n"); 
}; 

void pb_out_interrupt (void) {
    pc.printf("Button unpressed\r\n"); 
}; 

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 at_command(){
        if (recieved == 1) {
            
            __disable_irq();
            
            // command was recieved
            
            if (a[0]=='A' && a[1]=='T') {  
                
                if ( a[2]=='\0') {
                    //pc.printf(a);
                    pc.printf("RAM=%u FLASH=%u OK\r\n", epprom_value, readEEPROMWord(0));
                } else {
                    pc.printf("Wrong AT command\r\n");      
                };
                
                //readEEPROMWord(0x01);
            } else {
                    pc.printf("Wrong request\r\n");    
            };
            
            // process_command(a);
            
            __enable_irq(); 

            // ready for new command
            recieved = 0;
            a[0] = '\0';
            i = 0;
        }; 
};


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("=======================================");
        
        if (readEEPROMWord(0)!=epprom_value) {
            enableEEPROMWriting();
            writeEEPROMWord(0,epprom_value);    
            disableEEPROMWriting();
        };
        
        
        __enable_irq(); 
        
        myled = 1;      // turn the LED off
};



  
int main() {
        
    confSysClock();     //Configure system clock (72MHz HSE clock, 48MHz USB clock)
    
    epprom_value = readEEPROMWord(0);    
 
    wd.Configure(10.0);

    PinDetect   pb(PA_11);
    pb.mode(PullUp);
    
    // Delay for initial pullup to take effect
    wait(.005);
    
    pb.attach_deasserted(&pb_hit_interrupt);
    pb.attach_asserted(&pb_out_interrupt);
    //pb.rise(&pb_out_interrupt);
    pb.setSampleFrequency();
    
    pc.attach(&rxCallback, Serial::RxIrq);
    pc.baud(115200);  
    pc.printf("\r\n\r\nWifi Heating system\r\n"); 


    pomp_OFF = 0;
    heater_OFF = 0;
    wait(0.25);
    pomp_OFF = 1;
    heater_OFF = 1;
    wait(0.25);
    pomp_OFF = 0;
    heater_OFF = 0;
    wait(0.25);
    pomp_OFF = 1;
    heater_OFF = 1;
    wait(0.25);

    
    queue.call( start_temp );
    queue.call_every(100, at_command);
    queue.call_every(2000, check_temp);
    
    // Start queue 
    queue.dispatch();
};