Ferry Musters / Mbed 2 deprecated Clap_Unit

Dependencies:   mbed

Committer:
Ferryy
Date:
Mon Jun 29 21:54:14 2015 +0000
Revision:
1:df9d6f3886f6
Parent:
0:6c254e376969
Child:
2:6b15e2363f00
Check set pattern of 2 claps.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ferryy 0:6c254e376969 1 //**************************************************//
Ferryy 0:6c254e376969 2 // Application to switch a light or other output //
Ferryy 0:6c254e376969 3 // whenever the correct handclapping pattern is //
Ferryy 1:df9d6f3886f6 4 // detected. An external handclap detection board //
Ferryy 1:df9d6f3886f6 5 // is used (works as a SR-latch). //
Ferryy 0:6c254e376969 6 // //
Ferryy 0:6c254e376969 7 // Ferry Musters & Thom Grasso - 26/06/2015 //
Ferryy 0:6c254e376969 8 // Electrical Engineering - Hogeschool Utrecht //
Ferryy 0:6c254e376969 9 //**************************************************//
Ferryy 0:6c254e376969 10 // TODO:
Ferryy 1:df9d6f3886f6 11 // DONE! Must have: - Reset timer and measurements after (4sec?) timeout
Ferryy 1:df9d6f3886f6 12 // DONE! Must have: - Detect fixed pattern (2 claps)
Ferryy 1:df9d6f3886f6 13 // Must have: - Detect fixed pattern (3+ claps)
Ferryy 0:6c254e376969 14 // Could have: - Make user defined patterns (learn the device the pattern)
Ferryy 0:6c254e376969 15
Ferryy 0:6c254e376969 16 #include "mbed.h"
Ferryy 0:6c254e376969 17
Ferryy 1:df9d6f3886f6 18 void BlinkLed(char color, float time);
Ferryy 1:df9d6f3886f6 19
Ferryy 1:df9d6f3886f6 20 //-------------------[ Parameters ]------------------
Ferryy 1:df9d6f3886f6 21 const int timeout_ms = 1000;
Ferryy 1:df9d6f3886f6 22 const int allowedError = 200; //Allowed time difference between clap and set clap pattern
Ferryy 1:df9d6f3886f6 23
Ferryy 1:df9d6f3886f6 24 const int clapPattern[] = {0, 500}; //initial clap pattern (in ms)
Ferryy 1:df9d6f3886f6 25
Ferryy 0:6c254e376969 26 //-------------------[ Variables ]-------------------
Ferryy 0:6c254e376969 27 DigitalOut led_red(LED_RED);
Ferryy 0:6c254e376969 28 DigitalOut led_blue(LED_BLUE);
Ferryy 0:6c254e376969 29 DigitalOut led_green(LED_GREEN);
Ferryy 1:df9d6f3886f6 30 InterruptIn userSwitch(SW3);
Ferryy 0:6c254e376969 31
Ferryy 1:df9d6f3886f6 32
Ferryy 1:df9d6f3886f6 33 DigitalOut boardGnd(D4); //pins
Ferryy 0:6c254e376969 34 DigitalOut boardVcc(D5);
Ferryy 0:6c254e376969 35 //InterruptIn boardClap(SW2);
Ferryy 0:6c254e376969 36 InterruptIn boardClap(D6);
Ferryy 0:6c254e376969 37 DigitalOut boardReset(D7);
Ferryy 0:6c254e376969 38
Ferryy 0:6c254e376969 39 Serial output(USBTX, USBRX);
Ferryy 1:df9d6f3886f6 40 Timer timer; //global timer
Ferryy 1:df9d6f3886f6 41 int clapData[100]; //buffer to save clap times
Ferryy 0:6c254e376969 42 int currentClap = 0; //counter to keep track of current clap in buffer
Ferryy 0:6c254e376969 43 int printedClap = 0; //counter to keep track of printf'ed claps
Ferryy 0:6c254e376969 44
Ferryy 0:6c254e376969 45
Ferryy 1:df9d6f3886f6 46 //-------------------[ Interrupts ]-------------------
Ferryy 1:df9d6f3886f6 47 void ClapDetected(void) //interrupt function for boardClap pin
Ferryy 0:6c254e376969 48 {
Ferryy 1:df9d6f3886f6 49 clapData[currentClap++] = timer.read_ms(); //save clap time and increment counter
Ferryy 0:6c254e376969 50
Ferryy 1:df9d6f3886f6 51 led_blue= 0; //blink a led to show detected clap
Ferryy 0:6c254e376969 52 boardReset = 1; //reset the clap detecter board with a reset pulse
Ferryy 0:6c254e376969 53 wait(0.1); //wait to show led and also avoid handclap 'bounces'
Ferryy 0:6c254e376969 54 boardReset = 0;
Ferryy 1:df9d6f3886f6 55 led_blue = 1; //The LED pin is inverted so '1' means LED off
Ferryy 1:df9d6f3886f6 56 }
Ferryy 1:df9d6f3886f6 57
Ferryy 1:df9d6f3886f6 58 void DemoPattern(void) //interrupt function for userSwitch pin
Ferryy 1:df9d6f3886f6 59 {
Ferryy 1:df9d6f3886f6 60 const float demoBlinkLength = 0.05; //led blink length in ms
Ferryy 1:df9d6f3886f6 61 int amountOfClaps = sizeof(clapPattern) / sizeof(clapPattern[0]);
Ferryy 1:df9d6f3886f6 62 wait(0.3);
Ferryy 1:df9d6f3886f6 63 BlinkLed('r', demoBlinkLength); //blink the first clap
Ferryy 1:df9d6f3886f6 64 for(int i = 1; i < amountOfClaps; i++) { //blink the second and next claps
Ferryy 1:df9d6f3886f6 65 float delaytime = (clapPattern[i]-clapPattern[i-1])/1000.0 - demoBlinkLength;
Ferryy 1:df9d6f3886f6 66 output.printf("Blinking clap %d for %.2f second\r\n", i, delaytime);
Ferryy 1:df9d6f3886f6 67 output.printf("clapPattern[i] = %d\r\n", clapPattern[i]);
Ferryy 1:df9d6f3886f6 68 output.printf("clapPattern[i-1] = %d\r\n", clapPattern[i-1]);
Ferryy 1:df9d6f3886f6 69 wait(delaytime);
Ferryy 1:df9d6f3886f6 70 BlinkLed('r', demoBlinkLength);
Ferryy 1:df9d6f3886f6 71 }
Ferryy 1:df9d6f3886f6 72 }
Ferryy 1:df9d6f3886f6 73
Ferryy 1:df9d6f3886f6 74 //-------------------[ Functions ]-------------------
Ferryy 1:df9d6f3886f6 75 void Initialize()
Ferryy 1:df9d6f3886f6 76 {
Ferryy 1:df9d6f3886f6 77 timer.start();
Ferryy 1:df9d6f3886f6 78 boardVcc = 1;
Ferryy 1:df9d6f3886f6 79 boardGnd = 0;
Ferryy 1:df9d6f3886f6 80 boardReset = 0;
Ferryy 1:df9d6f3886f6 81 led_red = 1;
Ferryy 1:df9d6f3886f6 82 led_green = 1;
Ferryy 1:df9d6f3886f6 83 led_blue = 1;
Ferryy 1:df9d6f3886f6 84 boardClap.rise(&ClapDetected);
Ferryy 1:df9d6f3886f6 85 userSwitch.rise(&DemoPattern);
Ferryy 0:6c254e376969 86 }
Ferryy 0:6c254e376969 87
Ferryy 1:df9d6f3886f6 88 void PrintClaps()
Ferryy 1:df9d6f3886f6 89 {
Ferryy 1:df9d6f3886f6 90 if(printedClap < currentClap) { //if the last clap isn't printed yet
Ferryy 1:df9d6f3886f6 91 output.printf("* Detected clap %d: %d\r\n", ++printedClap, clapData[printedClap]); //debug the clap
Ferryy 1:df9d6f3886f6 92 }
Ferryy 1:df9d6f3886f6 93 }
Ferryy 0:6c254e376969 94
Ferryy 1:df9d6f3886f6 95 bool CheckTimeout() //check if clap timeout occurs(when last clap is more then x seconds ago)
Ferryy 1:df9d6f3886f6 96 {
Ferryy 1:df9d6f3886f6 97 return ((currentClap > 0) && (timer.read_ms() > (clapData[currentClap-1] + timeout_ms)))
Ferryy 1:df9d6f3886f6 98 }
Ferryy 1:df9d6f3886f6 99
Ferryy 1:df9d6f3886f6 100 void ResetMeasurement() //reset counters to start new measurement
Ferryy 1:df9d6f3886f6 101 {
Ferryy 1:df9d6f3886f6 102 output.printf("--- Timeout. %d claps and took %.2fs in total ---\r\n", currentClap, (clapData[currentClap-1] - clapData[0])/1000.0);
Ferryy 1:df9d6f3886f6 103 currentClap = 0;
Ferryy 1:df9d6f3886f6 104 printedClap = 0;
Ferryy 1:df9d6f3886f6 105 }
Ferryy 1:df9d6f3886f6 106
Ferryy 1:df9d6f3886f6 107 bool CheckClapPattern() //check if clapped pattern matches
Ferryy 1:df9d6f3886f6 108 {
Ferryy 1:df9d6f3886f6 109 //CURRENT VERSION SUPPORTS JUST 2-clap patterns
Ferryy 1:df9d6f3886f6 110 output.printf("Check if %d is equal to %d.\r\n", (sizeof(clapPattern)/sizeof(clapPattern[0])), currentClap);
Ferryy 1:df9d6f3886f6 111
Ferryy 1:df9d6f3886f6 112 if((sizeof(clapPattern)/sizeof(clapPattern[0])) != currentClap) return false; //if nr of claps is not equal return mismatch
Ferryy 1:df9d6f3886f6 113
Ferryy 1:df9d6f3886f6 114 int realClapDelta = clapData[1] - clapData[0]; //measured clap pattern
Ferryy 1:df9d6f3886f6 115 int requiredClapDelta = clapPattern[1] - clapPattern[0]; //set clap pattern
Ferryy 1:df9d6f3886f6 116
Ferryy 1:df9d6f3886f6 117 int maxClapDelta = requiredClapDelta + allowedError;
Ferryy 1:df9d6f3886f6 118 int minClapDelta = requiredClapDelta - allowedError;
Ferryy 1:df9d6f3886f6 119 if((realClapDelta > minClapDelta) && (realClapDelta < maxClapDelta)) return true;
Ferryy 1:df9d6f3886f6 120 else return false;
Ferryy 1:df9d6f3886f6 121 }
Ferryy 1:df9d6f3886f6 122
Ferryy 1:df9d6f3886f6 123 void BlinkLed(char color, float time) //Blink led ('r', 'g' or 'b') for given time (float in sec)
Ferryy 1:df9d6f3886f6 124 {
Ferryy 1:df9d6f3886f6 125 if(color == 'r') led_red = !led_red;
Ferryy 1:df9d6f3886f6 126 if(color == 'g') led_green = !led_green;
Ferryy 1:df9d6f3886f6 127 if(color == 'b') led_blue = !led_blue;
Ferryy 1:df9d6f3886f6 128 wait(time);
Ferryy 1:df9d6f3886f6 129 if(color == 'r') led_red = !led_red;
Ferryy 1:df9d6f3886f6 130 if(color == 'g') led_green = !led_green;
Ferryy 1:df9d6f3886f6 131 if(color == 'b') led_blue = !led_blue;
Ferryy 1:df9d6f3886f6 132 }
Ferryy 0:6c254e376969 133
Ferryy 0:6c254e376969 134 //-------------------[ Main ]-------------------
Ferryy 0:6c254e376969 135 int main()
Ferryy 0:6c254e376969 136 {
Ferryy 1:df9d6f3886f6 137 Initialize(); //initialize all required components and interrupts
Ferryy 0:6c254e376969 138
Ferryy 0:6c254e376969 139 while (true) {
Ferryy 1:df9d6f3886f6 140 PrintClaps(); //update the serial terminal to print all detected claps
Ferryy 0:6c254e376969 141
Ferryy 1:df9d6f3886f6 142 if( CheckTimeout() ) { // if timeout happened -> clap pattern ended
Ferryy 1:df9d6f3886f6 143 bool clapMatches = CheckClapPattern(); //check if claps match set pattern
Ferryy 1:df9d6f3886f6 144 if(clapMatches) BlinkLed('g', 0.5); //pattern match -> blink green
Ferryy 1:df9d6f3886f6 145 else BlinkLed('r', 0.5); //pattern mismatch -> blink red
Ferryy 1:df9d6f3886f6 146 ResetMeasurement();
Ferryy 0:6c254e376969 147 }
Ferryy 0:6c254e376969 148 }
Ferryy 1:df9d6f3886f6 149 }