Saltware / Mbed 2 deprecated Water Play

Dependencies:   mbed DRV88255 TextLCD Ping mbed-rtos

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers TemperatureController.cpp Source File

TemperatureController.cpp

00001 #include "TemperatureController.h"
00002 
00003 static AnalogIn temperature_sensor(p20);
00004 static DigitalOut alarmled(LED1);
00005 
00006 float TemperatureController::getValue() {
00007     return this->temperature;    
00008 }
00009 
00010 std::string TemperatureController::getName() {
00011     return "TemperatureController";
00012 }
00013 
00014 void TemperatureController::update() {
00015     this->temperature = readSensor();
00016 }
00017 
00018 // Function reads sensor values and averages NUM_MEASUREMENTS sensor values, as defined in settings.h
00019 float TemperatureController::readSensor() {
00020     float analogin_value = 0;
00021     float temperature = 0;
00022     
00023     // Read 0-1.0 value
00024     for(int i = 0; i < NUM_MEASUREMENTS; i++) {
00025         analogin_value += temperature_sensor.read();
00026         Thread::wait(MEASUREMENT_DELAY);
00027     }
00028     
00029     // Average N sensor values
00030     analogin_value /= (float) NUM_MEASUREMENTS;
00031     
00032     temperature = analoginToCelsius(analogin_value);
00033     
00034     return temperature;
00035 }
00036 
00037 // Function converts average sensor value to ppt
00038 float TemperatureController::analoginToCelsius(float analogin_value) {
00039     float voltage = 0;
00040     float offset = 0;
00041     float rt = 0;
00042     float logrt = 0;
00043     float temperature = 0;
00044     
00045     // Convert average sensor value to value with range 0-5.0v
00046     voltage = analogin_value * 3.3f * (5.0f/3.0f);
00047     
00048     
00049     offset = getOffset(voltage);
00050     voltage += offset;
00051     
00052     // Calcuate R_T
00053     rt = (15000.0f * voltage) / (4.8f - voltage);
00054     
00055     logrt = log(rt);
00056     temperature = 1.0 / (0.00102119 + (0.000222468 * logrt) + (0.000000133342 * logrt*logrt*logrt));
00057     
00058     temperature = temperature - 273.15;
00059     
00060     return temperature;
00061 }
00062 
00063 float TemperatureController::getOffset(float voltage) {
00064     float denominator_voltage, numerator_voltage, ratio, interpolation;
00065     
00066     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};
00067     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};
00068     
00069     for(int i = 0; i < 14; i++) {
00070         if(voltage_table[i] <= voltage && voltage_table[i+1] >= voltage) {
00071             denominator_voltage = voltage_table[i+1] - voltage_table[i];
00072             numerator_voltage = voltage - voltage_table[i];
00073             
00074             if(denominator_voltage != 0) {
00075                 ratio = numerator_voltage / denominator_voltage;
00076                 
00077                 interpolation = ((offset_table[i+1] - offset_table[i]) * ratio) + offset_table[i];
00078                 
00079                 return interpolation;
00080             } else {
00081                 return offset_table[i];
00082             }
00083         }
00084     }
00085     
00086     if(voltage_table[14] < voltage) {
00087         return offset_table[14];
00088     } else {
00089         return offset_table[0];
00090     }
00091 }
00092 
00093 void TemperatureController::setLed(bool value){
00094     if (value) alarmled = 1;
00095     if (!value) alarmled = 0;
00096 }
00097