Breath LED that turn on/off or loop the brightness smoothly.

Dependents:   BreathLed-demo EPD_GDE021A1_demo mbed_esp8266_demo NUCLEO_uart_flow_control

This breathing-led uses Ticker and PWM which consumes few CPU, and most important, you can use it to tell system hang.

Just init it with a PWM pin which connected to a LED.

Committer:
steeven
Date:
Mon Apr 06 11:02:16 2015 +0000
Revision:
0:13c83a6b336f
init release;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
steeven 0:13c83a6b336f 1 /*
steeven 0:13c83a6b336f 2 * BreathLed.cpp
steeven 0:13c83a6b336f 3 *
steeven 0:13c83a6b336f 4 * Created on: 2015/4/6
steeven 0:13c83a6b336f 5 * Author: steeven@gmail.com
steeven 0:13c83a6b336f 6 */
steeven 0:13c83a6b336f 7
steeven 0:13c83a6b336f 8 #include <BreathLed/BreathLed.h>
steeven 0:13c83a6b336f 9
steeven 0:13c83a6b336f 10 namespace steeven {
steeven 0:13c83a6b336f 11 BreathLed::BreathLed(PinName pin, float time, float hold) :
steeven 0:13c83a6b336f 12 _pin(pin), _ticker() {
steeven 0:13c83a6b336f 13 _pin = 0;
steeven 0:13c83a6b336f 14 _time = time;
steeven 0:13c83a6b336f 15 _hold = hold;
steeven 0:13c83a6b336f 16 _mode = 0;
steeven 0:13c83a6b336f 17 _off = 0;
steeven 0:13c83a6b336f 18 _step = 0;
steeven 0:13c83a6b336f 19 }
steeven 0:13c83a6b336f 20 void BreathLed::hold_tick() {
steeven 0:13c83a6b336f 21 _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS);
steeven 0:13c83a6b336f 22 }
steeven 0:13c83a6b336f 23 void BreathLed::step_tick() {
steeven 0:13c83a6b336f 24
steeven 0:13c83a6b336f 25 if (_off) {
steeven 0:13c83a6b336f 26 if (_step <= 0) {
steeven 0:13c83a6b336f 27 if (_mode == 0) { //loop
steeven 0:13c83a6b336f 28 _off = !_off;
steeven 0:13c83a6b336f 29 if (_hold)
steeven 0:13c83a6b336f 30 _ticker.attach(this, &BreathLed::hold_tick, _hold);
steeven 0:13c83a6b336f 31 } else
steeven 0:13c83a6b336f 32 _ticker.detach();
steeven 0:13c83a6b336f 33 return;
steeven 0:13c83a6b336f 34 } else {
steeven 0:13c83a6b336f 35 _step--;
steeven 0:13c83a6b336f 36 }
steeven 0:13c83a6b336f 37 } else {
steeven 0:13c83a6b336f 38 if (_step >= BREATH_STEPS) {
steeven 0:13c83a6b336f 39 if (_mode == 0) { //loop
steeven 0:13c83a6b336f 40 _off = !_off;
steeven 0:13c83a6b336f 41 if (_hold)
steeven 0:13c83a6b336f 42 _ticker.attach(this, &BreathLed::hold_tick, _hold);
steeven 0:13c83a6b336f 43 } else
steeven 0:13c83a6b336f 44 _ticker.detach();
steeven 0:13c83a6b336f 45 return;
steeven 0:13c83a6b336f 46 } else {
steeven 0:13c83a6b336f 47 _step++;
steeven 0:13c83a6b336f 48 }
steeven 0:13c83a6b336f 49 }
steeven 0:13c83a6b336f 50
steeven 0:13c83a6b336f 51 _pin = (float)(1 << _step) / (1 << BREATH_STEPS);
steeven 0:13c83a6b336f 52 }
steeven 0:13c83a6b336f 53 void BreathLed::loop(float time, float hold) {
steeven 0:13c83a6b336f 54 _time = time;
steeven 0:13c83a6b336f 55 _hold = hold;
steeven 0:13c83a6b336f 56 _mode = 0;
steeven 0:13c83a6b336f 57 _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS);
steeven 0:13c83a6b336f 58 }
steeven 0:13c83a6b336f 59
steeven 0:13c83a6b336f 60
steeven 0:13c83a6b336f 61 void BreathLed::on() {
steeven 0:13c83a6b336f 62 _mode = 1;
steeven 0:13c83a6b336f 63 _off = 0;
steeven 0:13c83a6b336f 64 if (_pin < 1)
steeven 0:13c83a6b336f 65 _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS);
steeven 0:13c83a6b336f 66 else
steeven 0:13c83a6b336f 67 _ticker.detach();
steeven 0:13c83a6b336f 68 }
steeven 0:13c83a6b336f 69 void BreathLed::off() {
steeven 0:13c83a6b336f 70 _mode = 2;
steeven 0:13c83a6b336f 71 _off = 1;
steeven 0:13c83a6b336f 72 if (_pin > 0)
steeven 0:13c83a6b336f 73 _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS);
steeven 0:13c83a6b336f 74 else
steeven 0:13c83a6b336f 75 _ticker.detach();
steeven 0:13c83a6b336f 76 }
steeven 0:13c83a6b336f 77 BreathLed::~BreathLed() {
steeven 0:13c83a6b336f 78 if (!_pin != 0)
steeven 0:13c83a6b336f 79 _pin = 0;
steeven 0:13c83a6b336f 80 }
steeven 0:13c83a6b336f 81 }// namespace steeven