Kevin Gilbert
/
Alarm-Example
Basic alarm using low power interrupts
main.cpp
- Committer:
- kgilbert
- Date:
- 2018-10-18
- Revision:
- 4:503239af19b8
- Parent:
- 3:0f0f89079c95
File content as of revision 4:503239af19b8:
#include "mbed.h" // Use buttons to select alarm time. Cycle through hours in an incrementing // fashion using button1, hit select and increment through minutes. Hit // select one more time to begin the alarm timer. // // The Time LEDs will blink in time with the button inputs to show the // currently selected alarm time. Once select is hit a second time to begin // the timer, the LEDs will blink out the configured delay in hours and // minutes before going into a low power sleep mode. // // Once the alarm fires, hitting the select button will turn the alarm off // until the next time it fires. //__________________________________________________________________________ // You may also use the RTC (hardware or software through the Time API) to // set a real world time and set an alarm for a specific timestamp rather // than on a delay. This would require manually setting the time on each // reset however, or an internet connection to automatically collect the // time. See Example <TODO>[HERE] for how to do that. // Time constants in seconds #define HOUR 60 * 60 #define MINUTE 60 // Globals DigitalOut alarm_out(D2, 0); DigitalOut alarm_led(LED_RED, 1); DigitalOut hour_led(LED_GREEN, 1); DigitalOut min_led(LED_BLUE, 1); InterruptIn inc_time(BUTTON1); InterruptIn select(BUTTON2); LowPowerTicker alarm_event; volatile uint64_t delay = 0; volatile uint8_t hour_count = 0; volatile uint8_t min_count = 0; volatile uint8_t select_state = 0; // Timer Callbacks void inc_select(void) { if (select_state < 2) { select_state++; } else { // Use select button to disable alarm alarm_out = 0; alarm_led = 1; } } void set_time_leds(void) { if (select_state == 0) { hour_led = !hour_led; } else { min_led = !min_led; } } void inc_delay(void) { if (select_state == 0) { delay += HOUR; hour_count++; hour_led = !hour_led; } else { delay += MINUTE; min_count++; min_led = !min_led; } } void trigger_alarm_out(void) { alarm_out = 1; alarm_led = 0; } // Main thread int main() { // Configure interrupt-in pins (button controls) select.rise(inc_select); inc_time.fall(set_time_leds); inc_time.rise(inc_delay); // Sleep while waiting for user input to set the desired delay while (select_state < 2) { wait_ms(10); } // Once the delay has been input, blink back the configured hours and // minutes selected for (uint8_t i = 0; i < hour_count * 2; i++) { hour_led = !hour_led; wait(0.25f); } for (uint8_t i = 0; i < min_count * 2; i++) { min_led = !min_led; wait(0.25f); } // Attach the low power ticker with the configured alarm delay alarm_event.attach(&trigger_alarm_out, delay); // Sleep in the main thread while (1) { wait(100000); } }