LED effects demo for LPC1768 using version 5 RTOS Details at https://os.mbed.com/users/4180_1/notebook/led-lighting-effects-for-modelers/ - NOTE: Requires firmware update for proper wait times

Committer:
4180_1
Date:
Fri Sep 06 12:42:09 2019 +0000
Revision:
0:4087d19c8e7b
ver 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
4180_1 0:4087d19c8e7b 1 #include "mbed.h"
4180_1 0:4087d19c8e7b 2 //LED effects demo using RTOS, threads, and built-in LEDs
4180_1 0:4087d19c8e7b 3 // info at https://os.mbed.com/users/4180_1/notebook/led-lighting-effects-for-modelers/
4180_1 0:4087d19c8e7b 4 // NOTE: waits will take too long unless firmware is upgraded on LPC1768 board
4180_1 0:4087d19c8e7b 5 // See https://os.mbed.com/handbook/Firmware-LPC1768-LPC11U24
4180_1 0:4087d19c8e7b 6 Thread thread1, thread2, thread3;
4180_1 0:4087d19c8e7b 7 DigitalOut myled(LED1);
4180_1 0:4087d19c8e7b 8 PwmOut myled2(LED2);
4180_1 0:4087d19c8e7b 9 PwmOut myled3(LED3);
4180_1 0:4087d19c8e7b 10 PwmOut myled4(LED4);
4180_1 0:4087d19c8e7b 11
4180_1 0:4087d19c8e7b 12 inline float random_number()
4180_1 0:4087d19c8e7b 13 {
4180_1 0:4087d19c8e7b 14 return (rand()/(float(RAND_MAX)));
4180_1 0:4087d19c8e7b 15 }
4180_1 0:4087d19c8e7b 16
4180_1 0:4087d19c8e7b 17 void beacon()
4180_1 0:4087d19c8e7b 18 {
4180_1 0:4087d19c8e7b 19 while(1) {
4180_1 0:4087d19c8e7b 20 //LED warm up effect using PWM
4180_1 0:4087d19c8e7b 21 for(int i=0; i<50; i++) {
4180_1 0:4087d19c8e7b 22 myled2 = i/50.0;
4180_1 0:4087d19c8e7b 23 wait(0.02);
4180_1 0:4087d19c8e7b 24 }
4180_1 0:4087d19c8e7b 25 //LED at full brightness level
4180_1 0:4087d19c8e7b 26 myled2 = 1.0;
4180_1 0:4087d19c8e7b 27 wait(0.25);
4180_1 0:4087d19c8e7b 28 //LED cool down effect using PWM
4180_1 0:4087d19c8e7b 29 for(int i=49; i>0; i--) {
4180_1 0:4087d19c8e7b 30 myled2 = i/50.0;
4180_1 0:4087d19c8e7b 31 wait(0.02);
4180_1 0:4087d19c8e7b 32 }
4180_1 0:4087d19c8e7b 33 //LED off
4180_1 0:4087d19c8e7b 34 myled2 = 0.0;
4180_1 0:4087d19c8e7b 35 wait(1.5);
4180_1 0:4087d19c8e7b 36 }
4180_1 0:4087d19c8e7b 37 }
4180_1 0:4087d19c8e7b 38 void welding()
4180_1 0:4087d19c8e7b 39 {
4180_1 0:4087d19c8e7b 40 float x = 0.0;
4180_1 0:4087d19c8e7b 41
4180_1 0:4087d19c8e7b 42 while(1) {
4180_1 0:4087d19c8e7b 43 //get a new random number for PWM
4180_1 0:4087d19c8e7b 44 x = random_number();
4180_1 0:4087d19c8e7b 45 //add some exponential brightness scaling
4180_1 0:4087d19c8e7b 46 //for more of a fast flash effect
4180_1 0:4087d19c8e7b 47 myled3 = x*x*x;
4180_1 0:4087d19c8e7b 48 //fast update rate for welding flashes
4180_1 0:4087d19c8e7b 49 wait(0.02);
4180_1 0:4087d19c8e7b 50 //add a random pause between welds
4180_1 0:4087d19c8e7b 51 if (random_number()>0.9925) {
4180_1 0:4087d19c8e7b 52 myled3 = 0.0;
4180_1 0:4087d19c8e7b 53 wait(4.0*random_number());
4180_1 0:4087d19c8e7b 54 }
4180_1 0:4087d19c8e7b 55 }
4180_1 0:4087d19c8e7b 56 }
4180_1 0:4087d19c8e7b 57
4180_1 0:4087d19c8e7b 58 void lighthouse()
4180_1 0:4087d19c8e7b 59 {
4180_1 0:4087d19c8e7b 60 float y=0.0;
4180_1 0:4087d19c8e7b 61
4180_1 0:4087d19c8e7b 62 while(1) {
4180_1 0:4087d19c8e7b 63 for(double x=0.0; x <= 3.14159; x = x + 0.0314159) {
4180_1 0:4087d19c8e7b 64 y = sin(x); //nice periodic function 0..1..0
4180_1 0:4087d19c8e7b 65 myled4 = y*y*y;//exponential effect - needs a sharp peak
4180_1 0:4087d19c8e7b 66 wait(.025);
4180_1 0:4087d19c8e7b 67 }
4180_1 0:4087d19c8e7b 68 myled4 = 0.0;
4180_1 0:4087d19c8e7b 69 //most lighthouses have a 5 second delay - so add another 2.5
4180_1 0:4087d19c8e7b 70 wait(2.5);
4180_1 0:4087d19c8e7b 71 }
4180_1 0:4087d19c8e7b 72 }
4180_1 0:4087d19c8e7b 73
4180_1 0:4087d19c8e7b 74 int main()
4180_1 0:4087d19c8e7b 75 {
4180_1 0:4087d19c8e7b 76 myled2.period(1.0/10000.0);
4180_1 0:4087d19c8e7b 77 myled3.period(1.0/10000.0);
4180_1 0:4087d19c8e7b 78 myled4.period(1.0/10000.0);
4180_1 0:4087d19c8e7b 79 sleep_manager_lock_deep_sleep(); //lock out all 10ms deep sleep delays
4180_1 0:4087d19c8e7b 80 thread1.start(callback(beacon));
4180_1 0:4087d19c8e7b 81 thread2.start(callback(welding));
4180_1 0:4087d19c8e7b 82 thread3.start(callback(lighthouse));
4180_1 0:4087d19c8e7b 83 //main runs standard LED blink demo
4180_1 0:4087d19c8e7b 84 while(1) {
4180_1 0:4087d19c8e7b 85 myled = 1;
4180_1 0:4087d19c8e7b 86 wait(0.2);
4180_1 0:4087d19c8e7b 87 myled = 0;
4180_1 0:4087d19c8e7b 88 wait(0.2);
4180_1 0:4087d19c8e7b 89 }
4180_1 0:4087d19c8e7b 90 }