Skittles Dispenser by Benjamin Kim and Alex Zdanov
Dependencies: 4DGL-uLCD-SE HC_SR04_Ultrasonic_Library LSM9DS1_Library_cal Servo mbed
Diff: main.cpp
- Revision:
- 0:2094aa9eeb53
- Child:
- 1:1099d4500d8a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Mar 11 21:40:03 2017 +0000 @@ -0,0 +1,175 @@ +#include "mbed.h" +#include "LSM9DS1.h" //Accelerometer +#include "uLCD_4DGL.h" //LCD +#define MAX_BITS 100 // max number of bits +#define WEIGAND_WAIT_TIME 3000 // time to wait for another weigand pulse. + +int databits[MAX_BITS]; // stores all of the data bits +int bitCount; // number of bits currently captured +int flagDone; // goes low when data is currently being captured +int weigand_counter; // countdown until we assume there are no more bits + +unsigned long facilityCode=0; // decoded facility code +unsigned long cardCode=0; // decoded card code + + +DigitalOut LED_GREEN(p15); +DigitalIn dataIn(p10); +DigitalIn Clock(p5); + + +InterruptIn int0(p10); +InterruptIn int1(p5); + +uLCD_4DGL uLCD(p28, p27, p29); // serial tx, serial rx, reset pin; +DigitalOut myled(LED1); + +/*int LED_GREEN = 11; +int LED_RED = 12; +int BEEP_BEEP = 10;*/ + +// interrupt that happens when INTO goes low (0 bit) +void ISR_INT0() +{ + //uLCD.print("0"); // uncomment this line to display raw binary + bitCount++; + flagDone = 0; + weigand_counter = WEIGAND_WAIT_TIME; + +} + +// interrupt that happens when INT1 goes low (1 bit) +void ISR_INT1() +{ + //uLCD.print("1"); // uncomment this line to display raw binary + databits[bitCount] = 1; + bitCount++; + flagDone = 0; + weigand_counter = WEIGAND_WAIT_TIME; +} + +void setup() +{ + LED_GREEN = 1; + myled = 1; + uLCD.printf("RFID Reader Setup"); + int0.fall(&ISR_INT0); + int1.fall(&ISR_INT1); + /*pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(BEEP_BEEP, OUTPUT); + digitalWrite(LED_RED, HIGH); // High = Off + digitalWrite(BEEP_BEEP, HIGH); // High = off + digitalWrite(LED_GREEN, LOW); // Low = On + pinMode(2, INPUT); // DATA0 (INT0) + pinMode(3, INPUT); // DATA1 (INT1) + + uLCD.begin(9600); + uLCD.println("RFID Readers"); + + // binds the ISR functions to the falling edge of INTO and INT1 + attachInterrupt(0, ISR_INT0, FALLING); + attachInterrupt(1, ISR_INT1, FALLING); + */ + + weigand_counter = WEIGAND_WAIT_TIME; +} + +void printBits() +{ + uLCD.printf("FC = "); + uLCD.printf("%lu", facilityCode); + uLCD.printf(", CC = "); + uLCD.printf("%lu", cardCode); +} + +void loop() +{ + // This waits to make sure that there have been no more data pulses before processing data + if (!flagDone) { + if (--weigand_counter == 0) + flagDone = 1; + } + + // if we have bits and we the weigand counter went out + if (bitCount > 0 && flagDone) { + int i; + + uLCD.printf("Read "); + uLCD.printf("%d", bitCount); + uLCD.printf(" bits. "); + + if (bitCount == 35) { + // 35 bit HID Corporate 1000 format + // facility code = bits 2 to 14 + for (i=2; i<14; i++) { + facilityCode <<=1; + facilityCode |= databits[i]; + } + + // card code = bits 15 to 34 + for (i=14; i<34; i++) { + cardCode <<=1; + cardCode |= databits[i]; + } + + printBits(); + } else if (bitCount == 26) { + // standard 26 bit format + // facility code = bits 2 to 9 + for (i=1; i<9; i++) { + facilityCode <<=1; + facilityCode |= databits[i]; + } + + // card code = bits 10 to 23 + for (i=9; i<25; i++) { + cardCode <<=1; + cardCode |= databits[i]; + } + + printBits(); + } else { + // you can add other formats if you want! + // uLCD.println("Unable to decode."); + } + + // cleanup and get ready for the next card + bitCount = 0; + facilityCode = 0; + cardCode = 0; + for (i=0; i<MAX_BITS; i++) { + databits[i] = 0; + } + } +} + + + +Serial pc(USBTX, USBRX); + +AnalogIn in(p20); //Proximity +float voltage; + +int IDNum; + + +int main() +{ + uLCD.cls(); + + /*LSM9DS1 IMU(p9, p10, 0xD6, 0x3C); + IMU.begin(); + if (!IMU.begin()) { + pc.printf("Failed to communicate with LSM9DS1.\n"); + }*/ + + setup(); + uLCD.printf("After Setup \n"); + + while(1) { + + loop(); + + } +}