Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
weight.cpp@1:9ebe670d8a19, 2014-12-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |