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-12
Revision:
21:819277430a55
Parent:
20:4f3a45fd4bbb
Child:
22:32beca745706

File content as of revision 21:819277430a55:

#include "stm32f103c8t6.h"
#include "mbed.h"
#include "DS1820.h"
#include <string> 

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

Serial  pc(PA_2, PA_3);

// 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 ) { 
             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';
            };
       };
    };
};
 
  
int main() {
        
    confSysClock();     //Configure system clock (72MHz HSE clock, 48MHz USB clock)
    DigitalOut  myled(LED1);
                    
    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
                        };
    
    float   temp = 0;
    int     error = 0; 
    
    pc.attach(&rxCallback, Serial::RxIrq);
    pc.baud(115200);  
    pc.printf("Wifi Heating system\r\n"); 

    for ( int j=0; j < 5; j++ ) {
        if(ds1820[j].begin()) { 
            pc.printf("%s sensor present!\r\n", labels[j].c_str()); 
        } else {
            //pc.printf("No %s sensor found!\r\n", labels[j].c_str());         
        };
    };
    
    while(1) {
        // The on-board LED is connected, via a resistor, to +3.3V (not to GND). 
        // So to turn the LED on or off we have to set it to 0 or 1 respectively
        myled = 0;      // turn the LED on
        wait_ms(50);   // 200 millisecond
        myled = 1;      // turn the LED off
        wait_ms(50);  // 1000 millisecond
        myled = 0;      // turn the LED on
        wait_ms(50);   // 200 millisecond
        myled = 1;      // turn the LED off
        wait_ms(50);  // 1000 millisecond
        myled = 0;      // turn the LED on
        wait_ms(50);   // 200 millisecond
        myled = 1;      // turn the LED off
        
        
        // start temperature conversion from analog to digital
        for ( int j=0; j < 5; j++ ) {
            ds1820[j].startConversion();
        };

        
        wait(1.0);                 // let DS1820 complete the temperature conversion 

        for ( int j=0; j < 5; j++ ) {
            error = ds1820[j].read(temp); // read temperature from DS1820 and perform cyclic redundancy check (CRC)
            switch(error) {
            case 0:    // no errors -> 'temp' contains the value of measured temperature
                pc.printf("%s = %3.1fC \r\n", labels[j].c_str() , temp);
                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() );
            }; 
        };
             
        
        
        
        if (recieved == 1) {
            
            // command was recieved
            pc.printf(a);
            
            // ready for new command
            recieved = 0;
            a[0] = '\0';
            i = 0;
        };  
            
    }
}