Josh Goldberg / Mbed 2 deprecated count_pills

Dependencies:   Servo mbed

Committer:
jgoldberg
Date:
Fri Dec 12 01:18:01 2014 +0000
Revision:
1:9ebe670d8a19
Parent:
0:15d3cdafd311
Updated calibration values for small breadboard

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jgoldberg 0:15d3cdafd311 1 #include "mbed.h"
jgoldberg 0:15d3cdafd311 2 #include "weight.h"
jgoldberg 0:15d3cdafd311 3
jgoldberg 0:15d3cdafd311 4 static const int batches = 5; // number of times you will add batch_size number of pills for calibration
jgoldberg 0:15d3cdafd311 5 static const int batch_size = 10; // number of pills added per batch for calibration
jgoldberg 1:9ebe670d8a19 6 static uint16_t cal_vals[batches + 1] = {23102, 23547, 23993, 24494, 24960, 25390}; // = {0}; // initialize to zero if re-calibrating
jgoldberg 0:15d3cdafd311 7 // calibration for 4,5 {23748, 23986, 24216, 24460, 24674};
jgoldberg 0:15d3cdafd311 8 // calibration for 5,10 {23758, 24221, 24672, 25124, 25588, 26034};
jgoldberg 0:15d3cdafd311 9 static int calibrated = 1; // change to 0 to re-calibrate
jgoldberg 0:15d3cdafd311 10
jgoldberg 0:15d3cdafd311 11 int calibrate_pills() {
jgoldberg 0:15d3cdafd311 12 uint16_t val;
jgoldberg 0:15d3cdafd311 13 uint16_t val_avg;
jgoldberg 0:15d3cdafd311 14 calibrated = 0;
jgoldberg 0:15d3cdafd311 15
jgoldberg 0:15d3cdafd311 16 for (int b = 0; b <= batches; b++) {
jgoldberg 0:15d3cdafd311 17 myled1 = 0;
jgoldberg 0:15d3cdafd311 18 if (b == 0) {
jgoldberg 0:15d3cdafd311 19 pc.printf("Press enter when bottle is empty.\n\r");
jgoldberg 0:15d3cdafd311 20 } else {
jgoldberg 0:15d3cdafd311 21 pc.printf("Please add %d more pills and press enter. Total pills: %d\n\r", batch_size, b*batch_size);
jgoldberg 0:15d3cdafd311 22 }
jgoldberg 0:15d3cdafd311 23 pc.getc();
jgoldberg 0:15d3cdafd311 24 myled1 = 1;
jgoldberg 0:15d3cdafd311 25 myled2 = 0;
jgoldberg 0:15d3cdafd311 26 pc.printf("Measuring...\n\r");
jgoldberg 0:15d3cdafd311 27 mvgAvg(0,1);
jgoldberg 1:9ebe670d8a19 28 for (int i = 0; i < 100; i++) { //will measure for ~5 seconds
jgoldberg 0:15d3cdafd311 29 val = myADC.read_u16();
jgoldberg 0:15d3cdafd311 30 val_avg = mvgAvg(val, 0);
jgoldberg 0:15d3cdafd311 31 pc.printf("%d\n\r", val_avg);
jgoldberg 0:15d3cdafd311 32 wait(0.05);
jgoldberg 0:15d3cdafd311 33 }
jgoldberg 0:15d3cdafd311 34 cal_vals[b] = val_avg;
jgoldberg 0:15d3cdafd311 35 pc.printf("Calibration value for %d pills is: %d\n\r", b*batch_size, cal_vals[b]);
jgoldberg 0:15d3cdafd311 36 myled2 = 1;
jgoldberg 0:15d3cdafd311 37 }
jgoldberg 0:15d3cdafd311 38 calibrated = 1;
jgoldberg 0:15d3cdafd311 39 return 0;
jgoldberg 0:15d3cdafd311 40 }
jgoldberg 0:15d3cdafd311 41
jgoldberg 0:15d3cdafd311 42 int measure_pills() {
jgoldberg 0:15d3cdafd311 43
jgoldberg 0:15d3cdafd311 44 if (!calibrated) {
jgoldberg 0:15d3cdafd311 45 calibrate_pills();
jgoldberg 0:15d3cdafd311 46 }
jgoldberg 0:15d3cdafd311 47
jgoldberg 0:15d3cdafd311 48 uint16_t val;
jgoldberg 0:15d3cdafd311 49 uint16_t val_avg;
jgoldberg 0:15d3cdafd311 50 float number_pills = 0;
jgoldberg 0:15d3cdafd311 51
jgoldberg 0:15d3cdafd311 52 val = myADC.read_u16();
jgoldberg 0:15d3cdafd311 53 val_avg = mvgAvg(val, 0);
jgoldberg 0:15d3cdafd311 54 //pc.printf("raw: %d avg: %d\n\r", val, val_avg);
jgoldberg 0:15d3cdafd311 55 for (int b = 0; b < batches; b++) {
jgoldberg 0:15d3cdafd311 56 if (val_avg <= cal_vals[b]) { break; }
jgoldberg 0:15d3cdafd311 57 number_pills = (float) (val_avg - cal_vals[b]) / (cal_vals[b + 1] - cal_vals[b]) * batch_size + b * batch_size;
jgoldberg 0:15d3cdafd311 58 }
jgoldberg 0:15d3cdafd311 59 pc.printf("Number of pills: %f rounded: %d\n\r", number_pills, round(number_pills));
jgoldberg 0:15d3cdafd311 60 return round(number_pills);
jgoldberg 0:15d3cdafd311 61 }