Continuously vary LED brightness between completely dark and fully lite.
Glowing.cpp
- Committer:
- sitti
- Date:
- 2010-12-29
- Revision:
- 0:26c09c4aba81
- Child:
- 1:eef7593bdcc5
File content as of revision 0:26c09c4aba81:
#include "mbed.h" #include "math.h" #include "Glowing.h" Glowing::Glowing(PinName pin, float period, int steps, int offset) { // Set the constants s_port = new PwmOut(pin); s_steps = steps; s_step_offset = offset; c_circle = 2*acos(-1.0); // 2 PI c_step_time = period/steps; c_step_gradient = c_circle/steps; s_running = false; } Glowing::~Glowing() { Stop(); } int Glowing::scale(float x) { // Scaling the input value from [-1.0 - 1.0] to [0 - 1000] return (int)((x + 1.0)*1000/2); } void Glowing::next(void) { // Set the PWM value s_port->pulsewidth_us(s_next_v); // Calculate the next step and the corresponding PWM value s_next_n = (s_next_n + 1) % s_steps; s_next_v = scale(cos(s_next_n * c_step_gradient)); } void Glowing::Start(void) { s_port->period_ms(1); s_next_v = 0.0; s_next_n = s_steps/2 + s_step_offset; attach(this, &Glowing::next, c_step_time); s_running = true; } void Glowing::Stop(void) { if (s_running) { detach(); } }