test led strip
Fork of apa102 by
apa102.h@0:cd4bcb59e36e, 2015-01-27 (annotated)
- Committer:
- AlanRager
- Date:
- Tue Jan 27 17:33:01 2015 +0000
- Revision:
- 0:cd4bcb59e36e
First commit - this is heavily based on the ws2801 found here: https://developer.mbed.org/users/wertyfrog/code/ws2801/
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AlanRager | 0:cd4bcb59e36e | 1 | /* |
AlanRager | 0:cd4bcb59e36e | 2 | Copyright (c) 2011 Thomas Olsson. |
AlanRager | 0:cd4bcb59e36e | 3 | |
AlanRager | 0:cd4bcb59e36e | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy |
AlanRager | 0:cd4bcb59e36e | 5 | of this software and associated documentation files (the "Software"), to deal |
AlanRager | 0:cd4bcb59e36e | 6 | in the Software without restriction, including without limitation the rights |
AlanRager | 0:cd4bcb59e36e | 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
AlanRager | 0:cd4bcb59e36e | 8 | copies of the Software, and to permit persons to whom the Software is |
AlanRager | 0:cd4bcb59e36e | 9 | furnished to do so, subject to the following conditions: |
AlanRager | 0:cd4bcb59e36e | 10 | |
AlanRager | 0:cd4bcb59e36e | 11 | The above copyright notice and this permission notice shall be included in |
AlanRager | 0:cd4bcb59e36e | 12 | all copies or substantial portions of the Software. |
AlanRager | 0:cd4bcb59e36e | 13 | |
AlanRager | 0:cd4bcb59e36e | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
AlanRager | 0:cd4bcb59e36e | 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
AlanRager | 0:cd4bcb59e36e | 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
AlanRager | 0:cd4bcb59e36e | 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
AlanRager | 0:cd4bcb59e36e | 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
AlanRager | 0:cd4bcb59e36e | 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
AlanRager | 0:cd4bcb59e36e | 20 | THE SOFTWARE. |
AlanRager | 0:cd4bcb59e36e | 21 | */ |
AlanRager | 0:cd4bcb59e36e | 22 | |
AlanRager | 0:cd4bcb59e36e | 23 | #ifndef APA102_H |
AlanRager | 0:cd4bcb59e36e | 24 | #define APA102_H |
AlanRager | 0:cd4bcb59e36e | 25 | |
AlanRager | 0:cd4bcb59e36e | 26 | #include "mbed.h" |
AlanRager | 0:cd4bcb59e36e | 27 | #include "HTML_color.h" |
AlanRager | 0:cd4bcb59e36e | 28 | |
AlanRager | 0:cd4bcb59e36e | 29 | #define APA102_MAX_LEVEL 100 |
AlanRager | 0:cd4bcb59e36e | 30 | |
AlanRager | 0:cd4bcb59e36e | 31 | /** APA102 class, controlling LED strips or arrays like this http://www.sparkfun.com/products/10312 |
AlanRager | 0:cd4bcb59e36e | 32 | * |
AlanRager | 0:cd4bcb59e36e | 33 | * the APA102 IC's are 5V but works well connected directly to mbed IO pins. |
AlanRager | 0:cd4bcb59e36e | 34 | * |
AlanRager | 0:cd4bcb59e36e | 35 | * You need a 5V power supply capable of about 2A to light up a 32 led strip, do NOT power from mbed(usb). |
AlanRager | 0:cd4bcb59e36e | 36 | * |
AlanRager | 0:cd4bcb59e36e | 37 | * the required reset delay is a blocking wait(), it can be lowered (or set to 0) if you want to use the |
AlanRager | 0:cd4bcb59e36e | 38 | * time for executing code instead, data sheet says 500us but i found it need at least 800us. |
AlanRager | 0:cd4bcb59e36e | 39 | * |
AlanRager | 0:cd4bcb59e36e | 40 | * Example: |
AlanRager | 0:cd4bcb59e36e | 41 | * @code |
AlanRager | 0:cd4bcb59e36e | 42 | #include "mbed.h" |
AlanRager | 0:cd4bcb59e36e | 43 | #include "apa102.h" |
AlanRager | 0:cd4bcb59e36e | 44 | |
AlanRager | 0:cd4bcb59e36e | 45 | #define STRIP_LENGTH 32 |
AlanRager | 0:cd4bcb59e36e | 46 | |
AlanRager | 0:cd4bcb59e36e | 47 | apa102 mystrip(p9, p10, STRIP_LENGTH); |
AlanRager | 0:cd4bcb59e36e | 48 | |
AlanRager | 0:cd4bcb59e36e | 49 | int dir=1, level=10; |
AlanRager | 0:cd4bcb59e36e | 50 | int rainbow[] = {0xff00ff,0xff00cc,0xff0099,0xff0066,0xff0033,0xff0000,0xff3300,0xff6600, |
AlanRager | 0:cd4bcb59e36e | 51 | 0xff9900,0xffcc00,0xffff00,0xccff00,0x99ff00,0x66ff00,0x33ff00,0x00ff00, |
AlanRager | 0:cd4bcb59e36e | 52 | 0x00ff33,0x00ff66,0x00ff99,0x00ffcc,0x00ffff,0x00ccff,0x0099ff,0x0066ff, |
AlanRager | 0:cd4bcb59e36e | 53 | 0x0033ff,0x0000ff,0x3300ff,0x6600ff,0x9900ff,0xcc00ff,0x9900ff,0x6600ff |
AlanRager | 0:cd4bcb59e36e | 54 | }; |
AlanRager | 0:cd4bcb59e36e | 55 | |
AlanRager | 0:cd4bcb59e36e | 56 | void move(void){ |
AlanRager | 0:cd4bcb59e36e | 57 | int temp = rainbow[31]; |
AlanRager | 0:cd4bcb59e36e | 58 | for (int x = (STRIP_LENGTH - 1) ; x > 0 ; x--) rainbow[x] = rainbow[x - 1]; |
AlanRager | 0:cd4bcb59e36e | 59 | rainbow[0] = temp; |
AlanRager | 0:cd4bcb59e36e | 60 | } |
AlanRager | 0:cd4bcb59e36e | 61 | |
AlanRager | 0:cd4bcb59e36e | 62 | void pulse(void){ |
AlanRager | 0:cd4bcb59e36e | 63 | if(dir) |
AlanRager | 0:cd4bcb59e36e | 64 | { |
AlanRager | 0:cd4bcb59e36e | 65 | mystrip.level(level+=2); |
AlanRager | 0:cd4bcb59e36e | 66 | if(level >= 100)dir = 0; |
AlanRager | 0:cd4bcb59e36e | 67 | } |
AlanRager | 0:cd4bcb59e36e | 68 | else if(!dir) |
AlanRager | 0:cd4bcb59e36e | 69 | { |
AlanRager | 0:cd4bcb59e36e | 70 | mystrip.level(level--); |
AlanRager | 0:cd4bcb59e36e | 71 | if(level <= 5)dir = 1; |
AlanRager | 0:cd4bcb59e36e | 72 | } |
AlanRager | 0:cd4bcb59e36e | 73 | } |
AlanRager | 0:cd4bcb59e36e | 74 | |
AlanRager | 0:cd4bcb59e36e | 75 | int main() { |
AlanRager | 0:cd4bcb59e36e | 76 | mystrip.level(level); |
AlanRager | 0:cd4bcb59e36e | 77 | while(1) |
AlanRager | 0:cd4bcb59e36e | 78 | { |
AlanRager | 0:cd4bcb59e36e | 79 | move(); |
AlanRager | 0:cd4bcb59e36e | 80 | pulse(); |
AlanRager | 0:cd4bcb59e36e | 81 | mystrip.post(rainbow); |
AlanRager | 0:cd4bcb59e36e | 82 | wait_ms(100); |
AlanRager | 0:cd4bcb59e36e | 83 | } |
AlanRager | 0:cd4bcb59e36e | 84 | } |
AlanRager | 0:cd4bcb59e36e | 85 | * @endcode |
AlanRager | 0:cd4bcb59e36e | 86 | */ |
AlanRager | 0:cd4bcb59e36e | 87 | class apa102 |
AlanRager | 0:cd4bcb59e36e | 88 | { |
AlanRager | 0:cd4bcb59e36e | 89 | public: |
AlanRager | 0:cd4bcb59e36e | 90 | /** Create a new apa102 object |
AlanRager | 0:cd4bcb59e36e | 91 | * |
AlanRager | 0:cd4bcb59e36e | 92 | * |
AlanRager | 0:cd4bcb59e36e | 93 | * @param CKI clock pin |
AlanRager | 0:cd4bcb59e36e | 94 | * @param SDI data pin |
AlanRager | 0:cd4bcb59e36e | 95 | * @param STRIP_LENGTH number of apa102 IC's i strip or array defaults to 32 |
AlanRager | 0:cd4bcb59e36e | 96 | * @param reset_delay delay in us to allow latching data defaults to 800 |
AlanRager | 0:cd4bcb59e36e | 97 | * @returns nothing |
AlanRager | 0:cd4bcb59e36e | 98 | */ |
AlanRager | 0:cd4bcb59e36e | 99 | apa102(PinName CKI, PinName SDI, int STRIP_LENGTH = 32, int reset_delay = 800); |
AlanRager | 0:cd4bcb59e36e | 100 | /** write RGB color data to strip or array |
AlanRager | 0:cd4bcb59e36e | 101 | * |
AlanRager | 0:cd4bcb59e36e | 102 | * color data for each LED is 3 bytes int the order of rrggbb. |
AlanRager | 0:cd4bcb59e36e | 103 | * array must have STRIP_LENGTH number of elements |
AlanRager | 0:cd4bcb59e36e | 104 | * |
AlanRager | 0:cd4bcb59e36e | 105 | * @param strip_colors array of color data |
AlanRager | 0:cd4bcb59e36e | 106 | */ |
AlanRager | 0:cd4bcb59e36e | 107 | void post(int *strip_colors); |
AlanRager | 0:cd4bcb59e36e | 108 | /** clears the array or strip (all off) |
AlanRager | 0:cd4bcb59e36e | 109 | */ |
AlanRager | 0:cd4bcb59e36e | 110 | void clear(void); |
AlanRager | 0:cd4bcb59e36e | 111 | /** set level of the entire array 0-100% |
AlanRager | 0:cd4bcb59e36e | 112 | * |
AlanRager | 0:cd4bcb59e36e | 113 | * at low levels the colors may change because R,G or B |
AlanRager | 0:cd4bcb59e36e | 114 | * reaches 0. |
AlanRager | 0:cd4bcb59e36e | 115 | * |
AlanRager | 0:cd4bcb59e36e | 116 | * @param level level in percent |
AlanRager | 0:cd4bcb59e36e | 117 | * @returns current level |
AlanRager | 0:cd4bcb59e36e | 118 | */ |
AlanRager | 0:cd4bcb59e36e | 119 | int level(int level=0); |
AlanRager | 0:cd4bcb59e36e | 120 | /** get/set reset/write delay |
AlanRager | 0:cd4bcb59e36e | 121 | * |
AlanRager | 0:cd4bcb59e36e | 122 | * mainly for experimenting with reset values without recompiling, |
AlanRager | 0:cd4bcb59e36e | 123 | * leave at default to begin with & then lower to get faster execution. |
AlanRager | 0:cd4bcb59e36e | 124 | * |
AlanRager | 0:cd4bcb59e36e | 125 | * @param delay delay in us |
AlanRager | 0:cd4bcb59e36e | 126 | * @returns delay in us |
AlanRager | 0:cd4bcb59e36e | 127 | */ |
AlanRager | 0:cd4bcb59e36e | 128 | int delay(uint32_t reset_delay=100); |
AlanRager | 0:cd4bcb59e36e | 129 | |
AlanRager | 0:cd4bcb59e36e | 130 | private: |
AlanRager | 0:cd4bcb59e36e | 131 | DigitalOut _CKI; |
AlanRager | 0:cd4bcb59e36e | 132 | DigitalOut _SDI; |
AlanRager | 0:cd4bcb59e36e | 133 | int _STRIP_LENGTH; |
AlanRager | 0:cd4bcb59e36e | 134 | int _level; |
AlanRager | 0:cd4bcb59e36e | 135 | int _reset_delay; |
AlanRager | 0:cd4bcb59e36e | 136 | inline void write_hi(); |
AlanRager | 0:cd4bcb59e36e | 137 | inline void write_lo(); |
AlanRager | 0:cd4bcb59e36e | 138 | inline void write_bit(bool bit); |
AlanRager | 0:cd4bcb59e36e | 139 | inline void write_word(uint32_t word, int bits = 32); |
AlanRager | 0:cd4bcb59e36e | 140 | inline void write_done(); |
AlanRager | 0:cd4bcb59e36e | 141 | inline void preamble(); |
AlanRager | 0:cd4bcb59e36e | 142 | inline void afterword(); |
AlanRager | 0:cd4bcb59e36e | 143 | }; |
AlanRager | 0:cd4bcb59e36e | 144 | |
AlanRager | 0:cd4bcb59e36e | 145 | #endif |