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

Committer:
sbouber1
Date:
Fri Jun 24 13:51:42 2016 +0000
Revision:
80:38e274c4dafa
Parent:
66:133398875949
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
6366295 0:dab140a197e0 1 #include "TemperatureController.h"
6366295 0:dab140a197e0 2
sbouber1 58:b5f0c0f305ff 3 static AnalogIn temperature_sensor(p20);
joran 66:133398875949 4 static DigitalOut alarmled(LED1);
6366295 0:dab140a197e0 5
sbouber1 10:fd4670ec0806 6 float TemperatureController::getValue() {
sbouber1 10:fd4670ec0806 7 return this->temperature;
6366295 0:dab140a197e0 8 }
6366295 0:dab140a197e0 9
sbouber1 58:b5f0c0f305ff 10 std::string TemperatureController::getName() {
sbouber1 10:fd4670ec0806 11 return "TemperatureController";
sbouber1 9:b3674516729d 12 }
sbouber1 9:b3674516729d 13
sbouber1 9:b3674516729d 14 void TemperatureController::update() {
sbouber1 9:b3674516729d 15 this->temperature = readSensor();
sbouber1 9:b3674516729d 16 }
sbouber1 9:b3674516729d 17
sbouber1 58:b5f0c0f305ff 18 // Function reads sensor values and averages NUM_MEASUREMENTS sensor values, as defined in settings.h
sbouber1 58:b5f0c0f305ff 19 float TemperatureController::readSensor() {
6366295 1:eb527bc93b62 20 float analogin_value = 0;
6366295 1:eb527bc93b62 21 float temperature = 0;
6366295 0:dab140a197e0 22
6366295 0:dab140a197e0 23 // Read 0-1.0 value
sbouber1 58:b5f0c0f305ff 24 for(int i = 0; i < NUM_MEASUREMENTS; i++) {
6366295 0:dab140a197e0 25 analogin_value += temperature_sensor.read();
sbouber1 58:b5f0c0f305ff 26 Thread::wait(MEASUREMENT_DELAY);
6366295 0:dab140a197e0 27 }
sbouber1 9:b3674516729d 28
sbouber1 9:b3674516729d 29 // Average N sensor values
sbouber1 58:b5f0c0f305ff 30 analogin_value /= (float) NUM_MEASUREMENTS;
6366295 0:dab140a197e0 31
6366295 0:dab140a197e0 32 temperature = analoginToCelsius(analogin_value);
6366295 0:dab140a197e0 33
6366295 0:dab140a197e0 34 return temperature;
6366295 0:dab140a197e0 35 }
6366295 0:dab140a197e0 36
6366295 0:dab140a197e0 37 // Function converts average sensor value to ppt
sbouber1 58:b5f0c0f305ff 38 float TemperatureController::analoginToCelsius(float analogin_value) {
6366295 1:eb527bc93b62 39 float voltage = 0;
6366295 1:eb527bc93b62 40 float offset = 0;
6366295 1:eb527bc93b62 41 float rt = 0;
6366295 1:eb527bc93b62 42 float logrt = 0;
6366295 1:eb527bc93b62 43 float temperature = 0;
6366295 0:dab140a197e0 44
6366295 0:dab140a197e0 45 // Convert average sensor value to value with range 0-5.0v
6366295 1:eb527bc93b62 46 voltage = analogin_value * 3.3f * (5.0f/3.0f);
joran 43:0abb54448b75 47
6366295 1:eb527bc93b62 48
6366295 1:eb527bc93b62 49 offset = getOffset(voltage);
6366295 1:eb527bc93b62 50 voltage += offset;
6366295 0:dab140a197e0 51
6366295 0:dab140a197e0 52 // Calcuate R_T
6366295 0:dab140a197e0 53 rt = (15000.0f * voltage) / (4.8f - voltage);
6366295 0:dab140a197e0 54
6366295 0:dab140a197e0 55 logrt = log(rt);
6366295 0:dab140a197e0 56 temperature = 1.0 / (0.00102119 + (0.000222468 * logrt) + (0.000000133342 * logrt*logrt*logrt));
6366295 0:dab140a197e0 57
6366295 0:dab140a197e0 58 temperature = temperature - 273.15;
6366295 0:dab140a197e0 59
6366295 0:dab140a197e0 60 return temperature;
6366295 0:dab140a197e0 61 }
6366295 0:dab140a197e0 62
sbouber1 58:b5f0c0f305ff 63 float TemperatureController::getOffset(float voltage) {
6366295 1:eb527bc93b62 64 float denominator_voltage, numerator_voltage, ratio, interpolation;
6366295 1:eb527bc93b62 65
6366295 1:eb527bc93b62 66 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};
6366295 1:eb527bc93b62 67 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};
6366295 1:eb527bc93b62 68
sbouber1 58:b5f0c0f305ff 69 for(int i = 0; i < 14; i++) {
sbouber1 58:b5f0c0f305ff 70 if(voltage_table[i] <= voltage && voltage_table[i+1] >= voltage) {
6366295 1:eb527bc93b62 71 denominator_voltage = voltage_table[i+1] - voltage_table[i];
6366295 1:eb527bc93b62 72 numerator_voltage = voltage - voltage_table[i];
6366295 1:eb527bc93b62 73
sbouber1 58:b5f0c0f305ff 74 if(denominator_voltage != 0) {
6366295 1:eb527bc93b62 75 ratio = numerator_voltage / denominator_voltage;
6366295 1:eb527bc93b62 76
6366295 1:eb527bc93b62 77 interpolation = ((offset_table[i+1] - offset_table[i]) * ratio) + offset_table[i];
6366295 1:eb527bc93b62 78
6366295 1:eb527bc93b62 79 return interpolation;
6366295 1:eb527bc93b62 80 } else {
6366295 1:eb527bc93b62 81 return offset_table[i];
6366295 1:eb527bc93b62 82 }
6366295 1:eb527bc93b62 83 }
6366295 1:eb527bc93b62 84 }
6366295 1:eb527bc93b62 85
sbouber1 58:b5f0c0f305ff 86 if(voltage_table[14] < voltage) {
6366295 1:eb527bc93b62 87 return offset_table[14];
6366295 1:eb527bc93b62 88 } else {
6366295 1:eb527bc93b62 89 return offset_table[0];
6366295 1:eb527bc93b62 90 }
joran 66:133398875949 91 }
joran 66:133398875949 92
joran 66:133398875949 93 void TemperatureController::setLed(bool value){
joran 66:133398875949 94 if (value) alarmled = 1;
joran 66:133398875949 95 if (!value) alarmled = 0;
joran 66:133398875949 96 }
joran 66:133398875949 97