abc

Dependencies:   mbed-rtos mbed pixy pixy_test

Fork of aUtO_volume_v4 by ese519

main.cpp

Committer:
jfields
Date:
2015-12-10
Revision:
6:75156f40a227
Parent:
5:06fa76d9d7bd
Child:
7:309840290ee8

File content as of revision 6:75156f40a227:

#include "mbed.h"
#include "Pixy.h"
#include "rtos.h"

// init board
Pixy pixy(Pixy::SPI, p11, p12, p13);
Serial pc(USBTX, USBRX);
DigitalOut pin1(p24);
DigitalOut pin2(p25);

#if   defined(TARGET_LPC1768)
Serial blue(p9, p10);          // TX, RX
//Serial blue(p13, p14);         // TX, RX
#elif defined(TARGET_LPC4330_M4)
Serial blue(P6_4, P6_5);         // UART0_TX, UART0_RX
//Serial blue(P2_3, P2_4);         // UART3_TX, UART3_RX
#endif

// global vars
int num_readings = 0;
int total_y = 0;
float result_level = 0.0; // mL
float result_hourly = 0.0; // mL/hr
float prev_level = 0.0;

int gotFirstReading = 0;
int isDraining = 0;

// funcs and threads
void get_volume(int i);
void adjustRate();
void get_hourly(void const *args);
void check_overflow();
RtosTimer * rate_thread;

int main() {
    
    // init bluetooth
    blue.baud(9600);
    
    // init pc
    pc.baud(9600);
    pc.printf("Bluetooth Start\r\n");
    pc.printf("ready\n\r");
    
    // init pixy
    pixy.setSerialOutput(&pc);
    
    // start with pumps off
    pin1 = 0;
    pin2 = 0;
    
    // start hourly thread
    rate_thread = new RtosTimer(get_hourly, osTimerPeriodic, (void *)0);
    rate_thread->start(10000);

    while (1) {
       
        // get pixy data
        uint16_t blocks;
        blocks = pixy.getBlocks();
        
        // store data
        if (blocks) {
            for (int j = 0; j < blocks; j++) {
                get_volume(pixy.blocks[j].y);
            }
        }
        
        // check for overflow
        check_overflow();
        
        // adjust rate
        if (!isDraining) adjustRate();
    }
}

void adjustRate() {

}

void check_overflow() {
    if (result_level >= 30.0) { //led1 = 1;
        pin1 = 0;
        pin2 = 1;
        isDraining = 1;
    }
    if (result_level < 2.0) {
        pin2 = 0;
        pin1 = 1;
        isDraining = 0;
    }
}

void get_hourly(void const *args) {
    pc.printf("calc'ing hourly...%f %f\r\n", result_level, prev_level);
    if (!isDraining && gotFirstReading) {
        result_hourly = (result_level-prev_level)*6.0;
        prev_level = result_level;
    }
}

void get_volume(int y) {
    
    // update data
    total_y += y;
    num_readings++;
    
    // output results
    if (num_readings >= 10) {
        float average_y = (float)total_y/num_readings;
        result_level = -0.2642*average_y + 38.453;
        
        if (!gotFirstReading) {
            gotFirstReading = 1;
            prev_level = result_level;
        }
        
        // to pc
        pc.printf("y = %d, num_readings = %d, average = %.2f, mL = %.2f, rate = %.2f\r\n", y, num_readings, average_y, result_level, result_hourly);
        pc.printf("%.2f %.2f\r\n", result_level, result_hourly);
        
        // to bluetooth
        //blue.printf("y = %d, num_readings = %d, average = %.2f, mL = %.2f\r\n", y, num_readings, average_y, result);
        blue.printf("%.2f %.2f\r\n", result_level, result_hourly);

        // reset vars
        num_readings = 0;
        total_y = 0;
    }
}