A very simple demo program that makes the 4 leds on the board change their brightness using PWMs, in a semi random way.

Dependencies:   mbed

Committer:
Fiuba
Date:
Wed Nov 25 23:18:51 2009 +0000
Revision:
0:3b13b6c5de1f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Fiuba 0:3b13b6c5de1f 1 /* Codigo de ejemplo para probar los PWMs, Tickers, Timer...
Fiuba 0:3b13b6c5de1f 2 * La idea es prender los leds en forma "random" y que los leds cambien su intensidad
Fiuba 0:3b13b6c5de1f 3 * cambiando el duty del PWM que se les manda, simulando "estrellas".
Fiuba 0:3b13b6c5de1f 4 * El comportamiento random lo sacamos del valor de un timer al momento de la lectura. Probamos usar el ADC,
Fiuba 0:3b13b6c5de1f 5 * no logramos que varie.
Fiuba 0:3b13b6c5de1f 6 * El codigo tiene muchos valores "magicos" que salen de probar cosas para que el efecto "quede lindo".
Fiuba 0:3b13b6c5de1f 7 * Copiright Joaquin de Andres, Lucas Chiesa under the GNU GPL Version 2 or later.
Fiuba 0:3b13b6c5de1f 8 */
Fiuba 0:3b13b6c5de1f 9
Fiuba 0:3b13b6c5de1f 10 #include "mbed.h"
Fiuba 0:3b13b6c5de1f 11
Fiuba 0:3b13b6c5de1f 12 // Cramos un tipo para guardar el estado actual de cada led.
Fiuba 0:3b13b6c5de1f 13 // NOTA: APAGADO ahora no apaga los leds, sino que les baja el brillo mucho mas rapido porque sino quedaba feo.
Fiuba 0:3b13b6c5de1f 14 typedef enum {SUBIENDO, BAJANDO, APAGADO} led_status;
Fiuba 0:3b13b6c5de1f 15
Fiuba 0:3b13b6c5de1f 16 // Creamos los PWMs que vamos a usar para alimentar los LEDs.
Fiuba 0:3b13b6c5de1f 17 PwmOut led1(LED1);
Fiuba 0:3b13b6c5de1f 18 PwmOut led2(LED2);
Fiuba 0:3b13b6c5de1f 19 PwmOut led3(LED3);
Fiuba 0:3b13b6c5de1f 20 PwmOut led4(LED4);
Fiuba 0:3b13b6c5de1f 21
Fiuba 0:3b13b6c5de1f 22 // Creamos un timer.
Fiuba 0:3b13b6c5de1f 23 Timer t;
Fiuba 0:3b13b6c5de1f 24
Fiuba 0:3b13b6c5de1f 25 // Creamos 4 tickers, cada uno puede tener 1 solo callback.
Fiuba 0:3b13b6c5de1f 26 Ticker tick1;
Fiuba 0:3b13b6c5de1f 27 Ticker tick2;
Fiuba 0:3b13b6c5de1f 28 Ticker tick3;
Fiuba 0:3b13b6c5de1f 29 Ticker tick4;
Fiuba 0:3b13b6c5de1f 30
Fiuba 0:3b13b6c5de1f 31 led_status led1_status = SUBIENDO;
Fiuba 0:3b13b6c5de1f 32 led_status led2_status = BAJANDO;
Fiuba 0:3b13b6c5de1f 33 led_status led3_status = SUBIENDO;
Fiuba 0:3b13b6c5de1f 34 led_status led4_status = BAJANDO;
Fiuba 0:3b13b6c5de1f 35
Fiuba 0:3b13b6c5de1f 36 // Handlers para cambiar el PWM de cada led. Como se les pueden pasar argumentos, creamos una para cada uno.
Fiuba 0:3b13b6c5de1f 37 // Supongo que se podria ver alguna forma de reutilizar el codigo.
Fiuba 0:3b13b6c5de1f 38 void led1_tick() {
Fiuba 0:3b13b6c5de1f 39 switch (led1_status) {
Fiuba 0:3b13b6c5de1f 40 case SUBIENDO:
Fiuba 0:3b13b6c5de1f 41 led1 = (led1 < 1)? (led1 + 0.001) : led1;
Fiuba 0:3b13b6c5de1f 42 break;
Fiuba 0:3b13b6c5de1f 43 case BAJANDO:
Fiuba 0:3b13b6c5de1f 44 led1 = (led1 > 0.003)? (led1 - 0.003) : led1;
Fiuba 0:3b13b6c5de1f 45 break;
Fiuba 0:3b13b6c5de1f 46 case APAGADO:
Fiuba 0:3b13b6c5de1f 47 led1 = (led1 >= 0.01)? (led1 - 0.01) : led1;
Fiuba 0:3b13b6c5de1f 48 }
Fiuba 0:3b13b6c5de1f 49 }
Fiuba 0:3b13b6c5de1f 50
Fiuba 0:3b13b6c5de1f 51 void led2_tick() {
Fiuba 0:3b13b6c5de1f 52 switch (led2_status) {
Fiuba 0:3b13b6c5de1f 53 case SUBIENDO:
Fiuba 0:3b13b6c5de1f 54 led2 = (led2 < 1)? (led2 + 0.002) : led2;
Fiuba 0:3b13b6c5de1f 55 break;
Fiuba 0:3b13b6c5de1f 56 case BAJANDO:
Fiuba 0:3b13b6c5de1f 57 led2 = (led2 > 0.001)? (led2 - 0.001) : led2;
Fiuba 0:3b13b6c5de1f 58 break;
Fiuba 0:3b13b6c5de1f 59 case APAGADO:
Fiuba 0:3b13b6c5de1f 60 led2 = (led2 >= 0.01)? (led2 - 0.01) : led2;
Fiuba 0:3b13b6c5de1f 61 }
Fiuba 0:3b13b6c5de1f 62 }
Fiuba 0:3b13b6c5de1f 63
Fiuba 0:3b13b6c5de1f 64 void led3_tick() {
Fiuba 0:3b13b6c5de1f 65 switch (led3_status) {
Fiuba 0:3b13b6c5de1f 66 case SUBIENDO:
Fiuba 0:3b13b6c5de1f 67 led3 = (led3 < 1)? (led3 + 0.003) : led3;
Fiuba 0:3b13b6c5de1f 68 break;
Fiuba 0:3b13b6c5de1f 69 case BAJANDO:
Fiuba 0:3b13b6c5de1f 70 led3 = (led3 > 0.004)? (led3 - 0.004) : led3;
Fiuba 0:3b13b6c5de1f 71 break;
Fiuba 0:3b13b6c5de1f 72 case APAGADO:
Fiuba 0:3b13b6c5de1f 73 led3 = (led3 >= 0.01)? (led3 - 0.01) : led3;
Fiuba 0:3b13b6c5de1f 74 }
Fiuba 0:3b13b6c5de1f 75 }
Fiuba 0:3b13b6c5de1f 76
Fiuba 0:3b13b6c5de1f 77 void led4_tick() {
Fiuba 0:3b13b6c5de1f 78 switch (led4_status) {
Fiuba 0:3b13b6c5de1f 79 case SUBIENDO:
Fiuba 0:3b13b6c5de1f 80 led4 = (led4 < 1)? (led4 + 0.001) : led4;
Fiuba 0:3b13b6c5de1f 81 break;
Fiuba 0:3b13b6c5de1f 82 case BAJANDO:
Fiuba 0:3b13b6c5de1f 83 led4 = (led4 > 0.001)? (led4 - 0.001) : led4;
Fiuba 0:3b13b6c5de1f 84 break;
Fiuba 0:3b13b6c5de1f 85 case APAGADO:
Fiuba 0:3b13b6c5de1f 86 led4 = (led4 >= 0.01)? (led4 - 0.01) : led4;
Fiuba 0:3b13b6c5de1f 87 }
Fiuba 0:3b13b6c5de1f 88 }
Fiuba 0:3b13b6c5de1f 89
Fiuba 0:3b13b6c5de1f 90 // Esta funcion devuelve un estado segun la variable aux que se le pasa.
Fiuba 0:3b13b6c5de1f 91 led_status set_status (int aux) {
Fiuba 0:3b13b6c5de1f 92 if (aux == 0 ) {
Fiuba 0:3b13b6c5de1f 93 return SUBIENDO;
Fiuba 0:3b13b6c5de1f 94 } else if (aux == 1) {
Fiuba 0:3b13b6c5de1f 95 return BAJANDO;
Fiuba 0:3b13b6c5de1f 96 } else {
Fiuba 0:3b13b6c5de1f 97 return APAGADO;
Fiuba 0:3b13b6c5de1f 98 }
Fiuba 0:3b13b6c5de1f 99 }
Fiuba 0:3b13b6c5de1f 100
Fiuba 0:3b13b6c5de1f 101 int main() {
Fiuba 0:3b13b6c5de1f 102 // Condiciones iniciales distintas para cada led.
Fiuba 0:3b13b6c5de1f 103 led1 = 0;
Fiuba 0:3b13b6c5de1f 104 led2 = 0.5;
Fiuba 0:3b13b6c5de1f 105 led3 = 0.6;
Fiuba 0:3b13b6c5de1f 106 led4 = 1;
Fiuba 0:3b13b6c5de1f 107
Fiuba 0:3b13b6c5de1f 108 int aux;
Fiuba 0:3b13b6c5de1f 109
Fiuba 0:3b13b6c5de1f 110 // Hacemos que cada led cambie a distinta frecuencia, y sin que sean multiplos.
Fiuba 0:3b13b6c5de1f 111 tick1.attach(&led1_tick, 0.002);
Fiuba 0:3b13b6c5de1f 112 tick2.attach(&led2_tick, 0.005);
Fiuba 0:3b13b6c5de1f 113 tick3.attach(&led3_tick, 0.003);
Fiuba 0:3b13b6c5de1f 114 tick4.attach(&led4_tick, 0.001);
Fiuba 0:3b13b6c5de1f 115
Fiuba 0:3b13b6c5de1f 116 // No hay que olvidarse de iniciar el timer para que esto ande!!
Fiuba 0:3b13b6c5de1f 117 t.start();
Fiuba 0:3b13b6c5de1f 118 wait(0.2);
Fiuba 0:3b13b6c5de1f 119
Fiuba 0:3b13b6c5de1f 120 while (1) {
Fiuba 0:3b13b6c5de1f 121 // Para cada led, leemos el valor del timer (en distintas unidades),
Fiuba 0:3b13b6c5de1f 122 // le hacemos modulo 3, y eso lo usamos como valor "random" para cambiar el estado de los leds.
Fiuba 0:3b13b6c5de1f 123
Fiuba 0:3b13b6c5de1f 124 aux = t.read_us();
Fiuba 0:3b13b6c5de1f 125 aux = aux % 3;
Fiuba 0:3b13b6c5de1f 126 led1_status = set_status(aux);
Fiuba 0:3b13b6c5de1f 127 wait(0.001);
Fiuba 0:3b13b6c5de1f 128
Fiuba 0:3b13b6c5de1f 129 aux = t.read_us();
Fiuba 0:3b13b6c5de1f 130 aux = aux % 3;
Fiuba 0:3b13b6c5de1f 131 led2_status = set_status(aux);
Fiuba 0:3b13b6c5de1f 132 wait(0.002);
Fiuba 0:3b13b6c5de1f 133
Fiuba 0:3b13b6c5de1f 134 aux = t.read_us();
Fiuba 0:3b13b6c5de1f 135 aux = aux % 3;
Fiuba 0:3b13b6c5de1f 136 led3_status = set_status(aux);
Fiuba 0:3b13b6c5de1f 137 wait(0.005);
Fiuba 0:3b13b6c5de1f 138
Fiuba 0:3b13b6c5de1f 139 aux = t.read_us()-0.5;
Fiuba 0:3b13b6c5de1f 140 aux = aux % 3;
Fiuba 0:3b13b6c5de1f 141 led4_status = set_status(aux);
Fiuba 0:3b13b6c5de1f 142
Fiuba 0:3b13b6c5de1f 143 wait(1);
Fiuba 0:3b13b6c5de1f 144 }
Fiuba 0:3b13b6c5de1f 145 }