Skittles Dispenser by Benjamin Kim and Alex Zdanov

Dependencies:   4DGL-uLCD-SE HC_SR04_Ultrasonic_Library LSM9DS1_Library_cal Servo mbed

main.cpp

Committer:
bkim334
Date:
2017-03-12
Revision:
1:1099d4500d8a
Parent:
0:2094aa9eeb53
Child:
2:c61e6541a2b4

File content as of revision 1:1099d4500d8a:

#include "mbed.h"
#include "LSM9DS1.h" //Accelerometer
#include "uLCD_4DGL.h" //LCD  
#include <mpr121.h>
#include <string>
#include <list>



PwmOut motor(p22); //Motor

uLCD_4DGL uLCD(p13, p14, p29); // serial tx, serial rx, reset pin;

//Mutex LCDMutex;

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
int passIndex = 0;
int password[4] = {1, 32, 1024, 2048};
int attempt[4];

// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p21);

// Setup the i2c bus on pins 28 and 27
I2C i2c(p28, p27);

// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);

Serial pc(USBTX, USBRX);

AnalogIn in(p20); //Proximity
float voltage;

void fallInterrupt()
{
    pc.printf("Start interrupt");
    int key_code=0;
    int i=0;
    int value=mpr121.read(0x00);
    value +=mpr121.read(0x01)<<8;
    // LED demo mod by J. Hamblen
    pc.printf("MPR value: %x \r\n", value);
    i=0;
    // puts key number out to LEDs for demo
    for (i=0; i<12; i++) {
        if (((value>>i)&0x01)==1) key_code=i+1;
    }

    bool correct = false;
    if (value !=0) {

        attempt[passIndex] = value;
        //uLCD.printf(" %d    %x \n", passIndex, value);
        passIndex++;
        if (passIndex == 4) {

            if (attempt[0] == password[0] && attempt[1] == password[1] && attempt[2] == password[2] && attempt[3] == password[3]) {
                correct = true;
                pc.printf("Correct!");
            } else {
                pc.printf("Incorrect. Try again");
            }
            passIndex = 0;
            for (int k = 0; k < 4; k++)
                attempt[k] = NULL;
        }

    }
    if(correct) {
        motor.write(0.5);
        wait(1);
        motor.write(0);
        /*uLCD.cls();
        uLCD.printf("Enjoy!");
        wait(2.0);
        uLCD.cls();
        wait(0.2);
        uLCD.printf("Enter code for candy\n");*/

    }

    //uLCD.printf("number pressed is %d\n", key_code);
    led4=key_code & 0x01;
    led3=(key_code>>1) & 0x01;
    led2=(key_code>>2) & 0x01;
    led1=(key_code>>3) & 0x01;

    pc.printf("test4\n");
}

int main()
{

    LSM9DS1 IMU(p9, p10, 0xD6, 0x3C);
    IMU.begin();
    if (!IMU.begin()) {
        pc.printf("Failed to communicate with LSM9DS1.\n");
    }
    IMU.readGyro();
    float xval = IMU.calcGyro(IMU.gx);
    float yval = IMU.calcGyro(IMU.gy);
    float zval = IMU.calcGyro(IMU.gz);


    uLCD.baudrate(3000000); //jack up baud rate to max for fast display
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);

    uLCD.printf("Enter code for candy\n");
    while(1) {
        //Checking if someone is skaing the machine
        while(!IMU.gyroAvailable())
            IMU.readGyro();
        if (abs(xval - IMU.calcGyro(IMU.gx)) > 10 || abs(yval - IMU.calcGyro(IMU.gy)) > 10 || abs(zval - IMU.calcGyro(IMU.gz)) > 10) {
            uLCD.printf("Don't shake the machine!\n");
            wait(2.0);
            for (int i = 3; i > 0; i--) {
                uLCD.cls();
                uLCD.printf("Machine stopped for: %d Second(s)", i);
                wait(1.0);
            }
            uLCD.cls();
            uLCD.printf("Enter code for candy\n");
        }
        IMU.readGyro();
        xval = IMU.calcGyro(IMU.gx);
        yval = IMU.calcGyro(IMU.gy);
        zval = IMU.calcGyro(IMU.gz);
    }
}