Code glove

Dependencies:   mbed MPU6050

main.cpp

Committer:
pingnpp
Date:
2018-12-19
Revision:
0:b8ed5a8d189c

File content as of revision 0:b8ed5a8d189c:

#include "mbed.h"
#include "MPU6050.h"

Serial pc(PA_2, PA_3);
Serial bt(PA_9, PA_10);

AnalogIn force(PA_7);
MPU6050 AccGyro(PB_7, PB_6);
AnalogIn flex[] = {(PA_0), (PA_1), (PA_4), (PA_5), (PA_6)};
DigitalOut LED(LED1);
float min[] = {1.000, 1.000, 1.000, 1.000, 1.000};
float max[] = {0.000, 0.000, 0.000, 0.000, 0.000};
float avg[] = {0.000, 0.000, 0.000, 0.000, 0.000};
double Ax, Ay, Az, readd;
double Gx, Gy, Gz;
int memoryTime;
uint16_t AccelReadings[3] = {0, 0, 0};
uint16_t GyroReadings[3] = {0, 0, 0};
short int step, step1, step2, step3, step4, step5, memm, stepOn = 0, memOn = 0, chargeOn = 0, stepOff = 0, memOff = 0, chargeOff = 0, num = 0, dataFinger, charge = 0;
uint8_t DevId, elec = 0, sendData, mem = 0;
bool shutDown;
Timer t, minn, timeOn, timeOff, see;

short int boolFlex(int a){
    return (float)flex[a].read() >= avg[a];
}
float readFlex(int a){
    return (float)flex[a].read();
}
short int finger(){
    short int data = 0;
    short int pos = 1;
    for(int i = 4; i >= 0; i--){
        data += boolFlex(i)*pos;
        pos *= 2;
    }
    return data;
}
void updateIMU(){
    AccGyro.readAccel(AccelReadings);
    AccGyro.readGyro(GyroReadings);
    Ax = (double)(int16_t)AccelReadings[0];
    Ay = (double)(int16_t)AccelReadings[1];
    Az = (double)(int16_t)AccelReadings[2];
    Gx = (double)(int16_t)GyroReadings[0] / 131.0;
    Gy = (double)(int16_t)GyroReadings[1] / 131.0;
    Gz = (double)(int16_t)GyroReadings[2] / 131.0;
}
bool range(int a, int b, int c){
    return a > b && a < c;
}
void ping(){
    if(shutDown)    shutDown = false;
    else            shutDown = true;
}



bool memFan = false, memAir = false, memKettle = false, memTv = false, memRadio = false;



void onOff(uint8_t on, uint8_t off){
    dataFinger = finger();
    if(Ax > 1400){
        if(dataFinger == 31 && stepOn != 1)    stepOn = 1;
        else if(dataFinger != 31 && dataFinger != 16 && stepOn == 1){
            if(memOn == 0){
                timeOn.reset();
                memOn = 1;
            }
            else if(timeOn.read_ms() >= 1000){
                stepOn = 0;
                memOn = 0;
                chargeOn = 0;
            }
        }
        else if(dataFinger == 16 && stepOn == 1){
            chargeOn += 1;
            stepOn = 0;
            mem = 0;
        }
    }
    else if(timeOn.read_ms() > 2000){
        stepOn = 0;
        memOn = 0;
        chargeOn = 0;
    }
    if(chargeOn >= 2){
        bt.printf("%c", on);
        pc.printf("%c\n", on);
        chargeOn = 0;
    }
    if(dataFinger == 31){
        if(Gz < -20) stepOff = 1;
        else if(Gz > -20.00 && Gz < 20.00 && stepOff == 1){
            if(memOff == 0){
                timeOff.reset();
                memOff = 1;
            }
            else if(timeOff.read_ms() >= 1000){
                stepOff = 0;
                memOff = 0;
                chargeOff = 0;
            }
        }
        else if(Gz > 20 && stepOff == 1){
            chargeOff += 1;
            stepOff = 0;
            memOff = 0;
        }
        else if(timeOff.read_ms() > 2000){
            stepOff = 0;
            memOff = 0;
            chargeOff = 0;
        }
        if(chargeOff >= 4){
            bt.printf("%c", off);
            pc.printf("%c\n", off);
            chargeOff = 0;
        }
    }
}

