TCTF Control Code V1

Dependencies:   MCP23017 MODSERIAL mbed

main.cpp

Committer:
jrodenburg
Date:
2017-09-24
Revision:
0:11aaf2483a3c
Child:
1:b8231536af32

File content as of revision 0:11aaf2483a3c:

// MBED SCRIPT FOR CONTROLLING THE TEMPERATURE CONTROLLED TEST FIXTURE
// AUTHOR: JUSTIN RODENBURG
// DATE: SEPTEMBER 2017

//PLAN TO HAVE 18 CHANNELS PER MBED
//HARDWARE: 
//2 X VALVE DRIVER BOARD
//1 X MBED
//1 X ADC MUX (16 CHN)

//FORMAT FOR CELL DATA: CHANNEL.TEMPERATURE.STATUS.E 2.23.1.E

#include "mbed.h"
#include "MCP23017.h"
#include "MODSERIAL.h"
#include <string>


DigitalOut rLed(LED1);
DigitalOut gLed(LED2);

//DIGITAL CONTROL PINS
DigitalOut valve(PTB8);
DigitalOut heater(PTB9);

//Init. I2C for CE Board
MCP23017 mcp = MCP23017(PTC9, PTC8, 0x40);

//GLOBAL
// pullUp resistance
int rUp = 10000; 
//LUT size 
int sizeLUT = 34;

//LOOK UP TABLE
const struct LUT {
   int adc;
   int temp;
};

LUT thermLUT[] = {
    {62349,-40},
    {61393,-35},
    {60223,-30},
    {58818,-25},
    {57159,-20},
    {55240,-15},
    {53054,-10},
    {50605,-5},
    {47928,0},
    {45069,5},
    {42068,10},
    {38975,15},
    {35856,20},
    {32768,25},
    {29753,30},
    {26867,35},
    {24147,40},
    {21602,45},
    {19257,50},
    {17116,55},
    {15178,60},
    {13465,65},
    {11941,70},
    {10579,75},
    {9374,80},
    {8309,85},
    {7375,90},
    {6548,95},
    {5817,100},
    {5179,105},
    {4618,110},
    {4127,115},
    {3686,120},
    {3304,125}
};

//ANALOG PINS
AnalogIn ain0(A0);
AnalogIn ain1(A1);
AnalogIn ain2(A2);
AnalogIn ain3(A3);
AnalogIn ain4(A4);
AnalogIn ain5(A5);

MODSERIAL pc(USBTX, USBRX);

volatile int bufA_index;
const int numChnls = 15;
float chTemps[numChnls];
float chGoalTemps[numChnls];  
float chStatus[numChnls];
int numSamples = 5;
volatile bool dataRecieved = false;
char rxBuf[50];

void rxInterrupt(MODSERIAL_IRQ_INFO *info){
    gLed = 0;
    wait(2);
    gLed = 1;
    dataRecieved = true;
}

void parseRXData(){
    int pCount = 0; //count data collected
    int i = 0;
    int chnl = 0;
    
    string data = "";
    
    while(pCount < 3){
        if(rxBuf[i] != '.'){
            data += rxBuf[i];
        }
        else{
            data = "";
            pCount++; 
            if(pCount == 1){ //get channel
                if((pCount < 0) || (pCount > 15)){
                    //check if channel is out of array index
                    rLed = 0; 
                }
                else{
                    chnl = atoi(data.c_str());
                    pc.printf("CHANNEL: %i \r\n", chnl);
                }
            }
            else if(pCount == 2){ //get channel temperature
                chGoalTemps[chnl] = atoi(data.c_str());
                pc.printf("TEMPERATURE: %i \r\n", chTemps[chnl]);
            }
            else if(pCount == 3){ //get channel status
                chGoalTemps[chnl] = atoi(data.c_str());
                pc.printf("STATUS: %i \r\n", chTemps[chnl]); 
            }   
        }
        i++;
    }
}

float getTemp(float ADC_val){ 
    int i = 0;  
    while((i < sizeLUT) && (thermLUT[i].adc > ADC_val)){
        i++;    
    }  
    
    float a = float(thermLUT[i-1].temp - thermLUT[i].temp);
    float b = float(thermLUT[i-1].adc - thermLUT[i].adc);
    
    float m = a/b;
    float y = (m*(ADC_val - thermLUT[i-1].adc))+thermLUT[i-1].temp;
    
    return y;
}

//16-bit ADC --> 2^16 = 65536
void readTemps(){
    float a_0 = 0.0;
    
    for(int i=0; i<numSamples; i++){
        a_0 += ain0.read_u16();
    }
    
    a_0 = a_0/numSamples;
    
    printf("ADC VAL: %f \r\n", a_0);

    chTemps[0] = getTemp(a_0); 
    
    printf("TEMPERATURE (C): %f \r\n", chTemps[0]);
    
    printf("TEMPERATURE (C): 15 \r\n");
}


    

int main() {
    printf("Main Entered.\n");
    //turn off LEDs
    rLed = 1;
    gLed = 1;
    
    //configure MCP23017
    mcp.config(0,0,0);
    
    //
    pc.baud(9600);
    pc.autoDetectChar('E');
    pc.attach(&rxInterrupt, MODSERIAL::RxAutoDetect);
        
    while(1) {
        //read temperatures
        readTemps();
        
        //buffer for noise
        double hyst = 0.5;
        
        //check if we recieved data/need to update TCTF data
        if(dataRecieved){
            dataRecieved = false;
            pc.move(rxBuf, 100);
            pc.rxBufferFlush();
            parseRXData();
        }
                
        //Control loop:
        //Loop through all channels and control
        //chiller = 18C
        for(int i=0; i<=numChnls; i++){
            //control chiller
            if(chTemps[i] > ((chGoalTemps[i])+hyst)){
                //Turn on chiller
                printf("CHILLER ON \r\n");
                mcp.config(0,0,0);
                mcp.write_bit(1, 8); 
                printf("HEATER OFF \r\n");
                mcp.write_bit(0, 9);
            }
            else if (chTemps[i] < ((chGoalTemps[i])-hyst)){
                //turn off chiller
                printf("CHILLER OFF \r\n");
                mcp.config(0,0,0);
                mcp.write_bit(0, 8); 
                printf("HEATER ON \r\n");
                mcp.write_bit(1, 9);
            }
            else{
                //turn off chiller
                printf("CHILLER OFF \r\n");
                mcp.config(0,0,0);
                mcp.write_bit(0, 8); 
                printf("HEATER OFF \r\n");
                mcp.write_bit(0, 9);
            }
            printf("\r\n");
            wait(5);
        }
    }
}