using PWM to control RGB LED for RedBear Demo
Fork of ChainableLED by
RGBLED.cpp@1:20c17c26e479, 2016-04-28 (annotated)
- Committer:
- Jackson_lv
- Date:
- Thu Apr 28 08:51:39 2016 +0000
- Revision:
- 1:20c17c26e479
PWM RGB LED
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jackson_lv | 1:20c17c26e479 | 1 | /* |
Jackson_lv | 1:20c17c26e479 | 2 | * Copyright (C) 2013 Seeed Technology Inc. |
Jackson_lv | 1:20c17c26e479 | 3 | * Copyright (C) 2012 Paulo Marques (pjp.marques@gmail.com) |
Jackson_lv | 1:20c17c26e479 | 4 | * |
Jackson_lv | 1:20c17c26e479 | 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy of |
Jackson_lv | 1:20c17c26e479 | 6 | * this software and associated documentation files (the "Software"), to deal in |
Jackson_lv | 1:20c17c26e479 | 7 | * the Software without restriction, including without limitation the rights to |
Jackson_lv | 1:20c17c26e479 | 8 | * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
Jackson_lv | 1:20c17c26e479 | 9 | * the Software, and to permit persons to whom the Software is furnished to do so, |
Jackson_lv | 1:20c17c26e479 | 10 | * subject to the following conditions: |
Jackson_lv | 1:20c17c26e479 | 11 | * |
Jackson_lv | 1:20c17c26e479 | 12 | * The above copyright notice and this permission notice shall be included in all |
Jackson_lv | 1:20c17c26e479 | 13 | * copies or substantial portions of the Software. |
Jackson_lv | 1:20c17c26e479 | 14 | * |
Jackson_lv | 1:20c17c26e479 | 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
Jackson_lv | 1:20c17c26e479 | 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
Jackson_lv | 1:20c17c26e479 | 17 | * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
Jackson_lv | 1:20c17c26e479 | 18 | * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
Jackson_lv | 1:20c17c26e479 | 19 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
Jackson_lv | 1:20c17c26e479 | 20 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
Jackson_lv | 1:20c17c26e479 | 21 | */ |
Jackson_lv | 1:20c17c26e479 | 22 | |
Jackson_lv | 1:20c17c26e479 | 23 | /* Information about the P9813 protocol obtained from: |
Jackson_lv | 1:20c17c26e479 | 24 | * http://www.seeedstudio.com/wiki/index.php?title=Twig_-_Chainable_RGB_LED |
Jackson_lv | 1:20c17c26e479 | 25 | * |
Jackson_lv | 1:20c17c26e479 | 26 | * HSB to RGB routine adapted from: |
Jackson_lv | 1:20c17c26e479 | 27 | * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript |
Jackson_lv | 1:20c17c26e479 | 28 | * |
Jackson_lv | 1:20c17c26e479 | 29 | * This library is ported from Arduino to mbed |
Jackson_lv | 1:20c17c26e479 | 30 | */ |
Jackson_lv | 1:20c17c26e479 | 31 | |
Jackson_lv | 1:20c17c26e479 | 32 | |
Jackson_lv | 1:20c17c26e479 | 33 | // -------------------------------------------------------------------------------------- |
Jackson_lv | 1:20c17c26e479 | 34 | |
Jackson_lv | 1:20c17c26e479 | 35 | #include "RGBLED.h" |
Jackson_lv | 1:20c17c26e479 | 36 | |
Jackson_lv | 1:20c17c26e479 | 37 | // Forward declaration |
Jackson_lv | 1:20c17c26e479 | 38 | float hue2rgb(float p, float q, float t); |
Jackson_lv | 1:20c17c26e479 | 39 | PwmOut PWMR(P0_11); |
Jackson_lv | 1:20c17c26e479 | 40 | PwmOut PWMG(P0_9); |
Jackson_lv | 1:20c17c26e479 | 41 | PwmOut PWMB(P0_10); |
Jackson_lv | 1:20c17c26e479 | 42 | // -------------------------------------------------------------------------------------- |
Jackson_lv | 1:20c17c26e479 | 43 | |
Jackson_lv | 1:20c17c26e479 | 44 | ChainableLED::ChainableLED(PinName r_pin, PinName g_pin, PinName b_pin,unsigned int number_of_leds) : |
Jackson_lv | 1:20c17c26e479 | 45 | _r_pin(r_pin), _g_pin(g_pin),_b_pin(b_pin) |
Jackson_lv | 1:20c17c26e479 | 46 | { |
Jackson_lv | 1:20c17c26e479 | 47 | _num_leds = number_of_leds; |
Jackson_lv | 1:20c17c26e479 | 48 | |
Jackson_lv | 1:20c17c26e479 | 49 | |
Jackson_lv | 1:20c17c26e479 | 50 | for (uint8_t i=0; i<_num_leds; i++) |
Jackson_lv | 1:20c17c26e479 | 51 | setColorRGB(i, 0, 0, 0); |
Jackson_lv | 1:20c17c26e479 | 52 | } |
Jackson_lv | 1:20c17c26e479 | 53 | |
Jackson_lv | 1:20c17c26e479 | 54 | ChainableLED::~ChainableLED() |
Jackson_lv | 1:20c17c26e479 | 55 | { |
Jackson_lv | 1:20c17c26e479 | 56 | } |
Jackson_lv | 1:20c17c26e479 | 57 | |
Jackson_lv | 1:20c17c26e479 | 58 | // -------------------------------------------------------------------------------------- |
Jackson_lv | 1:20c17c26e479 | 59 | |
Jackson_lv | 1:20c17c26e479 | 60 | |
Jackson_lv | 1:20c17c26e479 | 61 | |
Jackson_lv | 1:20c17c26e479 | 62 | void ChainableLED::sendColor(uint8_t red, uint8_t green, uint8_t blue) |
Jackson_lv | 1:20c17c26e479 | 63 | { |
Jackson_lv | 1:20c17c26e479 | 64 | //control the RGB LED by PWM |
Jackson_lv | 1:20c17c26e479 | 65 | PWMR = (float)red/255; |
Jackson_lv | 1:20c17c26e479 | 66 | PWMG = (float)green/255; |
Jackson_lv | 1:20c17c26e479 | 67 | PWMB = (float)blue/255; |
Jackson_lv | 1:20c17c26e479 | 68 | |
Jackson_lv | 1:20c17c26e479 | 69 | } |
Jackson_lv | 1:20c17c26e479 | 70 | |
Jackson_lv | 1:20c17c26e479 | 71 | void ChainableLED::setColorRGB(unsigned int led, float red, float green, float blue) |
Jackson_lv | 1:20c17c26e479 | 72 | { |
Jackson_lv | 1:20c17c26e479 | 73 | sendColor(0xff-red, 0xff-green, 0xff-blue ); |
Jackson_lv | 1:20c17c26e479 | 74 | } |
Jackson_lv | 1:20c17c26e479 | 75 | |
Jackson_lv | 1:20c17c26e479 | 76 | void ChainableLED::setColorHSB(unsigned int led, float hue, float saturation, float brightness) |
Jackson_lv | 1:20c17c26e479 | 77 | { |
Jackson_lv | 1:20c17c26e479 | 78 | float r, g, b; |
Jackson_lv | 1:20c17c26e479 | 79 | |
Jackson_lv | 1:20c17c26e479 | 80 | if(saturation == 0.0) |
Jackson_lv | 1:20c17c26e479 | 81 | { |
Jackson_lv | 1:20c17c26e479 | 82 | r = g = b = brightness; |
Jackson_lv | 1:20c17c26e479 | 83 | } |
Jackson_lv | 1:20c17c26e479 | 84 | else |
Jackson_lv | 1:20c17c26e479 | 85 | { |
Jackson_lv | 1:20c17c26e479 | 86 | float q = brightness < 0.5 ? |
Jackson_lv | 1:20c17c26e479 | 87 | brightness * (1.0 + saturation) : brightness + saturation - brightness * saturation; |
Jackson_lv | 1:20c17c26e479 | 88 | float p = 2.0 * brightness - q; |
Jackson_lv | 1:20c17c26e479 | 89 | r = hue2rgb(p, q, hue + 1.0/3.0); |
Jackson_lv | 1:20c17c26e479 | 90 | g = hue2rgb(p, q, hue); |
Jackson_lv | 1:20c17c26e479 | 91 | b = hue2rgb(p, q, hue - 1.0/3.0); |
Jackson_lv | 1:20c17c26e479 | 92 | } |
Jackson_lv | 1:20c17c26e479 | 93 | |
Jackson_lv | 1:20c17c26e479 | 94 | setColorRGB(led, (uint8_t)(255.0*r), (uint8_t)(255.0*g), (uint8_t)(255.0*b)); |
Jackson_lv | 1:20c17c26e479 | 95 | } |
Jackson_lv | 1:20c17c26e479 | 96 | |
Jackson_lv | 1:20c17c26e479 | 97 | // -------------------------------------------------------------------------------------- |
Jackson_lv | 1:20c17c26e479 | 98 | |
Jackson_lv | 1:20c17c26e479 | 99 | float hue2rgb(float p, float q, float t) |
Jackson_lv | 1:20c17c26e479 | 100 | { |
Jackson_lv | 1:20c17c26e479 | 101 | if (t < 0.0) |
Jackson_lv | 1:20c17c26e479 | 102 | t += 1.0; |
Jackson_lv | 1:20c17c26e479 | 103 | if(t > 1.0) |
Jackson_lv | 1:20c17c26e479 | 104 | t -= 1.0; |
Jackson_lv | 1:20c17c26e479 | 105 | if(t < 1.0/6.0) |
Jackson_lv | 1:20c17c26e479 | 106 | return p + (q - p) * 6.0 * t; |
Jackson_lv | 1:20c17c26e479 | 107 | if(t < 1.0/2.0) |
Jackson_lv | 1:20c17c26e479 | 108 | return q; |
Jackson_lv | 1:20c17c26e479 | 109 | if(t < 2.0/3.0) |
Jackson_lv | 1:20c17c26e479 | 110 | return p + (q - p) * (2.0/3.0 - t) * 6.0; |
Jackson_lv | 1:20c17c26e479 | 111 | |
Jackson_lv | 1:20c17c26e479 | 112 | return p; |
Jackson_lv | 1:20c17c26e479 | 113 | } |