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@80:38e274c4dafa, 2016-06-24 (annotated)
- Committer:
- sbouber1
- Date:
- Fri Jun 24 13:51:42 2016 +0000
- Revision:
- 80:38e274c4dafa
- Parent:
- 66:133398875949
final
Who changed what in which revision?
| User | Revision | Line number | New 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 |