abc

Dependencies:   mbed-rtos mbed pixy pixy_test

Fork of aUtO_volume_v4 by ese519

Committer:
jfields
Date:
Fri Dec 11 06:55:12 2015 +0000
Revision:
7:309840290ee8
Parent:
6:75156f40a227
abc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jfields 0:6618ecb9567e 1 #include "mbed.h"
jfields 0:6618ecb9567e 2 #include "Pixy.h"
jfields 6:75156f40a227 3 #include "rtos.h"
jfields 0:6618ecb9567e 4
jfields 1:5302a23c97c4 5 // init board
jfields 0:6618ecb9567e 6 Pixy pixy(Pixy::SPI, p11, p12, p13);
jfields 0:6618ecb9567e 7 Serial pc(USBTX, USBRX);
jfields 4:fe091424b406 8 DigitalOut pin1(p24);
jfields 4:fe091424b406 9 DigitalOut pin2(p25);
jfields 0:6618ecb9567e 10
jfields 3:56a1264e43aa 11 #if defined(TARGET_LPC1768)
jfields 3:56a1264e43aa 12 Serial blue(p9, p10); // TX, RX
jfields 3:56a1264e43aa 13 //Serial blue(p13, p14); // TX, RX
jfields 3:56a1264e43aa 14 #elif defined(TARGET_LPC4330_M4)
jfields 3:56a1264e43aa 15 Serial blue(P6_4, P6_5); // UART0_TX, UART0_RX
jfields 3:56a1264e43aa 16 //Serial blue(P2_3, P2_4); // UART3_TX, UART3_RX
jfields 3:56a1264e43aa 17 #endif
jfields 3:56a1264e43aa 18
jfields 1:5302a23c97c4 19 // global vars
jfields 1:5302a23c97c4 20 int num_readings = 0;
jfields 1:5302a23c97c4 21 int total_y = 0;
jfields 7:309840290ee8 22 int numOverflows = 0;
jfields 7:309840290ee8 23 float total_UO = 0.0;
jfields 6:75156f40a227 24 float result_level = 0.0; // mL
jfields 6:75156f40a227 25 float result_hourly = 0.0; // mL/hr
jfields 6:75156f40a227 26 float prev_level = 0.0;
jfields 6:75156f40a227 27
jfields 6:75156f40a227 28 int gotFirstReading = 0;
jfields 6:75156f40a227 29 int isDraining = 0;
jfields 7:309840290ee8 30 int gotFirstHourly = 0;
jfields 1:5302a23c97c4 31
jfields 4:fe091424b406 32 // funcs and threads
jfields 1:5302a23c97c4 33 void get_volume(int i);
jfields 6:75156f40a227 34 void adjustRate();
jfields 4:fe091424b406 35 void get_hourly(void const *args);
jfields 6:75156f40a227 36 void check_overflow();
jfields 6:75156f40a227 37 RtosTimer * rate_thread;
jfields 1:5302a23c97c4 38
jfields 0:6618ecb9567e 39 int main() {
jfields 1:5302a23c97c4 40
jfields 3:56a1264e43aa 41 // init bluetooth
jfields 3:56a1264e43aa 42 blue.baud(9600);
jfields 3:56a1264e43aa 43
jfields 3:56a1264e43aa 44 // init pc
jfields 3:56a1264e43aa 45 pc.baud(9600);
jfields 3:56a1264e43aa 46 pc.printf("Bluetooth Start\r\n");
jfields 3:56a1264e43aa 47 pc.printf("ready\n\r");
jfields 3:56a1264e43aa 48
jfields 1:5302a23c97c4 49 // init pixy
jfields 0:6618ecb9567e 50 pixy.setSerialOutput(&pc);
jfields 1:5302a23c97c4 51
jfields 6:75156f40a227 52 // start with pumps off
jfields 6:75156f40a227 53 pin1 = 0;
jfields 4:fe091424b406 54 pin2 = 0;
jfields 4:fe091424b406 55
jfields 4:fe091424b406 56 // start hourly thread
jfields 6:75156f40a227 57 rate_thread = new RtosTimer(get_hourly, osTimerPeriodic, (void *)0);
jfields 7:309840290ee8 58 rate_thread->start(15000);
jfields 4:fe091424b406 59
jfields 0:6618ecb9567e 60 while (1) {
jfields 1:5302a23c97c4 61
jfields 1:5302a23c97c4 62 // get pixy data
jfields 0:6618ecb9567e 63 uint16_t blocks;
jfields 0:6618ecb9567e 64 blocks = pixy.getBlocks();
jfields 1:5302a23c97c4 65
jfields 1:5302a23c97c4 66 // store data
jfields 0:6618ecb9567e 67 if (blocks) {
jfields 1:5302a23c97c4 68 for (int j = 0; j < blocks; j++) {
jfields 1:5302a23c97c4 69 get_volume(pixy.blocks[j].y);
jfields 0:6618ecb9567e 70 }
jfields 0:6618ecb9567e 71 }
jfields 6:75156f40a227 72
jfields 6:75156f40a227 73 // check for overflow
jfields 6:75156f40a227 74 check_overflow();
jfields 6:75156f40a227 75
jfields 6:75156f40a227 76 // adjust rate
jfields 7:309840290ee8 77 //if (!isDraining) adjustRate();
jfields 1:5302a23c97c4 78 }
jfields 0:6618ecb9567e 79 }
jfields 1:5302a23c97c4 80
jfields 6:75156f40a227 81 void adjustRate() {
jfields 7:309840290ee8 82
jfields 7:309840290ee8 83 if (gotFirstHourly) {
jfields 7:309840290ee8 84 if (result_hourly < 60.0) {
jfields 7:309840290ee8 85
jfields 7:309840290ee8 86 }
jfields 7:309840290ee8 87 else if (result_hourly < 120.0) {
jfields 7:309840290ee8 88
jfields 7:309840290ee8 89 }
jfields 7:309840290ee8 90 else {
jfields 7:309840290ee8 91
jfields 7:309840290ee8 92 }
jfields 7:309840290ee8 93 }
jfields 6:75156f40a227 94 }
jfields 6:75156f40a227 95
jfields 6:75156f40a227 96 void check_overflow() {
jfields 7:309840290ee8 97 if (result_level >= 30.0 && !isDraining) { //led1 = 1;
jfields 6:75156f40a227 98 pin1 = 0;
jfields 6:75156f40a227 99 pin2 = 1;
jfields 6:75156f40a227 100 isDraining = 1;
jfields 7:309840290ee8 101 numOverflows++;
jfields 6:75156f40a227 102 }
jfields 7:309840290ee8 103 if (result_level < 4.0) {
jfields 6:75156f40a227 104 pin2 = 0;
jfields 6:75156f40a227 105 pin1 = 1;
jfields 6:75156f40a227 106 isDraining = 0;
jfields 6:75156f40a227 107 }
jfields 6:75156f40a227 108 }
jfields 6:75156f40a227 109
jfields 6:75156f40a227 110 void get_hourly(void const *args) {
jfields 6:75156f40a227 111 pc.printf("calc'ing hourly...%f %f\r\n", result_level, prev_level);
jfields 6:75156f40a227 112 if (!isDraining && gotFirstReading) {
jfields 7:309840290ee8 113 float temp = (result_level-prev_level)*4.0;
jfields 7:309840290ee8 114 if (temp >= 0) {
jfields 7:309840290ee8 115 result_hourly = temp;
jfields 7:309840290ee8 116 prev_level = result_level;
jfields 7:309840290ee8 117 gotFirstHourly = 1;
jfields 7:309840290ee8 118 }
jfields 6:75156f40a227 119 }
jfields 7:309840290ee8 120 if (isDraining) gotFirstReading = 0;
jfields 4:fe091424b406 121 }
jfields 4:fe091424b406 122
jfields 1:5302a23c97c4 123 void get_volume(int y) {
jfields 1:5302a23c97c4 124
jfields 1:5302a23c97c4 125 // update data
jfields 1:5302a23c97c4 126 total_y += y;
jfields 1:5302a23c97c4 127 num_readings++;
jfields 1:5302a23c97c4 128
jfields 1:5302a23c97c4 129 // output results
jfields 4:fe091424b406 130 if (num_readings >= 10) {
jfields 2:1354ce60c0b9 131 float average_y = (float)total_y/num_readings;
jfields 6:75156f40a227 132 result_level = -0.2642*average_y + 38.453;
jfields 6:75156f40a227 133
jfields 7:309840290ee8 134 if (!gotFirstReading && !isDraining) {
jfields 6:75156f40a227 135 gotFirstReading = 1;
jfields 6:75156f40a227 136 prev_level = result_level;
jfields 6:75156f40a227 137 }
jfields 1:5302a23c97c4 138
jfields 3:56a1264e43aa 139 // to pc
jfields 5:06fa76d9d7bd 140 pc.printf("y = %d, num_readings = %d, average = %.2f, mL = %.2f, rate = %.2f\r\n", y, num_readings, average_y, result_level, result_hourly);
jfields 4:fe091424b406 141 pc.printf("%.2f %.2f\r\n", result_level, result_hourly);
jfields 3:56a1264e43aa 142
jfields 3:56a1264e43aa 143 // to bluetooth
jfields 7:309840290ee8 144 if (!isDraining) total_UO = result_level+(float)numOverflows*26.0;
jfields 7:309840290ee8 145 blue.printf("%.2f %.2f\r\n", total_UO, result_hourly);
jfields 3:56a1264e43aa 146
jfields 1:5302a23c97c4 147 // reset vars
jfields 1:5302a23c97c4 148 num_readings = 0;
jfields 1:5302a23c97c4 149 total_y = 0;
jfields 1:5302a23c97c4 150 }
jfields 1:5302a23c97c4 151 }