Nathan Hopkins
/
Thermistor
Interfaced 9 MF51E103F3950 NTC 10k Thermistors to a Nucleo board for a science project.
main.cpp@4:3ed3e2aac291, 2020-10-18 (annotated)
- Committer:
- smartsystemdesign
- Date:
- Sun Oct 18 01:03:26 2020 +0000
- Revision:
- 4:3ed3e2aac291
- Parent:
- 3:cea064439566
Removed unneeded print statements.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
smartsystemdesign | 0:453df8530a88 | 1 | // Using MF51E103F3950 NTC 10k Thermistor, with a B value of 3950 |
smartsystemdesign | 0:453df8530a88 | 2 | #include "mbed.h" |
smartsystemdesign | 0:453df8530a88 | 3 | |
smartsystemdesign | 0:453df8530a88 | 4 | // which analog pin to connect |
smartsystemdesign | 0:453df8530a88 | 5 | #define THERMISTORPIN A0 |
smartsystemdesign | 0:453df8530a88 | 6 | // resistance at 25 degrees C |
smartsystemdesign | 0:453df8530a88 | 7 | #define THERMISTORNOMINAL 10000 |
smartsystemdesign | 0:453df8530a88 | 8 | // temp. for nominal resistance (almost always 25 C) |
smartsystemdesign | 0:453df8530a88 | 9 | #define TEMPERATURENOMINAL 25 |
smartsystemdesign | 0:453df8530a88 | 10 | // how many samples to take and average, more takes longer |
smartsystemdesign | 0:453df8530a88 | 11 | // but is more 'smooth' |
smartsystemdesign | 0:453df8530a88 | 12 | #define NUMSAMPLES 5 |
smartsystemdesign | 0:453df8530a88 | 13 | // The beta coefficient of the thermistor (usually 3000-4000) |
smartsystemdesign | 0:453df8530a88 | 14 | #define BCOEFFICIENT 3950 |
smartsystemdesign | 0:453df8530a88 | 15 | // the value of the 'other' resistor |
smartsystemdesign | 0:453df8530a88 | 16 | #define SERIESRESISTOR 10000.0f |
smartsystemdesign | 0:453df8530a88 | 17 | |
smartsystemdesign | 0:453df8530a88 | 18 | #define OFFSET_NUM_AVERAGES 20 |
smartsystemdesign | 0:453df8530a88 | 19 | |
smartsystemdesign | 0:453df8530a88 | 20 | Serial pc(USBTX, USBRX); // tx, rx |
smartsystemdesign | 0:453df8530a88 | 21 | AnalogIn ain0(A0); |
smartsystemdesign | 0:453df8530a88 | 22 | AnalogIn ain1(A1); |
smartsystemdesign | 0:453df8530a88 | 23 | AnalogIn ain2(A2); |
smartsystemdesign | 0:453df8530a88 | 24 | AnalogIn ain3(A3); |
smartsystemdesign | 0:453df8530a88 | 25 | AnalogIn ain4(A4); |
smartsystemdesign | 0:453df8530a88 | 26 | AnalogIn ain5(A5); |
smartsystemdesign | 2:cda957297041 | 27 | AnalogIn ain6(PA_5); // Note: on the Nucleo F401, this is connected to the LED. |
smartsystemdesign | 2:cda957297041 | 28 | AnalogIn ain7(PA_6); |
smartsystemdesign | 0:453df8530a88 | 29 | AnalogIn ain8(PA_7); |
smartsystemdesign | 0:453df8530a88 | 30 | |
smartsystemdesign | 3:cea064439566 | 31 | Timer timer; |
smartsystemdesign | 3:cea064439566 | 32 | |
smartsystemdesign | 0:453df8530a88 | 33 | float offsets[9] = {0}; |
smartsystemdesign | 2:cda957297041 | 34 | float resistors[9] = {9984.270169f, 9999.947582f, 9999.962164f, 9999.960999f, 9999.958757f, 9999.918074f, 9999.969933f, 9999.966487f, 9999.977766f}; |
smartsystemdesign | 0:453df8530a88 | 35 | |
smartsystemdesign | 0:453df8530a88 | 36 | int main() |
smartsystemdesign | 0:453df8530a88 | 37 | { |
smartsystemdesign | 0:453df8530a88 | 38 | pc.baud(115200); |
smartsystemdesign | 0:453df8530a88 | 39 | |
smartsystemdesign | 0:453df8530a88 | 40 | pc.printf("\nThermistor test\n"); |
smartsystemdesign | 0:453df8530a88 | 41 | float rawReading[9] = {0}; |
smartsystemdesign | 0:453df8530a88 | 42 | float reading[9] = {0}; |
smartsystemdesign | 0:453df8530a88 | 43 | |
smartsystemdesign | 0:453df8530a88 | 44 | // Find offset values (take average 20 readings for offset): |
smartsystemdesign | 0:453df8530a88 | 45 | float sum = 0; |
smartsystemdesign | 0:453df8530a88 | 46 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 47 | // sum += ain0.read(); |
smartsystemdesign | 0:453df8530a88 | 48 | // } |
smartsystemdesign | 0:453df8530a88 | 49 | // offsets[0] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 50 | // |
smartsystemdesign | 0:453df8530a88 | 51 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 52 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 53 | // sum += ain1.read(); |
smartsystemdesign | 0:453df8530a88 | 54 | // } |
smartsystemdesign | 0:453df8530a88 | 55 | // offsets[1] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 56 | // |
smartsystemdesign | 0:453df8530a88 | 57 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 58 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 59 | // sum += ain2.read(); |
smartsystemdesign | 0:453df8530a88 | 60 | // } |
smartsystemdesign | 0:453df8530a88 | 61 | // offsets[2] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 62 | // |
smartsystemdesign | 0:453df8530a88 | 63 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 64 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 65 | // sum += ain3.read(); |
smartsystemdesign | 0:453df8530a88 | 66 | // } |
smartsystemdesign | 0:453df8530a88 | 67 | // offsets[3] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 68 | // |
smartsystemdesign | 0:453df8530a88 | 69 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 70 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 71 | // sum += ain4.read(); |
smartsystemdesign | 0:453df8530a88 | 72 | // } |
smartsystemdesign | 0:453df8530a88 | 73 | // offsets[4] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 74 | // |
smartsystemdesign | 0:453df8530a88 | 75 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 76 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 77 | // sum += ain5.read(); |
smartsystemdesign | 0:453df8530a88 | 78 | // } |
smartsystemdesign | 0:453df8530a88 | 79 | // offsets[5] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 80 | // |
smartsystemdesign | 0:453df8530a88 | 81 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 82 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 83 | // sum += ain5.read(); |
smartsystemdesign | 0:453df8530a88 | 84 | // } |
smartsystemdesign | 0:453df8530a88 | 85 | // offsets[5] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 86 | // |
smartsystemdesign | 0:453df8530a88 | 87 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 88 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 89 | // sum += ain6.read(); |
smartsystemdesign | 0:453df8530a88 | 90 | // } |
smartsystemdesign | 0:453df8530a88 | 91 | // offsets[6] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 92 | // |
smartsystemdesign | 0:453df8530a88 | 93 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 94 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 95 | // sum += ain7.read(); |
smartsystemdesign | 0:453df8530a88 | 96 | // } |
smartsystemdesign | 0:453df8530a88 | 97 | // offsets[7] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 98 | // |
smartsystemdesign | 0:453df8530a88 | 99 | // sum = 0; |
smartsystemdesign | 0:453df8530a88 | 100 | // for(uint8_t i = 0; i < OFFSET_NUM_AVERAGES; i++) { |
smartsystemdesign | 0:453df8530a88 | 101 | // sum += ain8.read(); |
smartsystemdesign | 0:453df8530a88 | 102 | // } |
smartsystemdesign | 0:453df8530a88 | 103 | // offsets[8] = (sum / OFFSET_NUM_AVERAGES); |
smartsystemdesign | 0:453df8530a88 | 104 | |
smartsystemdesign | 0:453df8530a88 | 105 | // Single reading for offset: |
smartsystemdesign | 0:453df8530a88 | 106 | // offsets[0] = ain0.read(); |
smartsystemdesign | 0:453df8530a88 | 107 | // offsets[1] = ain1.read(); |
smartsystemdesign | 0:453df8530a88 | 108 | // offsets[2] = ain2.read(); |
smartsystemdesign | 0:453df8530a88 | 109 | // offsets[3] = ain3.read(); |
smartsystemdesign | 0:453df8530a88 | 110 | // offsets[4] = ain4.read(); |
smartsystemdesign | 0:453df8530a88 | 111 | // offsets[5] = ain5.read(); |
smartsystemdesign | 0:453df8530a88 | 112 | // offsets[6] = ain6.read(); |
smartsystemdesign | 0:453df8530a88 | 113 | // offsets[7] = ain7.read(); |
smartsystemdesign | 0:453df8530a88 | 114 | // offsets[8] = ain8.read(); |
smartsystemdesign | 0:453df8530a88 | 115 | |
smartsystemdesign | 0:453df8530a88 | 116 | // Find average of offsets and store in offsets array: |
smartsystemdesign | 0:453df8530a88 | 117 | sum = 0; |
smartsystemdesign | 0:453df8530a88 | 118 | float average = 0; |
smartsystemdesign | 0:453df8530a88 | 119 | |
smartsystemdesign | 0:453df8530a88 | 120 | for(uint8_t i = 0; i < 9; i++) { |
smartsystemdesign | 0:453df8530a88 | 121 | sum += offsets[i]; |
smartsystemdesign | 0:453df8530a88 | 122 | } |
smartsystemdesign | 0:453df8530a88 | 123 | |
smartsystemdesign | 0:453df8530a88 | 124 | average = sum / 9; |
smartsystemdesign | 0:453df8530a88 | 125 | |
smartsystemdesign | 0:453df8530a88 | 126 | for(uint8_t i = 0; i < 9; i++) { |
smartsystemdesign | 0:453df8530a88 | 127 | offsets[i] = offsets[i] - average; |
smartsystemdesign | 0:453df8530a88 | 128 | } |
smartsystemdesign | 0:453df8530a88 | 129 | |
smartsystemdesign | 3:cea064439566 | 130 | timer.start(); |
smartsystemdesign | 3:cea064439566 | 131 | |
smartsystemdesign | 0:453df8530a88 | 132 | while(1) { |
smartsystemdesign | 0:453df8530a88 | 133 | // Take reading and apply offset, then use voltage divider equation: |
smartsystemdesign | 0:453df8530a88 | 134 | // rawReading[0] = 1 / (ain0.read() - offsets[0]) - 1; |
smartsystemdesign | 0:453df8530a88 | 135 | // rawReading[1] = 1 / (ain1.read() - offsets[1]) - 1; |
smartsystemdesign | 0:453df8530a88 | 136 | // rawReading[2] = 1 / (ain2.read() - offsets[2]) - 1; |
smartsystemdesign | 0:453df8530a88 | 137 | // rawReading[3] = 1 / (ain3.read() - offsets[3]) - 1; |
smartsystemdesign | 0:453df8530a88 | 138 | // rawReading[4] = 1 / (ain4.read() - offsets[4]) - 1; |
smartsystemdesign | 0:453df8530a88 | 139 | // rawReading[5] = 1 / (ain5.read() - offsets[5]) - 1; |
smartsystemdesign | 0:453df8530a88 | 140 | // rawReading[6] = 1 / (ain6.read() - offsets[6]) - 1; |
smartsystemdesign | 0:453df8530a88 | 141 | // rawReading[7] = 1 / (ain7.read() - offsets[7]) - 1; |
smartsystemdesign | 0:453df8530a88 | 142 | // rawReading[8] = 1 / (ain8.read() - offsets[8]) - 1; |
smartsystemdesign | 0:453df8530a88 | 143 | |
smartsystemdesign | 0:453df8530a88 | 144 | rawReading[0] = 1 / ain0.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 145 | rawReading[1] = 1 / ain1.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 146 | rawReading[2] = 1 / ain2.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 147 | rawReading[3] = 1 / ain3.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 148 | rawReading[4] = 1 / ain4.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 149 | rawReading[5] = 1 / ain5.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 150 | rawReading[6] = 1 / ain6.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 151 | rawReading[7] = 1 / ain7.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 152 | rawReading[8] = 1 / ain8.read() - 1; |
smartsystemdesign | 0:453df8530a88 | 153 | |
smartsystemdesign | 0:453df8530a88 | 154 | for(uint8_t i = 0; i < 9; i++) { |
smartsystemdesign | 0:453df8530a88 | 155 | reading[i] = resistors[i] / rawReading[i]; |
smartsystemdesign | 0:453df8530a88 | 156 | } |
smartsystemdesign | 0:453df8530a88 | 157 | |
smartsystemdesign | 0:453df8530a88 | 158 | // pc.printf("Thermistor resistance "); |
smartsystemdesign | 0:453df8530a88 | 159 | // pc.printf("%f\t", reading0); |
smartsystemdesign | 0:453df8530a88 | 160 | |
smartsystemdesign | 0:453df8530a88 | 161 | // Apply Steinhart equation: |
smartsystemdesign | 3:cea064439566 | 162 | |
smartsystemdesign | 0:453df8530a88 | 163 | for(uint8_t i = 0; i < 9; i++) { |
smartsystemdesign | 0:453df8530a88 | 164 | float steinhart; |
smartsystemdesign | 0:453df8530a88 | 165 | steinhart = reading[i] / THERMISTORNOMINAL; // (R/Ro) |
smartsystemdesign | 0:453df8530a88 | 166 | steinhart = log(steinhart); // ln(R/Ro) |
smartsystemdesign | 0:453df8530a88 | 167 | steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) |
smartsystemdesign | 0:453df8530a88 | 168 | steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) |
smartsystemdesign | 0:453df8530a88 | 169 | steinhart = 1.0f / steinhart; // Invert |
smartsystemdesign | 0:453df8530a88 | 170 | steinhart -= 273.15f; // convert to C |
smartsystemdesign | 0:453df8530a88 | 171 | // pc.printf("Temperature %d: %f *C\t", i, steinhart); |
smartsystemdesign | 0:453df8530a88 | 172 | |
smartsystemdesign | 0:453df8530a88 | 173 | // Print commas for plotting (except at end): |
smartsystemdesign | 4:3ed3e2aac291 | 174 | |
smartsystemdesign | 4:3ed3e2aac291 | 175 | if(i == 6) |
smartsystemdesign | 2:cda957297041 | 176 | continue; // bad analog input (on LED) |
smartsystemdesign | 0:453df8530a88 | 177 | else { |
smartsystemdesign | 0:453df8530a88 | 178 | pc.printf("%.4f,", steinhart); |
smartsystemdesign | 0:453df8530a88 | 179 | } |
smartsystemdesign | 0:453df8530a88 | 180 | } |
smartsystemdesign | 4:3ed3e2aac291 | 181 | pc.printf("%.2f\n", timer.read()/60.0f); // print time from boot in minutes |
smartsystemdesign | 4:3ed3e2aac291 | 182 | |
smartsystemdesign | 1:010d1ef2f3ab | 183 | wait(1); |
smartsystemdesign | 0:453df8530a88 | 184 | } |
smartsystemdesign | 0:453df8530a88 | 185 | } |