This is a simple application that stores the timing of button presses (within a 5 second period), then replays the sequence back out by flashing an LED in the same timing intervals. This was based on a secret knock program I did a long time ago.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 DigitalOut led1(LED1);
00004 InterruptIn sw(SW2);  //Use SW1 on some platforms
00005 Timer timer;
00006 
00007 uint8_t recording = 0;  //indicates whether recording a new pattern or not
00008 uint32_t blinkTiming[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  //to store pattern - series of milisecond time delays
00009 uint8_t blinkCount = 0;  //starts at 0 for first knock
00010 uint32_t startTime;  //timer time in miliseconds
00011 
00012 //interrupt routine that is called when button is pressed
00013 void fall_handler(void) {
00014 
00015     //if not recording yet
00016     if(recording ==0)
00017       {
00018         //this is the first button press
00019         blinkCount = 0;
00020         led1 = 1; //turn off led
00021         //clear the array that stores the pattern
00022         for(uint8_t i = 0; i<20; i++)
00023         {
00024           blinkTiming[i] = 0;
00025         }
00026         //set state to recording
00027         recording = 1;
00028         //start timer
00029         timer.start();
00030         timer.reset();
00031         startTime = timer.read_ms();
00032 
00033       //if already recording
00034       }else if(recording == 1)
00035       {
00036         //this is not the first button press
00037         uint32_t now;
00038         //check the time verses the start time and save it
00039         now = timer.read_ms();
00040         blinkTiming[blinkCount] = (now - startTime);
00041         //add to the number of button presses captured - same as number of blinks that will come later
00042         blinkCount++;
00043         startTime = now;  //start time for next period
00044       }
00045 
00046 }
00047 
00048 // main() runs in its own thread in the OS
00049 int main() {
00050 
00051   //set state to not recording
00052   recording = 0;
00053   //set interrupt callback for when the button is pressed
00054   sw.fall(fall_handler);
00055 
00056 
00057   while(1)
00058   {
00059       //if state is recording
00060       if(recording==1)
00061       {
00062           //check if the max button presses (and thus blinks) has been reached, or time period has expired
00063           if (blinkCount >= 20 || timer.read_ms() > 5000)  //max presses reached or 5 sec elapsed - done recording
00064           {
00065             timer.stop();
00066             /* re-initialize all variables */
00067             recording = 0;
00068             blinkCount = 0;
00069 
00070           }
00071       //if state not recording
00072       }else if(recording == 0)
00073       {
00074           while(recording == 0)
00075           {
00076             //blink out the pattern
00077             for(uint8_t i = 0;i < 20; i++)
00078             {
00079               //blink led
00080               led1 = 0;
00081               wait_ms(10);
00082               led1 = 1;
00083               //wait for specified delay that was captured
00084               wait_ms(blinkTiming[i]);
00085               //check if the delay is zero, if so its the last one so stop.
00086               if(blinkTiming[i] == 0){
00087                 break;
00088               }
00089 
00090             }
00091             //take a break for a few seconds, then loop back and repeat the pattern again
00092             wait_ms(2000);
00093           }  //end of while(recording == 0)
00094       } //end of if(recording == 0)
00095 
00096   }  //end of while(1) infinite loop
00097 
00098 }  //end of main