void set0(){
    stepOn = 0;
    memOn = 0;
    chargeOn = 0;
    stepOff = 0;
    memOff = 0;
    chargeOff = 0;
    step1 = 0;
    step2 = 0;
    step3 = 0;
    step4 = 0;
//    step5 = 0;
}



int main() {
    pc.baud(38400);
    bt.baud(38400);
    while((float)force.read() <= 0.8){                                          //calibrate flex
        if(num >= 5) num = 0;
        readd = readFlex(num);
        if(readd <= min[num]) min[num] = readd;
        if(readd >= max[num]) max[num] = readd;
        num += 1;
    }
    for(int i = 0; i < 5; i++) avg[i] = (min[i] + max[i])/2;
    pc.printf("\n\n\n%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", avg[0], avg[1], avg[2], avg[3], avg[4]);
    DevId = AccGyro.getWhoAmI();
    while(DevId != 0x71) DevId = AccGyro.getWhoAmI();
    LED = 1;
    AccGyro.setPowerCtl_1(0x00, 0x00, 0x00, 0x00, INT_8MHz_OSC);    // Disable sleep mode
    wait_ms(1);
    AccGyro.setGyroConfig(GYRO_ST_OFF, GFS_2000dps); // Accelerometer elf-test trigger off.
    wait_ms(1);
    AccGyro.setAccelConfig(ACC_ST_OFF, AFS_16g);    // Gyroscope self-test trigger off.
    wait_ms(1);
    InterruptIn force(PA_7);
    shutDown = false;
    minn.start();
    see.start();
    force.rise(&ping);
//    while(1){
//        updateIMU();
//        pc.printf("flex : %d\tAccel\tX: %.3f\tY: %.3f\tZ: %.3f\tGyro\tX: %.3f\tY: %.3f\tZ: %.3f\n", finger(), Ax, Ay, Az, Gx, Gy, Gz);
//    }
//    while(1){
//        updateIMU();
//        onOff('A', 'B');
//        pc.printf("step : %d\tmem : %d\tcharge : %d\tstep : %d\tmem : %d\tcharge : %d\n", stepOn, memOn, chargeOn, stepOff, memOff, chargeOff);
//    }
    while(1){
        if(!shutDown){
            if(bt.readable()){
                elec = (uint8_t)bt.getc()-48;
                pc.printf("\t\t\t%d\n", elec);
            }
            updateIMU();
            /*if(minn.read_ms() >= 60000 && elec != 0){
                bt.printf("%c", elec + 83 S);
                elec = 0;
            }*/
            while(elec == 0){
               if(bt.readable()){
                    elec = (uint8_t)bt.getc()-48;
                    pc.printf("\t%d\n", elec);
                } 
                updateIMU();
                if(Ax > 1400){
                    if(step != 1)      step = 1;
                    dataFinger = finger();
                    if(dataFinger == 8)         sendData = 1;
                    else if(dataFinger == 12)   sendData = 3;
                    else if(dataFinger == 14)   sendData = 5;
                    else if(dataFinger == 15)   sendData = 4;
                    else if(dataFinger == 0)    sendData = 2;
                    else                        sendData = 6;
                    if(minn.read_ms() >= 10){
                        bt.printf("%c", sendData+48);
                        pc.printf("%d\n", sendData);
                        minn.reset();
                    }
                }
                else if(range(Ay, -1000, 1000) && Gy > 0 && sendData < 6){
                    if(step == 1)  step = 2;
                }
                else if(Az > 1800 && step == 2){
                    while(minn.read_ms() < 10);
                    bt.printf("%c", 'a'+sendData);
                    pc.printf("%c\n", 'a'+sendData);
                    minn.reset();
                    elec = sendData;
                    step  = 0;
                    sendData = 6;
                    set0();
                    while(1){
                        if(bt.readable())   elec = (uint8_t)bt.getc()-48;
                        if(elec != 0)       break;
                    }
                    break;
                    pc.printf("yeah");
                }
                else{
                    if(step != 0){
                        step = 0;
                    }
                }
                if(step == 0 && minn.read_ms() >= 10){
                    sendData = 0;
                    bt.printf("%c", 'a');
                    pc.printf("%d\n", sendData);
                    minn.reset();
                }
            }
            updateIMU();
            if(elec == 1){      //fan
                dataFinger = finger();
                onOff('A', 'B');
                if(Az < -800){
                    if(dataFinger == 31 && step1 != 1)    step1 = 1;
                    else if(dataFinger == 16 && step1 == 1){
                        bt.printf("%c", 'D');
                        pc.printf("%c\n", 'D');
                        step1 = 2;
                    }
                }
                else if(Az > 1500){
                    if(dataFinger == 31 && step1 != 3)    step1 = 3;
                    else if(dataFinger == 16 && step1 == 3){
                        bt.printf("%c", 'C');
                        pc.printf("%c\n", 'C');
                        step1 = 4;
                    }
                }
                else    step1 = 0;
            }
            else if(elec == 2){ //air
                dataFinger = finger();
                onOff('E', 'F');
                if(dataFinger == 28){
                    if(Gz > 50 && step2 !=1)    step2 = 1;
                    else if(Gz  < 10 && step2 == 1){
                        bt.printf("%c", 'H');
                        pc.printf("%c\n", 'H');
                        step2 = 2;
                    }
                }
                else if(dataFinger == 24){
                    if(Gz > 20 && step2 !=4)    step2 = 4;
                    else if(Gz  < 20 && step2 == 4){
                        bt.printf("%c", 'G');
                        pc.printf("%c\n", 'G');
                        step2 = 5;
                    }
                }
                else    step2 = 0;
            }
            else if(elec == 3){ //kettle
                dataFinger = finger();
                onOff('I', 'J');
            }
            else if(elec == 4){ //tv
                dataFinger = finger();
                onOff('K', 'L');
                if(dataFinger == 16){
                    if(Ay < -800 && step4 != 3)     step4 = 3;
                    else if(Ay > 1000 && step4 == 3){
                        bt.printf("%c", 'M');
                        pc.printf("%c\n", 'M');
                        step4 = 4;
                    }
                    if(Ay > 1400 && step4 != 5)     step4 = 5;
                    else if(Ay < -300 && step4 == 5){
                        bt.printf("%c", 'N');
                        pc.printf("%c\n", 'N');
                        step4 = 6;
                    }
                }
            }
            else if(elec == 5){ //radio
                dataFinger = finger();
                onOff('O', 'P');
                if(dataFinger == 16){
                    if(Gx > 20 && step5 != 1){
                        bt.printf("%c", 'U');
                        pc.printf("%c\n", 'U');
                        step5 = 1;
                    }
                    
                    if(Ay < -800 && step5 != 3)     step5 = 3;
                    else if(Ay > 1000 && step5 == 3){
                        bt.printf("%c", 'Q');
                        pc.printf("%c\n", 'Q');
                        step5 = 4;
                    }
                    if(Ay > 1400 && step5 != 5)     step5 = 5;
                    else if(Ay < -300 && step5 == 5){
                        bt.printf("%c", 'R');
                        pc.printf("%c\n", 'R');
                        step5 = 6;
                    }
                }
                if(dataFinger == 24){
                    if(Gx < -20&& step5 != 2){
                        bt.printf("%c", 'T');
                        pc.printf("%c\n", 'T');
                        step5 = 2;
                    }
                }
            }
        }
    }
}