Brian Pearson
/
LPC1768OpacityMeter
Opacity meter
main.cpp@0:0d9dd22ca491, 2016-01-05 (annotated)
- Committer:
- BPPearson
- Date:
- Tue Jan 05 16:44:13 2016 +0000
- Revision:
- 0:0d9dd22ca491
Opacity meter
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
BPPearson | 0:0d9dd22ca491 | 1 | #include "mbed.h" |
BPPearson | 0:0d9dd22ca491 | 2 | #include "PinDetect.h" |
BPPearson | 0:0d9dd22ca491 | 3 | |
BPPearson | 0:0d9dd22ca491 | 4 | #define COMMAND 0 |
BPPearson | 0:0d9dd22ca491 | 5 | #define DATA 1 |
BPPearson | 0:0d9dd22ca491 | 6 | |
BPPearson | 0:0d9dd22ca491 | 7 | #define AVERAGE 0 |
BPPearson | 0:0d9dd22ca491 | 8 | #define MEDIAN 1 |
BPPearson | 0:0d9dd22ca491 | 9 | #define RATEOFCHANGE 2 |
BPPearson | 0:0d9dd22ca491 | 10 | #define BINAVERAGE 3 |
BPPearson | 0:0d9dd22ca491 | 11 | |
BPPearson | 0:0d9dd22ca491 | 12 | Serial pc(USBTX, USBRX); |
BPPearson | 0:0d9dd22ca491 | 13 | DigitalOut led1(LED1); |
BPPearson | 0:0d9dd22ca491 | 14 | DigitalOut led2(LED2); |
BPPearson | 0:0d9dd22ca491 | 15 | DigitalOut led3(LED3); |
BPPearson | 0:0d9dd22ca491 | 16 | DigitalOut led4(LED4); |
BPPearson | 0:0d9dd22ca491 | 17 | AnalogIn opacity(p15); |
BPPearson | 0:0d9dd22ca491 | 18 | AnalogOut fOpacity(p18); |
BPPearson | 0:0d9dd22ca491 | 19 | BusInOut databus(p21, p22, p23, p24, p25, p26, p27, p28); |
BPPearson | 0:0d9dd22ca491 | 20 | DigitalOut registerSelect(p5); |
BPPearson | 0:0d9dd22ca491 | 21 | DigitalOut readWriteClock(p6); |
BPPearson | 0:0d9dd22ca491 | 22 | DigitalOut readWrite(p7); |
BPPearson | 0:0d9dd22ca491 | 23 | DigitalIn unlocked(p8); |
BPPearson | 0:0d9dd22ca491 | 24 | PinDetect calibUp(p10); |
BPPearson | 0:0d9dd22ca491 | 25 | PinDetect calibDown(p9); |
BPPearson | 0:0d9dd22ca491 | 26 | Ticker updateLCD; |
BPPearson | 0:0d9dd22ca491 | 27 | LocalFileSystem local("local"); |
BPPearson | 0:0d9dd22ca491 | 28 | |
BPPearson | 0:0d9dd22ca491 | 29 | float instantOpacity; |
BPPearson | 0:0d9dd22ca491 | 30 | float filteredOpacity = 0.0; |
BPPearson | 0:0d9dd22ca491 | 31 | char *helloStr = "Hello"; |
BPPearson | 0:0d9dd22ca491 | 32 | int filterAlgorithm = AVERAGE; |
BPPearson | 0:0d9dd22ca491 | 33 | float anIn1Sum; |
BPPearson | 0:0d9dd22ca491 | 34 | float anIn1SumSqr; |
BPPearson | 0:0d9dd22ca491 | 35 | float stdDevCount; |
BPPearson | 0:0d9dd22ca491 | 36 | float standardDeviation; |
BPPearson | 0:0d9dd22ca491 | 37 | float calibFactor = 1.0; |
BPPearson | 0:0d9dd22ca491 | 38 | int showCalibFactor = 0; |
BPPearson | 0:0d9dd22ca491 | 39 | float anInVals[100]; |
BPPearson | 0:0d9dd22ca491 | 40 | int anInIdx = 0; |
BPPearson | 0:0d9dd22ca491 | 41 | |
BPPearson | 0:0d9dd22ca491 | 42 | |
BPPearson | 0:0d9dd22ca491 | 43 | void readConfigFile() |
BPPearson | 0:0d9dd22ca491 | 44 | { |
BPPearson | 0:0d9dd22ca491 | 45 | |
BPPearson | 0:0d9dd22ca491 | 46 | FILE *fp = fopen("/local/config.dat", "r"); |
BPPearson | 0:0d9dd22ca491 | 47 | |
BPPearson | 0:0d9dd22ca491 | 48 | if (fp != NULL) |
BPPearson | 0:0d9dd22ca491 | 49 | { |
BPPearson | 0:0d9dd22ca491 | 50 | fscanf(fp, "%f", &calibFactor); |
BPPearson | 0:0d9dd22ca491 | 51 | fclose(fp); |
BPPearson | 0:0d9dd22ca491 | 52 | } |
BPPearson | 0:0d9dd22ca491 | 53 | } |
BPPearson | 0:0d9dd22ca491 | 54 | |
BPPearson | 0:0d9dd22ca491 | 55 | |
BPPearson | 0:0d9dd22ca491 | 56 | |
BPPearson | 0:0d9dd22ca491 | 57 | void writeConfigFile() |
BPPearson | 0:0d9dd22ca491 | 58 | { |
BPPearson | 0:0d9dd22ca491 | 59 | FILE *fp = fopen("/local/config.dat", "w"); |
BPPearson | 0:0d9dd22ca491 | 60 | |
BPPearson | 0:0d9dd22ca491 | 61 | if (fp != NULL) |
BPPearson | 0:0d9dd22ca491 | 62 | { |
BPPearson | 0:0d9dd22ca491 | 63 | fprintf(fp, "%5.3f\n", calibFactor); |
BPPearson | 0:0d9dd22ca491 | 64 | fclose(fp); |
BPPearson | 0:0d9dd22ca491 | 65 | } |
BPPearson | 0:0d9dd22ca491 | 66 | } |
BPPearson | 0:0d9dd22ca491 | 67 | |
BPPearson | 0:0d9dd22ca491 | 68 | |
BPPearson | 0:0d9dd22ca491 | 69 | |
BPPearson | 0:0d9dd22ca491 | 70 | |
BPPearson | 0:0d9dd22ca491 | 71 | void incCalibFactor(){ |
BPPearson | 0:0d9dd22ca491 | 72 | |
BPPearson | 0:0d9dd22ca491 | 73 | //pc.printf("%d\n", unlocked.read()); |
BPPearson | 0:0d9dd22ca491 | 74 | if (unlocked == false){ |
BPPearson | 0:0d9dd22ca491 | 75 | calibFactor += 0.01; |
BPPearson | 0:0d9dd22ca491 | 76 | //pc.printf("Inc\n"); |
BPPearson | 0:0d9dd22ca491 | 77 | showCalibFactor = 5; |
BPPearson | 0:0d9dd22ca491 | 78 | |
BPPearson | 0:0d9dd22ca491 | 79 | writeConfigFile(); |
BPPearson | 0:0d9dd22ca491 | 80 | } |
BPPearson | 0:0d9dd22ca491 | 81 | } |
BPPearson | 0:0d9dd22ca491 | 82 | |
BPPearson | 0:0d9dd22ca491 | 83 | |
BPPearson | 0:0d9dd22ca491 | 84 | void decCalibFactor(){ |
BPPearson | 0:0d9dd22ca491 | 85 | |
BPPearson | 0:0d9dd22ca491 | 86 | if (unlocked == false){ |
BPPearson | 0:0d9dd22ca491 | 87 | calibFactor -= 0.01; |
BPPearson | 0:0d9dd22ca491 | 88 | //pc.printf("Dec\n"); |
BPPearson | 0:0d9dd22ca491 | 89 | showCalibFactor = 5; |
BPPearson | 0:0d9dd22ca491 | 90 | |
BPPearson | 0:0d9dd22ca491 | 91 | writeConfigFile(); |
BPPearson | 0:0d9dd22ca491 | 92 | } |
BPPearson | 0:0d9dd22ca491 | 93 | } |
BPPearson | 0:0d9dd22ca491 | 94 | |
BPPearson | 0:0d9dd22ca491 | 95 | |
BPPearson | 0:0d9dd22ca491 | 96 | void writeToLCD(bool rs, char data){ |
BPPearson | 0:0d9dd22ca491 | 97 | |
BPPearson | 0:0d9dd22ca491 | 98 | // set register select pin |
BPPearson | 0:0d9dd22ca491 | 99 | registerSelect = rs; |
BPPearson | 0:0d9dd22ca491 | 100 | |
BPPearson | 0:0d9dd22ca491 | 101 | // set read/write pin to write |
BPPearson | 0:0d9dd22ca491 | 102 | readWrite = 0; |
BPPearson | 0:0d9dd22ca491 | 103 | |
BPPearson | 0:0d9dd22ca491 | 104 | // set bus as output |
BPPearson | 0:0d9dd22ca491 | 105 | databus.output(); |
BPPearson | 0:0d9dd22ca491 | 106 | |
BPPearson | 0:0d9dd22ca491 | 107 | // put data onto bus |
BPPearson | 0:0d9dd22ca491 | 108 | databus = data; |
BPPearson | 0:0d9dd22ca491 | 109 | |
BPPearson | 0:0d9dd22ca491 | 110 | // pulse read/write clock |
BPPearson | 0:0d9dd22ca491 | 111 | readWriteClock = 1; |
BPPearson | 0:0d9dd22ca491 | 112 | |
BPPearson | 0:0d9dd22ca491 | 113 | wait_us(1); |
BPPearson | 0:0d9dd22ca491 | 114 | |
BPPearson | 0:0d9dd22ca491 | 115 | readWriteClock = 0; |
BPPearson | 0:0d9dd22ca491 | 116 | |
BPPearson | 0:0d9dd22ca491 | 117 | wait_us(1); |
BPPearson | 0:0d9dd22ca491 | 118 | |
BPPearson | 0:0d9dd22ca491 | 119 | // clear data bus |
BPPearson | 0:0d9dd22ca491 | 120 | databus = 0; |
BPPearson | 0:0d9dd22ca491 | 121 | |
BPPearson | 0:0d9dd22ca491 | 122 | //pc.printf("%02x\n", data); |
BPPearson | 0:0d9dd22ca491 | 123 | |
BPPearson | 0:0d9dd22ca491 | 124 | } |
BPPearson | 0:0d9dd22ca491 | 125 | |
BPPearson | 0:0d9dd22ca491 | 126 | |
BPPearson | 0:0d9dd22ca491 | 127 | char readFromLCD(bool rs){ |
BPPearson | 0:0d9dd22ca491 | 128 | |
BPPearson | 0:0d9dd22ca491 | 129 | char data; |
BPPearson | 0:0d9dd22ca491 | 130 | |
BPPearson | 0:0d9dd22ca491 | 131 | // set register select pin |
BPPearson | 0:0d9dd22ca491 | 132 | registerSelect = rs; |
BPPearson | 0:0d9dd22ca491 | 133 | |
BPPearson | 0:0d9dd22ca491 | 134 | // set read/write pin to read |
BPPearson | 0:0d9dd22ca491 | 135 | readWrite = 1; |
BPPearson | 0:0d9dd22ca491 | 136 | |
BPPearson | 0:0d9dd22ca491 | 137 | // set bus as output |
BPPearson | 0:0d9dd22ca491 | 138 | databus.input(); |
BPPearson | 0:0d9dd22ca491 | 139 | |
BPPearson | 0:0d9dd22ca491 | 140 | // put data onto bus |
BPPearson | 0:0d9dd22ca491 | 141 | data = databus; |
BPPearson | 0:0d9dd22ca491 | 142 | |
BPPearson | 0:0d9dd22ca491 | 143 | // pulse read/write clock |
BPPearson | 0:0d9dd22ca491 | 144 | readWriteClock = 1; |
BPPearson | 0:0d9dd22ca491 | 145 | |
BPPearson | 0:0d9dd22ca491 | 146 | wait_us(10); |
BPPearson | 0:0d9dd22ca491 | 147 | |
BPPearson | 0:0d9dd22ca491 | 148 | readWriteClock = 0; |
BPPearson | 0:0d9dd22ca491 | 149 | |
BPPearson | 0:0d9dd22ca491 | 150 | return data; |
BPPearson | 0:0d9dd22ca491 | 151 | } |
BPPearson | 0:0d9dd22ca491 | 152 | |
BPPearson | 0:0d9dd22ca491 | 153 | |
BPPearson | 0:0d9dd22ca491 | 154 | void resetLCD(){ |
BPPearson | 0:0d9dd22ca491 | 155 | } |
BPPearson | 0:0d9dd22ca491 | 156 | |
BPPearson | 0:0d9dd22ca491 | 157 | |
BPPearson | 0:0d9dd22ca491 | 158 | void initLCD(){ |
BPPearson | 0:0d9dd22ca491 | 159 | |
BPPearson | 0:0d9dd22ca491 | 160 | // wait 15 ms to allow LCD to initialise |
BPPearson | 0:0d9dd22ca491 | 161 | wait_ms(15); |
BPPearson | 0:0d9dd22ca491 | 162 | |
BPPearson | 0:0d9dd22ca491 | 163 | // set interface for 8 bit mode |
BPPearson | 0:0d9dd22ca491 | 164 | writeToLCD(COMMAND, 0x30); |
BPPearson | 0:0d9dd22ca491 | 165 | |
BPPearson | 0:0d9dd22ca491 | 166 | // give it time |
BPPearson | 0:0d9dd22ca491 | 167 | wait_ms(5); |
BPPearson | 0:0d9dd22ca491 | 168 | |
BPPearson | 0:0d9dd22ca491 | 169 | // set interface for 8 bit mode again |
BPPearson | 0:0d9dd22ca491 | 170 | writeToLCD(COMMAND, 0x30); |
BPPearson | 0:0d9dd22ca491 | 171 | |
BPPearson | 0:0d9dd22ca491 | 172 | // give it time |
BPPearson | 0:0d9dd22ca491 | 173 | wait_us(100); |
BPPearson | 0:0d9dd22ca491 | 174 | |
BPPearson | 0:0d9dd22ca491 | 175 | // set interface for 8 bit mode again, last one before we can configure the display |
BPPearson | 0:0d9dd22ca491 | 176 | writeToLCD(COMMAND, 0x30); |
BPPearson | 0:0d9dd22ca491 | 177 | |
BPPearson | 0:0d9dd22ca491 | 178 | // give it time |
BPPearson | 0:0d9dd22ca491 | 179 | wait_us(500); |
BPPearson | 0:0d9dd22ca491 | 180 | |
BPPearson | 0:0d9dd22ca491 | 181 | // set interface for 8 bit mode, 2 display lines and 5 x 8 character font |
BPPearson | 0:0d9dd22ca491 | 182 | writeToLCD(COMMAND, 0x38); |
BPPearson | 0:0d9dd22ca491 | 183 | |
BPPearson | 0:0d9dd22ca491 | 184 | // give it time |
BPPearson | 0:0d9dd22ca491 | 185 | wait_us(100); |
BPPearson | 0:0d9dd22ca491 | 186 | |
BPPearson | 0:0d9dd22ca491 | 187 | // display off |
BPPearson | 0:0d9dd22ca491 | 188 | writeToLCD(COMMAND, 0x08); |
BPPearson | 0:0d9dd22ca491 | 189 | |
BPPearson | 0:0d9dd22ca491 | 190 | // give it time |
BPPearson | 0:0d9dd22ca491 | 191 | wait_us(100); |
BPPearson | 0:0d9dd22ca491 | 192 | |
BPPearson | 0:0d9dd22ca491 | 193 | // clear the screen |
BPPearson | 0:0d9dd22ca491 | 194 | writeToLCD(COMMAND, 0x01); |
BPPearson | 0:0d9dd22ca491 | 195 | |
BPPearson | 0:0d9dd22ca491 | 196 | // give it time to finish |
BPPearson | 0:0d9dd22ca491 | 197 | wait_ms(2); |
BPPearson | 0:0d9dd22ca491 | 198 | |
BPPearson | 0:0d9dd22ca491 | 199 | // set entry mode to increment cursor position cursor on write |
BPPearson | 0:0d9dd22ca491 | 200 | writeToLCD(COMMAND, 0x03); |
BPPearson | 0:0d9dd22ca491 | 201 | |
BPPearson | 0:0d9dd22ca491 | 202 | // give it time to finish |
BPPearson | 0:0d9dd22ca491 | 203 | wait_us(100); |
BPPearson | 0:0d9dd22ca491 | 204 | |
BPPearson | 0:0d9dd22ca491 | 205 | // position cursor at home |
BPPearson | 0:0d9dd22ca491 | 206 | writeToLCD(COMMAND, 0x02); |
BPPearson | 0:0d9dd22ca491 | 207 | |
BPPearson | 0:0d9dd22ca491 | 208 | // give it time to finish |
BPPearson | 0:0d9dd22ca491 | 209 | wait_ms(2); |
BPPearson | 0:0d9dd22ca491 | 210 | |
BPPearson | 0:0d9dd22ca491 | 211 | // display on |
BPPearson | 0:0d9dd22ca491 | 212 | writeToLCD(COMMAND, 0x0F); |
BPPearson | 0:0d9dd22ca491 | 213 | } |
BPPearson | 0:0d9dd22ca491 | 214 | |
BPPearson | 0:0d9dd22ca491 | 215 | |
BPPearson | 0:0d9dd22ca491 | 216 | |
BPPearson | 0:0d9dd22ca491 | 217 | |
BPPearson | 0:0d9dd22ca491 | 218 | void positionCursor(uint8_t x, uint8_t y){ |
BPPearson | 0:0d9dd22ca491 | 219 | |
BPPearson | 0:0d9dd22ca491 | 220 | if (x > 7) x = 0; |
BPPearson | 0:0d9dd22ca491 | 221 | |
BPPearson | 0:0d9dd22ca491 | 222 | if (y == 1) |
BPPearson | 0:0d9dd22ca491 | 223 | writeToLCD(COMMAND, 0x80 + 0x40 + x); |
BPPearson | 0:0d9dd22ca491 | 224 | else |
BPPearson | 0:0d9dd22ca491 | 225 | writeToLCD(COMMAND, 0x80 + 0x00 + x); |
BPPearson | 0:0d9dd22ca491 | 226 | |
BPPearson | 0:0d9dd22ca491 | 227 | wait_us(50); |
BPPearson | 0:0d9dd22ca491 | 228 | } |
BPPearson | 0:0d9dd22ca491 | 229 | |
BPPearson | 0:0d9dd22ca491 | 230 | |
BPPearson | 0:0d9dd22ca491 | 231 | void displayString(int x, int y, char *str){ |
BPPearson | 0:0d9dd22ca491 | 232 | |
BPPearson | 0:0d9dd22ca491 | 233 | // position cursor |
BPPearson | 0:0d9dd22ca491 | 234 | positionCursor(x, y); |
BPPearson | 0:0d9dd22ca491 | 235 | |
BPPearson | 0:0d9dd22ca491 | 236 | // write string to screen |
BPPearson | 0:0d9dd22ca491 | 237 | for (int i=0; i<strlen(str); i++){ |
BPPearson | 0:0d9dd22ca491 | 238 | writeToLCD(DATA, str[i]); |
BPPearson | 0:0d9dd22ca491 | 239 | |
BPPearson | 0:0d9dd22ca491 | 240 | wait_us(50); |
BPPearson | 0:0d9dd22ca491 | 241 | } |
BPPearson | 0:0d9dd22ca491 | 242 | } |
BPPearson | 0:0d9dd22ca491 | 243 | |
BPPearson | 0:0d9dd22ca491 | 244 | |
BPPearson | 0:0d9dd22ca491 | 245 | void standardDeviationCalc(float opacity) |
BPPearson | 0:0d9dd22ca491 | 246 | { |
BPPearson | 0:0d9dd22ca491 | 247 | // add to standard deviation accumulators |
BPPearson | 0:0d9dd22ca491 | 248 | anIn1Sum += opacity; |
BPPearson | 0:0d9dd22ca491 | 249 | anIn1SumSqr += (opacity * opacity); |
BPPearson | 0:0d9dd22ca491 | 250 | |
BPPearson | 0:0d9dd22ca491 | 251 | // increment standard deviation counter |
BPPearson | 0:0d9dd22ca491 | 252 | stdDevCount++; |
BPPearson | 0:0d9dd22ca491 | 253 | |
BPPearson | 0:0d9dd22ca491 | 254 | // if enough readings for the standard deviation calculation |
BPPearson | 0:0d9dd22ca491 | 255 | if (stdDevCount >= 100) |
BPPearson | 0:0d9dd22ca491 | 256 | { |
BPPearson | 0:0d9dd22ca491 | 257 | // calculate the standard deviation |
BPPearson | 0:0d9dd22ca491 | 258 | // std dev = sqrt( (n * sum(x2) - sum(x)2)) / (n * (n - 1))) |
BPPearson | 0:0d9dd22ca491 | 259 | standardDeviation = ((stdDevCount * anIn1SumSqr) - (anIn1Sum * anIn1Sum)) / (stdDevCount * (stdDevCount - 1)); |
BPPearson | 0:0d9dd22ca491 | 260 | if (standardDeviation > 0.0) |
BPPearson | 0:0d9dd22ca491 | 261 | standardDeviation = sqrt(standardDeviation); |
BPPearson | 0:0d9dd22ca491 | 262 | else |
BPPearson | 0:0d9dd22ca491 | 263 | standardDeviation = sqrt(-standardDeviation); |
BPPearson | 0:0d9dd22ca491 | 264 | |
BPPearson | 0:0d9dd22ca491 | 265 | // clear standard deviation accumulators for next set of readings |
BPPearson | 0:0d9dd22ca491 | 266 | anIn1Sum = 0.0; |
BPPearson | 0:0d9dd22ca491 | 267 | anIn1SumSqr = 0.0; |
BPPearson | 0:0d9dd22ca491 | 268 | stdDevCount = 0; |
BPPearson | 0:0d9dd22ca491 | 269 | } |
BPPearson | 0:0d9dd22ca491 | 270 | } |
BPPearson | 0:0d9dd22ca491 | 271 | |
BPPearson | 0:0d9dd22ca491 | 272 | |
BPPearson | 0:0d9dd22ca491 | 273 | void updateDisplay(){ |
BPPearson | 0:0d9dd22ca491 | 274 | char str[20]; |
BPPearson | 0:0d9dd22ca491 | 275 | |
BPPearson | 0:0d9dd22ca491 | 276 | sprintf( str, "o %5.1f", filteredOpacity * 104.0 * calibFactor); |
BPPearson | 0:0d9dd22ca491 | 277 | |
BPPearson | 0:0d9dd22ca491 | 278 | displayString(0, 0, str); |
BPPearson | 0:0d9dd22ca491 | 279 | |
BPPearson | 0:0d9dd22ca491 | 280 | if (showCalibFactor == 0){ |
BPPearson | 0:0d9dd22ca491 | 281 | sprintf( str, "s %5.2f", standardDeviation); |
BPPearson | 0:0d9dd22ca491 | 282 | |
BPPearson | 0:0d9dd22ca491 | 283 | displayString(0, 1, str); |
BPPearson | 0:0d9dd22ca491 | 284 | } |
BPPearson | 0:0d9dd22ca491 | 285 | else{ |
BPPearson | 0:0d9dd22ca491 | 286 | sprintf( str, "m %5.2f", calibFactor); |
BPPearson | 0:0d9dd22ca491 | 287 | |
BPPearson | 0:0d9dd22ca491 | 288 | displayString(0, 1, str); |
BPPearson | 0:0d9dd22ca491 | 289 | |
BPPearson | 0:0d9dd22ca491 | 290 | showCalibFactor--; |
BPPearson | 0:0d9dd22ca491 | 291 | } |
BPPearson | 0:0d9dd22ca491 | 292 | } |
BPPearson | 0:0d9dd22ca491 | 293 | |
BPPearson | 0:0d9dd22ca491 | 294 | |
BPPearson | 0:0d9dd22ca491 | 295 | |
BPPearson | 0:0d9dd22ca491 | 296 | int main() { |
BPPearson | 0:0d9dd22ca491 | 297 | float binVal[10]; |
BPPearson | 0:0d9dd22ca491 | 298 | int binCnt[10]; |
BPPearson | 0:0d9dd22ca491 | 299 | int maxCnt = 0; |
BPPearson | 0:0d9dd22ca491 | 300 | int maxIdx = 0; |
BPPearson | 0:0d9dd22ca491 | 301 | |
BPPearson | 0:0d9dd22ca491 | 302 | initLCD(); |
BPPearson | 0:0d9dd22ca491 | 303 | |
BPPearson | 0:0d9dd22ca491 | 304 | filterAlgorithm = BINAVERAGE; |
BPPearson | 0:0d9dd22ca491 | 305 | |
BPPearson | 0:0d9dd22ca491 | 306 | calibUp.mode(PullUp); |
BPPearson | 0:0d9dd22ca491 | 307 | calibDown.mode(PullUp); |
BPPearson | 0:0d9dd22ca491 | 308 | unlocked.mode(PullUp); |
BPPearson | 0:0d9dd22ca491 | 309 | calibUp.attach_deasserted(&incCalibFactor); |
BPPearson | 0:0d9dd22ca491 | 310 | //calibUp.attach_deasserted_held(&incCalibFactor); |
BPPearson | 0:0d9dd22ca491 | 311 | calibDown.attach_deasserted(&decCalibFactor); |
BPPearson | 0:0d9dd22ca491 | 312 | //calibDown.attach_deasserted_held(&decCalibFactor); |
BPPearson | 0:0d9dd22ca491 | 313 | |
BPPearson | 0:0d9dd22ca491 | 314 | calibUp.setSampleFrequency(); |
BPPearson | 0:0d9dd22ca491 | 315 | calibDown.setSampleFrequency(); |
BPPearson | 0:0d9dd22ca491 | 316 | |
BPPearson | 0:0d9dd22ca491 | 317 | updateLCD.attach(&updateDisplay, 0.5); |
BPPearson | 0:0d9dd22ca491 | 318 | |
BPPearson | 0:0d9dd22ca491 | 319 | readConfigFile(); |
BPPearson | 0:0d9dd22ca491 | 320 | |
BPPearson | 0:0d9dd22ca491 | 321 | // initialise analog input values |
BPPearson | 0:0d9dd22ca491 | 322 | for (int i=0; i<100; i++) |
BPPearson | 0:0d9dd22ca491 | 323 | anInVals[i] = opacity.read(); |
BPPearson | 0:0d9dd22ca491 | 324 | |
BPPearson | 0:0d9dd22ca491 | 325 | while(1) { |
BPPearson | 0:0d9dd22ca491 | 326 | // read next analog input value into circular buffer |
BPPearson | 0:0d9dd22ca491 | 327 | anInVals[anInIdx] = opacity.read(); |
BPPearson | 0:0d9dd22ca491 | 328 | |
BPPearson | 0:0d9dd22ca491 | 329 | // increment anInIdx and check for wrap |
BPPearson | 0:0d9dd22ca491 | 330 | anInIdx++; |
BPPearson | 0:0d9dd22ca491 | 331 | if (anInIdx >= 100) |
BPPearson | 0:0d9dd22ca491 | 332 | anInIdx = 0; |
BPPearson | 0:0d9dd22ca491 | 333 | |
BPPearson | 0:0d9dd22ca491 | 334 | // filter analog inputs with required algorithm |
BPPearson | 0:0d9dd22ca491 | 335 | switch (filterAlgorithm) |
BPPearson | 0:0d9dd22ca491 | 336 | { |
BPPearson | 0:0d9dd22ca491 | 337 | case AVERAGE: |
BPPearson | 0:0d9dd22ca491 | 338 | float accumulator = 0.0; |
BPPearson | 0:0d9dd22ca491 | 339 | for (int i=0; i<100; i++) |
BPPearson | 0:0d9dd22ca491 | 340 | { |
BPPearson | 0:0d9dd22ca491 | 341 | accumulator += anInVals[i]; |
BPPearson | 0:0d9dd22ca491 | 342 | } |
BPPearson | 0:0d9dd22ca491 | 343 | instantOpacity = accumulator / 100; |
BPPearson | 0:0d9dd22ca491 | 344 | break; |
BPPearson | 0:0d9dd22ca491 | 345 | case MEDIAN: |
BPPearson | 0:0d9dd22ca491 | 346 | float tempF; |
BPPearson | 0:0d9dd22ca491 | 347 | for (int j=1; j<100; j++) |
BPPearson | 0:0d9dd22ca491 | 348 | { |
BPPearson | 0:0d9dd22ca491 | 349 | for (int i=1; i<100; i++) |
BPPearson | 0:0d9dd22ca491 | 350 | { |
BPPearson | 0:0d9dd22ca491 | 351 | if (anInVals[i] < anInVals[i-1]) |
BPPearson | 0:0d9dd22ca491 | 352 | { |
BPPearson | 0:0d9dd22ca491 | 353 | // swap places |
BPPearson | 0:0d9dd22ca491 | 354 | tempF = anInVals[i-1] ; |
BPPearson | 0:0d9dd22ca491 | 355 | anInVals[i-1] = anInVals[i]; |
BPPearson | 0:0d9dd22ca491 | 356 | anInVals[i] = tempF; |
BPPearson | 0:0d9dd22ca491 | 357 | } |
BPPearson | 0:0d9dd22ca491 | 358 | } |
BPPearson | 0:0d9dd22ca491 | 359 | } |
BPPearson | 0:0d9dd22ca491 | 360 | instantOpacity = anInVals[49]; |
BPPearson | 0:0d9dd22ca491 | 361 | break; |
BPPearson | 0:0d9dd22ca491 | 362 | case RATEOFCHANGE: |
BPPearson | 0:0d9dd22ca491 | 363 | break; |
BPPearson | 0:0d9dd22ca491 | 364 | case BINAVERAGE: |
BPPearson | 0:0d9dd22ca491 | 365 | // initialise bins to zero |
BPPearson | 0:0d9dd22ca491 | 366 | for (int i=0; i<10; i++) |
BPPearson | 0:0d9dd22ca491 | 367 | { |
BPPearson | 0:0d9dd22ca491 | 368 | binVal[i] = 0.0; |
BPPearson | 0:0d9dd22ca491 | 369 | binCnt[i] = 0; |
BPPearson | 0:0d9dd22ca491 | 370 | } |
BPPearson | 0:0d9dd22ca491 | 371 | |
BPPearson | 0:0d9dd22ca491 | 372 | // sort analog input values into one of ten bins |
BPPearson | 0:0d9dd22ca491 | 373 | for (int i=0; i<100; i++) |
BPPearson | 0:0d9dd22ca491 | 374 | { |
BPPearson | 0:0d9dd22ca491 | 375 | int binIdx = anInVals[i] * 10.0; |
BPPearson | 0:0d9dd22ca491 | 376 | if (binIdx > 9) |
BPPearson | 0:0d9dd22ca491 | 377 | binIdx = 9; |
BPPearson | 0:0d9dd22ca491 | 378 | binVal[binIdx] += anInVals[i]; |
BPPearson | 0:0d9dd22ca491 | 379 | binCnt[binIdx]++; |
BPPearson | 0:0d9dd22ca491 | 380 | } |
BPPearson | 0:0d9dd22ca491 | 381 | |
BPPearson | 0:0d9dd22ca491 | 382 | maxCnt = 0; |
BPPearson | 0:0d9dd22ca491 | 383 | maxIdx = 0; |
BPPearson | 0:0d9dd22ca491 | 384 | // find the bin with most values added |
BPPearson | 0:0d9dd22ca491 | 385 | for (int i=0; i<10; i++) |
BPPearson | 0:0d9dd22ca491 | 386 | { |
BPPearson | 0:0d9dd22ca491 | 387 | if (binCnt[i] > maxCnt) |
BPPearson | 0:0d9dd22ca491 | 388 | { |
BPPearson | 0:0d9dd22ca491 | 389 | maxCnt = binCnt[i]; |
BPPearson | 0:0d9dd22ca491 | 390 | maxIdx = i; |
BPPearson | 0:0d9dd22ca491 | 391 | } |
BPPearson | 0:0d9dd22ca491 | 392 | } |
BPPearson | 0:0d9dd22ca491 | 393 | |
BPPearson | 0:0d9dd22ca491 | 394 | instantOpacity = binVal[maxIdx] / binCnt[maxIdx]; |
BPPearson | 0:0d9dd22ca491 | 395 | break; |
BPPearson | 0:0d9dd22ca491 | 396 | } |
BPPearson | 0:0d9dd22ca491 | 397 | |
BPPearson | 0:0d9dd22ca491 | 398 | standardDeviationCalc(instantOpacity); |
BPPearson | 0:0d9dd22ca491 | 399 | |
BPPearson | 0:0d9dd22ca491 | 400 | // apply a filter to the instant reading to get the filtered reading |
BPPearson | 0:0d9dd22ca491 | 401 | filteredOpacity = (instantOpacity * 0.05) + (filteredOpacity * 0.95); |
BPPearson | 0:0d9dd22ca491 | 402 | |
BPPearson | 0:0d9dd22ca491 | 403 | fOpacity.write(filteredOpacity * calibFactor); |
BPPearson | 0:0d9dd22ca491 | 404 | |
BPPearson | 0:0d9dd22ca491 | 405 | wait(0.1); |
BPPearson | 0:0d9dd22ca491 | 406 | } |
BPPearson | 0:0d9dd22ca491 | 407 | } |