Opacity meter

Dependencies:   PinDetect mbed

Committer:
BPPearson
Date:
Tue Jan 05 16:44:13 2016 +0000
Revision:
0:0d9dd22ca491
Opacity meter

Who changed what in which revision?

UserRevisionLine numberNew 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 }