Initial blink test
main.cpp
- Committer:
- abuchan
- Date:
- 2017-12-19
- Revision:
- 1:595758ad1a42
- Parent:
- 0:2eb8dcd27e93
File content as of revision 1:595758ad1a42:
#include "mbed.h" #include <math.h> #define PWM_PERIOD 20 DigitalOut status_led(LED1); #define N_COLORS 5 typedef enum {red, green, blue, yellow, white} Color; //#define ORNAMENT_TREE //#define ORNAMENT_SNOWMAN #define ORNAMENT_MENORAH #ifdef ORNAMENT_TREE #define N_STATUS_BLINK 1 #define N_LEDS 18 DigitalOut leds[N_LEDS] = {D1, A4, D4, A0, A6, A2, D8, D0, A3, D5, D10, D6, A5, D9, D3, D2, D7, A1}; Color colors[N_LEDS] = { red, green, blue, yellow, red, green, yellow, red, green, blue, yellow, green, blue, yellow, red, red, green, white }; // Using hardware PWM channels at this scale didn't seem to work //#define N_PWM 15 //PwmOut pwm_leds[N_PWM] = {D1, D4, A6, A2, D0, A3, D5, D10, D6, A5, D9, D3, D2, D7, A1}; #endif // ORNAMENT_TREE #ifdef ORNAMENT_SNOWMAN #define N_STATUS_BLINK 2 #define N_LEDS 15 DigitalOut leds[N_LEDS] = {A4, D6, A3, D7, A6, D3, D2, D0, D1, A5, D5, D4, D8, A2, A1}; Color colors[N_LEDS] = { green, green, green, green, red, red, red, red, red, blue, blue, blue, yellow, yellow, yellow }; #endif // ORNAMENT_SNOWMAN #ifdef ORNAMENT_MENORAH #define N_STATUS_BLINK 3 #define N_LEDS 19 DigitalOut leds[N_LEDS] = {D8, D3, D11, A4, D10, A6, A0, D0, D9, D5, A2, A5, D7, D1, A3, D2, D6, D4, A1}; Color colors[N_LEDS] = { yellow, blue, yellow, green, yellow, blue, yellow, red, yellow, green, yellow, green, yellow, red, yellow, blue, yellow, green, white }; #endif // ORNAMENT_MENORAH float phase[N_COLORS] = {0.0, 0.5, 1.0, 1.5, 2.0}; float fade(float t, float f, float phase, float A) { return A * (sin(f * (t + phase)) / 2.0 + 0.5); } float chase(float t, float f, int phase, int period, float A) { int t_i = (int)(t * f) + phase; if ((t_i % period) == 0) { return 0.0; } else { return A; } } float randf() { return ((float)rand()) / RAND_MAX; } float update(int i, float t) { float pwm = 1.0; #ifdef ORNAMENT_TREE pwm = fade(t, 2.0, phase[colors[i]], 0.6); #endif // ORNAMENT_TREE #ifdef ORNAMENT_SNOWMAN if (colors[i] == yellow) { pwm = fade(t, 2.0, 0.0, 1.0); } else { pwm = chase(t, 2.0, -i, 9, 0.8); } #endif // ORNAMENT_SNOWMAN #ifdef ORNAMENT_MENORAH if (colors[i] == white) { pwm = fade(t, 3.14, 0.0, 1.0); } else { int candle = (int)(t/2.0) % 10; if ((i/2) > candle) { pwm = 0.0; } else { if (colors[i] == yellow) { pwm = randf(); if (pwm < 0.06) { pwm = 0.06; } } else { pwm = 1.0; } } } /*if (colors[i] == yellow) { if (i/2 > candle) { pwm = 0.0; } else if (randf() > 0.9) { pwm = randf(); if (pwm < 0.06) { pwm = 0.06; } } else { pwm = -1.0; } } else if(i >= candle) { if (i/2 < candle) { pwm = 0.0; } else { pwm = 1.0; } }*/ #endif // ORNAMENT_MENORAH return (int)(pwm * PWM_PERIOD); } int pwms[N_LEDS]; Timer system_timer; int main() { int led_count = 0; int period_count = 0; int timer_mod = 0; float pwm_update; system_timer.start(); for (int i = 0; i < N_LEDS; i++ ) { pwms[i] = 0; } while(1) { period_count = PWM_PERIOD; for (period_count = 0; period_count < PWM_PERIOD; period_count++) { for (int i = 0; i < N_LEDS; i++) { leds[i] = period_count < pwms[i] ? 1 : 0 ; } } pwm_update = update(led_count, system_timer.read_ms() / 1000.0); if (pwm_update >= 0.0) { pwms[led_count] = pwm_update; } if (++led_count == N_LEDS) { led_count = 0; } timer_mod = system_timer.read_ms() % 2000; if ((timer_mod < (300 * N_STATUS_BLINK)) && ((timer_mod % 300) < 50)) { status_led = 1; } else { status_led = 0; } } }