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-14
Revision:
5:2532f81cba87
Parent:
4:8952303a18be

File content as of revision 5:2532f81cba87:

#include "mbed.h"
#include "LSM9DS1.h" //Accelerometer
#include "uLCD_4DGL.h" //LCD  
#include "mbed.h"
#include "Servo.h"

#include <mpr121.h>
#include <string>
#include <list>



Servo myservo(p22); //servo

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;
//Change password here. 
int password[4] = {1, 32, 1024, 2048};
int attempt[4];
int correct = 1; //correct is 1 if they havent put in 3 digits. it's 2 if they're correct and it's 3 if they are incorrect.

// 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;

Serial bluemod(p9,p10);

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;
    }

    if (value !=0) {

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

            if (attempt[0] == password[0] && attempt[1] == password[1] && attempt[2] == password[2] && attempt[3] == password[3]) {
                correct = 2;
            } else {
                correct = 3;
            }
            passIndex = 0;
            for (int k = 0; k < 4; k++)
                attempt[k] = NULL;
        }

    }


    //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;
}

int main()
{

    //Inclue this if you have gyroscope connected. We only had 3 Serial buses so we were unable to use the gyroscope.
    /*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 \ncandy\n");

    while(1) {
        //Inclue this if you have gyroscope connected. We only had 3 Serial buses so we were unable to use the gyroscope.
        /*//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.cls();
            uLCD.printf("Don't shake the machine!\n");
            wait(2.0);
            for (int i = 3; i > 0; i--) {
                uLCD.cls();
                uLCD.printf("Machine stopped\n for: %d Second(s)", i);
                wait(1.0);
            }
            uLCD.cls();
            uLCD.printf("Enter code for \n candy\n");
        }
        IMU.readGyro();
        xval = IMU.calcGyro(IMU.gx);
        yval = IMU.calcGyro(IMU.gy);
        zval = IMU.calcGyro(IMU.gz);
        */
        while(bluemod.readable()) {
            if (bluemod.getc() == 'd') {
                correct = 4;
                bluemod.puts("Dispensing Candy!");
            }
            if (bluemod.getc() == 'c') {
                voltage = in.read();

            }
        }

        if(correct == 2) { // They inputted the correct password
            uLCD.cls();
            uLCD.printf("Correct Password! \n\n\n Dispensing Candy!");
            myservo = 1;
            wait(1.3333);
            myservo = 0.5;
            uLCD.cls();
            uLCD.printf("Enjoy!");
            wait(2.0);
            uLCD.cls();
            wait(0.2);
            correct = 1;
            uLCD.printf("Enter code for \ncandy\n");
        }
        if(correct == 3) { // they inputted the incorrect password
            uLCD.cls();
            uLCD.printf("Incorrect Password\n\n Try again.");
            wait(2.0);
            correct = 1;
            uLCD.cls();
            uLCD.printf("Enter code for \ncandy\n");
        }
        if(correct == 4) { // They inputted the correct password
            uLCD.cls();
            uLCD.printf("Dispensing via\nbluetooth!");
            myservo = 1;
            wait(1.3333);
            myservo = 0.5;
            uLCD.cls();
            uLCD.printf("Enjoy!");
            wait(2.0);
            uLCD.cls();
            wait(0.2);
            correct = 1;
            uLCD.printf("Enter code for \ncandy\n");
        }


    }
}