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.
main.cpp
- Committer:
- maclobdell
- Date:
- 2017-06-27
- Revision:
- 0:11f1739fb2ad
File content as of revision 0:11f1739fb2ad:
#include "mbed.h" DigitalOut led1(LED1); InterruptIn sw(SW2); //Use SW1 on some platforms Timer timer; uint8_t recording = 0; //indicates whether recording a new pattern or not 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 uint8_t blinkCount = 0; //starts at 0 for first knock uint32_t startTime; //timer time in miliseconds //interrupt routine that is called when button is pressed void fall_handler(void) { //if not recording yet if(recording ==0) { //this is the first button press blinkCount = 0; led1 = 1; //turn off led //clear the array that stores the pattern for(uint8_t i = 0; i<20; i++) { blinkTiming[i] = 0; } //set state to recording recording = 1; //start timer timer.start(); timer.reset(); startTime = timer.read_ms(); //if already recording }else if(recording == 1) { //this is not the first button press uint32_t now; //check the time verses the start time and save it now = timer.read_ms(); blinkTiming[blinkCount] = (now - startTime); //add to the number of button presses captured - same as number of blinks that will come later blinkCount++; startTime = now; //start time for next period } } // main() runs in its own thread in the OS int main() { //set state to not recording recording = 0; //set interrupt callback for when the button is pressed sw.fall(fall_handler); while(1) { //if state is recording if(recording==1) { //check if the max button presses (and thus blinks) has been reached, or time period has expired if (blinkCount >= 20 || timer.read_ms() > 5000) //max presses reached or 5 sec elapsed - done recording { timer.stop(); /* re-initialize all variables */ recording = 0; blinkCount = 0; } //if state not recording }else if(recording == 0) { while(recording == 0) { //blink out the pattern for(uint8_t i = 0;i < 20; i++) { //blink led led1 = 0; wait_ms(10); led1 = 1; //wait for specified delay that was captured wait_ms(blinkTiming[i]); //check if the delay is zero, if so its the last one so stop. if(blinkTiming[i] == 0){ break; } } //take a break for a few seconds, then loop back and repeat the pattern again wait_ms(2000); } //end of while(recording == 0) } //end of if(recording == 0) } //end of while(1) infinite loop } //end of main