A very simple demo program that makes the 4 leds on the board change their brightness using PWMs, in a semi random way.
main.cpp
- Committer:
- Fiuba
- Date:
- 2009-11-25
- Revision:
- 0:3b13b6c5de1f
File content as of revision 0:3b13b6c5de1f:
/* Codigo de ejemplo para probar los PWMs, Tickers, Timer... * La idea es prender los leds en forma "random" y que los leds cambien su intensidad * cambiando el duty del PWM que se les manda, simulando "estrellas". * El comportamiento random lo sacamos del valor de un timer al momento de la lectura. Probamos usar el ADC, * no logramos que varie. * El codigo tiene muchos valores "magicos" que salen de probar cosas para que el efecto "quede lindo". * Copiright Joaquin de Andres, Lucas Chiesa under the GNU GPL Version 2 or later. */ #include "mbed.h" // Cramos un tipo para guardar el estado actual de cada led. // NOTA: APAGADO ahora no apaga los leds, sino que les baja el brillo mucho mas rapido porque sino quedaba feo. typedef enum {SUBIENDO, BAJANDO, APAGADO} led_status; // Creamos los PWMs que vamos a usar para alimentar los LEDs. PwmOut led1(LED1); PwmOut led2(LED2); PwmOut led3(LED3); PwmOut led4(LED4); // Creamos un timer. Timer t; // Creamos 4 tickers, cada uno puede tener 1 solo callback. Ticker tick1; Ticker tick2; Ticker tick3; Ticker tick4; led_status led1_status = SUBIENDO; led_status led2_status = BAJANDO; led_status led3_status = SUBIENDO; led_status led4_status = BAJANDO; // Handlers para cambiar el PWM de cada led. Como se les pueden pasar argumentos, creamos una para cada uno. // Supongo que se podria ver alguna forma de reutilizar el codigo. void led1_tick() { switch (led1_status) { case SUBIENDO: led1 = (led1 < 1)? (led1 + 0.001) : led1; break; case BAJANDO: led1 = (led1 > 0.003)? (led1 - 0.003) : led1; break; case APAGADO: led1 = (led1 >= 0.01)? (led1 - 0.01) : led1; } } void led2_tick() { switch (led2_status) { case SUBIENDO: led2 = (led2 < 1)? (led2 + 0.002) : led2; break; case BAJANDO: led2 = (led2 > 0.001)? (led2 - 0.001) : led2; break; case APAGADO: led2 = (led2 >= 0.01)? (led2 - 0.01) : led2; } } void led3_tick() { switch (led3_status) { case SUBIENDO: led3 = (led3 < 1)? (led3 + 0.003) : led3; break; case BAJANDO: led3 = (led3 > 0.004)? (led3 - 0.004) : led3; break; case APAGADO: led3 = (led3 >= 0.01)? (led3 - 0.01) : led3; } } void led4_tick() { switch (led4_status) { case SUBIENDO: led4 = (led4 < 1)? (led4 + 0.001) : led4; break; case BAJANDO: led4 = (led4 > 0.001)? (led4 - 0.001) : led4; break; case APAGADO: led4 = (led4 >= 0.01)? (led4 - 0.01) : led4; } } // Esta funcion devuelve un estado segun la variable aux que se le pasa. led_status set_status (int aux) { if (aux == 0 ) { return SUBIENDO; } else if (aux == 1) { return BAJANDO; } else { return APAGADO; } } int main() { // Condiciones iniciales distintas para cada led. led1 = 0; led2 = 0.5; led3 = 0.6; led4 = 1; int aux; // Hacemos que cada led cambie a distinta frecuencia, y sin que sean multiplos. tick1.attach(&led1_tick, 0.002); tick2.attach(&led2_tick, 0.005); tick3.attach(&led3_tick, 0.003); tick4.attach(&led4_tick, 0.001); // No hay que olvidarse de iniciar el timer para que esto ande!! t.start(); wait(0.2); while (1) { // Para cada led, leemos el valor del timer (en distintas unidades), // le hacemos modulo 3, y eso lo usamos como valor "random" para cambiar el estado de los leds. aux = t.read_us(); aux = aux % 3; led1_status = set_status(aux); wait(0.001); aux = t.read_us(); aux = aux % 3; led2_status = set_status(aux); wait(0.002); aux = t.read_us(); aux = aux % 3; led3_status = set_status(aux); wait(0.005); aux = t.read_us()-0.5; aux = aux % 3; led4_status = set_status(aux); wait(1); } }