Program for the water play project for the course Software Testing Practical 2016 given at the VU University

Dependencies:   mbed DRV88255 TextLCD Ping mbed-rtos

TemperatureController.cpp

Committer:
sbouber1
Date:
2016-06-24
Revision:
80:38e274c4dafa
Parent:
66:133398875949

File content as of revision 80:38e274c4dafa:

#include "TemperatureController.h"

static AnalogIn temperature_sensor(p20);
static DigitalOut alarmled(LED1);

float TemperatureController::getValue() {
    return this->temperature;    
}

std::string TemperatureController::getName() {
    return "TemperatureController";
}

void TemperatureController::update() {
    this->temperature = readSensor();
}

// Function reads sensor values and averages NUM_MEASUREMENTS sensor values, as defined in settings.h
float TemperatureController::readSensor() {
    float analogin_value = 0;
    float temperature = 0;
    
    // Read 0-1.0 value
    for(int i = 0; i < NUM_MEASUREMENTS; i++) {
        analogin_value += temperature_sensor.read();
        Thread::wait(MEASUREMENT_DELAY);
    }
    
    // Average N sensor values
    analogin_value /= (float) NUM_MEASUREMENTS;
    
    temperature = analoginToCelsius(analogin_value);
    
    return temperature;
}

// Function converts average sensor value to ppt
float TemperatureController::analoginToCelsius(float analogin_value) {
    float voltage = 0;
    float offset = 0;
    float rt = 0;
    float logrt = 0;
    float temperature = 0;
    
    // Convert average sensor value to value with range 0-5.0v
    voltage = analogin_value * 3.3f * (5.0f/3.0f);
    
    
    offset = getOffset(voltage);
    voltage += offset;
    
    // Calcuate R_T
    rt = (15000.0f * voltage) / (4.8f - voltage);
    
    logrt = log(rt);
    temperature = 1.0 / (0.00102119 + (0.000222468 * logrt) + (0.000000133342 * logrt*logrt*logrt));
    
    temperature = temperature - 273.15;
    
    return temperature;
}

float TemperatureController::getOffset(float voltage) {
    float denominator_voltage, numerator_voltage, ratio, interpolation;
    
    float voltage_table[15] = {1.43, 1.55, 1.53, 1.56, 1.62, 1.65, 1.67, 1.73, 1.75, 1.80, 1.82, 1.88, 1.93, 1.98, 2.00};
    float offset_table[15] = {0.33, 0.33, 0.40, 0.40, 0.39, 0.42, 0.43, 0.41, 0.45, 0.50, 0.54, 0.53, 0.52, 0.53, 0.56};
    
    for(int i = 0; i < 14; i++) {
        if(voltage_table[i] <= voltage && voltage_table[i+1] >= voltage) {
            denominator_voltage = voltage_table[i+1] - voltage_table[i];
            numerator_voltage = voltage - voltage_table[i];
            
            if(denominator_voltage != 0) {
                ratio = numerator_voltage / denominator_voltage;
                
                interpolation = ((offset_table[i+1] - offset_table[i]) * ratio) + offset_table[i];
                
                return interpolation;
            } else {
                return offset_table[i];
            }
        }
    }
    
    if(voltage_table[14] < voltage) {
        return offset_table[14];
    } else {
        return offset_table[0];
    }
}

void TemperatureController::setLed(bool value){
    if (value) alarmled = 1;
    if (!value) alarmled = 0;
}