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

Files at this revision

API Documentation at this revision

Comitter:
Fiuba
Date:
Wed Nov 25 23:18:51 2009 +0000
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 3b13b6c5de1f main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Nov 25 23:18:51 2009 +0000
@@ -0,0 +1,145 @@
+/* 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);
+    }
+}
diff -r 000000000000 -r 3b13b6c5de1f mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Nov 25 23:18:51 2009 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/32af5db564d4