API for driving Adafruit's NeoPixels using RedBear's BLE Nano or BLE nRF51822

Dependencies:   BLE_API mbed nRF51822

Dependents:   RedBearNano_NeoPixels_Example NeoTester

Committer:
bickster
Date:
Thu Jul 09 01:06:35 2015 +0000
Revision:
0:bb19df120222
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bickster 0:bb19df120222 1 /* Lava
bickster 0:bb19df120222 2 *
bickster 0:bb19df120222 3 * WS2812B Tricolor LED (neopixel) controller
bickster 0:bb19df120222 4 *
bickster 0:bb19df120222 5 *
bickster 0:bb19df120222 6 * Example code:
bickster 0:bb19df120222 7
bickster 0:bb19df120222 8 neopixel_strip_t m_strip;
bickster 0:bb19df120222 9 uint8_t dig_pin_num = 6;
bickster 0:bb19df120222 10 uint8_t leds_per_strip = 24;
bickster 0:bb19df120222 11 uint8_t error;
bickster 0:bb19df120222 12 uint8_t led_to_enable = 10;
bickster 0:bb19df120222 13 uint8_t red = 255;
bickster 0:bb19df120222 14 uint8_t green = 0;
bickster 0:bb19df120222 15 uint8_t blue = 159;
bickster 0:bb19df120222 16
bickster 0:bb19df120222 17 neopixel_init(&m_strip, dig_pin_num, leds_per_strip);
bickster 0:bb19df120222 18 neopixel_clear(&m_strip);
bickster 0:bb19df120222 19 error = neopixel_set_color_and_show(&m_strip, led_to_enable, red, green, blue);
bickster 0:bb19df120222 20 if (error) {
bickster 0:bb19df120222 21 //led_to_enable was not within number leds_per_strip
bickster 0:bb19df120222 22 }
bickster 0:bb19df120222 23 //clear and remove strip
bickster 0:bb19df120222 24 neopixel_clear(&m_strip);
bickster 0:bb19df120222 25 neopixel_destroy(&m_strip);
bickster 0:bb19df120222 26
bickster 0:bb19df120222 27
bickster 0:bb19df120222 28 * For use with BLE stack, see information below:
bickster 0:bb19df120222 29 - Include in main.c
bickster 0:bb19df120222 30 #include "ble_radio_notification.h"
bickster 0:bb19df120222 31 - Call (see nrf_soc.h: NRF_RADIO_NOTIFICATION_DISTANCES and NRF_APP_PRIORITIES)
bickster 0:bb19df120222 32 ble_radio_notification_init(NRF_APP_PRIORITY_xxx,
bickster 0:bb19df120222 33 NRF_RADIO_NOTIFICATION_DISTANCE_xxx,
bickster 0:bb19df120222 34 your_radio_callback_handler);
bickster 0:bb19df120222 35 - Create
bickster 0:bb19df120222 36 void your_radio_callback_handler(bool radio_active)
bickster 0:bb19df120222 37 {
bickster 0:bb19df120222 38 if (radio_active == false)
bickster 0:bb19df120222 39 {
bickster 0:bb19df120222 40 neopixel_show(&strip1);
bickster 0:bb19df120222 41 neopixel_show(&strip2);
bickster 0:bb19df120222 42 //...etc
bickster 0:bb19df120222 43 }
bickster 0:bb19df120222 44 }
bickster 0:bb19df120222 45 - Do not use neopixel_set_color_and_show(...) with BLE, instead use uint8_t neopixel_set_color(...);
bickster 0:bb19df120222 46 */
bickster 0:bb19df120222 47
bickster 0:bb19df120222 48 #include "mbed.h" // remove line if not using mbed
bickster 0:bb19df120222 49
bickster 0:bb19df120222 50 #include <stdbool.h>
bickster 0:bb19df120222 51 #include <stdint.h>
bickster 0:bb19df120222 52 #include <stdlib.h>
bickster 0:bb19df120222 53 #include "nrf_delay.h"
bickster 0:bb19df120222 54 #include "nrf_gpio.h"
bickster 0:bb19df120222 55 #include "neopixel.h"
bickster 0:bb19df120222 56
bickster 0:bb19df120222 57
bickster 0:bb19df120222 58 void neopixel_init(neopixel_strip_t *strip, uint8_t pin_num, uint16_t num_leds)
bickster 0:bb19df120222 59 {
bickster 0:bb19df120222 60 strip->leds = (color_t*) malloc(sizeof(color_t) * num_leds);
bickster 0:bb19df120222 61 strip->pin_num = pin_num;
bickster 0:bb19df120222 62 strip->num_leds = num_leds;
bickster 0:bb19df120222 63 nrf_gpio_cfg_output(pin_num);
bickster 0:bb19df120222 64 NRF_GPIO->OUTCLR = (1UL << pin_num);
bickster 0:bb19df120222 65 for (int i = 0; i < num_leds; i++)
bickster 0:bb19df120222 66 {
bickster 0:bb19df120222 67 strip->leds[i].simple.g = 0;
bickster 0:bb19df120222 68 strip->leds[i].simple.r = 0;
bickster 0:bb19df120222 69 strip->leds[i].simple.b = 0;
bickster 0:bb19df120222 70 }
bickster 0:bb19df120222 71 }
bickster 0:bb19df120222 72
bickster 0:bb19df120222 73 void neopixel_clear(neopixel_strip_t *strip)
bickster 0:bb19df120222 74 {
bickster 0:bb19df120222 75 for (int i = 0; i < strip->num_leds; i++)
bickster 0:bb19df120222 76 {
bickster 0:bb19df120222 77 strip->leds[i].simple.g = 0;
bickster 0:bb19df120222 78 strip->leds[i].simple.r = 0;
bickster 0:bb19df120222 79 strip->leds[i].simple.b = 0;
bickster 0:bb19df120222 80 }
bickster 0:bb19df120222 81 neopixel_show(strip);
bickster 0:bb19df120222 82 }
bickster 0:bb19df120222 83
bickster 0:bb19df120222 84 void neopixel_show(neopixel_strip_t *strip)
bickster 0:bb19df120222 85 {
bickster 0:bb19df120222 86 const uint8_t PIN = strip->pin_num;
bickster 0:bb19df120222 87 NRF_GPIO->OUTCLR = (1UL << PIN);
bickster 0:bb19df120222 88 nrf_delay_us(50);
bickster 0:bb19df120222 89 for (int i = 0; i < strip->num_leds; i++)
bickster 0:bb19df120222 90 {
bickster 0:bb19df120222 91 for (int j = 0; j < 3; j++)
bickster 0:bb19df120222 92 {
bickster 0:bb19df120222 93 if ((strip->leds[i].grb[j] & 128) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 94 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 95
bickster 0:bb19df120222 96 if ((strip->leds[i].grb[j] & 64) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 97 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 98
bickster 0:bb19df120222 99 if ((strip->leds[i].grb[j] & 32) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 100 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 101
bickster 0:bb19df120222 102 if ((strip->leds[i].grb[j] & 16) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 103 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 104
bickster 0:bb19df120222 105 if ((strip->leds[i].grb[j] & 8) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 106 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 107
bickster 0:bb19df120222 108 if ((strip->leds[i].grb[j] & 4) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 109 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 110
bickster 0:bb19df120222 111 if ((strip->leds[i].grb[j] & 2) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 112 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 113
bickster 0:bb19df120222 114 if ((strip->leds[i].grb[j] & 1) > 0) {NEOPIXEL_SEND_ONE}
bickster 0:bb19df120222 115 else {NEOPIXEL_SEND_ZERO}
bickster 0:bb19df120222 116 }
bickster 0:bb19df120222 117 }
bickster 0:bb19df120222 118 }
bickster 0:bb19df120222 119
bickster 0:bb19df120222 120 uint8_t neopixel_set_color(neopixel_strip_t *strip, uint16_t index, uint8_t red, uint8_t green, uint8_t blue )
bickster 0:bb19df120222 121 {
bickster 0:bb19df120222 122 if (index < strip->num_leds)
bickster 0:bb19df120222 123 {
bickster 0:bb19df120222 124 strip->leds[index].simple.r = red;
bickster 0:bb19df120222 125 strip->leds[index].simple.g = green;
bickster 0:bb19df120222 126 strip->leds[index].simple.b = blue;
bickster 0:bb19df120222 127 }
bickster 0:bb19df120222 128 else
bickster 0:bb19df120222 129 return 1;
bickster 0:bb19df120222 130 return 0;
bickster 0:bb19df120222 131 }
bickster 0:bb19df120222 132
bickster 0:bb19df120222 133 uint8_t neopixel_set_color_and_show(neopixel_strip_t *strip, uint16_t index, uint8_t red, uint8_t green, uint8_t blue)
bickster 0:bb19df120222 134 {
bickster 0:bb19df120222 135 if (index < strip->num_leds)
bickster 0:bb19df120222 136 {
bickster 0:bb19df120222 137 strip->leds[index].simple.r = red;
bickster 0:bb19df120222 138 strip->leds[index].simple.g = green;
bickster 0:bb19df120222 139 strip->leds[index].simple.b = blue;
bickster 0:bb19df120222 140 neopixel_show(strip);
bickster 0:bb19df120222 141 }
bickster 0:bb19df120222 142 else
bickster 0:bb19df120222 143 return 1;
bickster 0:bb19df120222 144 return 0;
bickster 0:bb19df120222 145 }
bickster 0:bb19df120222 146
bickster 0:bb19df120222 147 void neopixel_destroy(neopixel_strip_t *strip)
bickster 0:bb19df120222 148 {
bickster 0:bb19df120222 149 free(strip->leds);
bickster 0:bb19df120222 150 strip->num_leds = 0;
bickster 0:bb19df120222 151 strip->pin_num = 0;
bickster 0:bb19df120222 152 }
bickster 0:bb19df120222 153 /*
bickster 0:bb19df120222 154 int main() {
bickster 0:bb19df120222 155 DigitalOut mypin(D4);
bickster 0:bb19df120222 156 neopixel_strip_t m_strip;
bickster 0:bb19df120222 157 uint8_t dig_pin_num = P0_21;
bickster 0:bb19df120222 158 uint8_t leds_per_strip = 30;
bickster 0:bb19df120222 159 uint8_t error;
bickster 0:bb19df120222 160 uint8_t led_to_enable = 30;
bickster 0:bb19df120222 161 uint8_t red = 0;
bickster 0:bb19df120222 162 uint8_t green = 128;
bickster 0:bb19df120222 163 uint8_t blue = 128;
bickster 0:bb19df120222 164
bickster 0:bb19df120222 165 neopixel_init(&m_strip, dig_pin_num, leds_per_strip);
bickster 0:bb19df120222 166 neopixel_clear(&m_strip);
bickster 0:bb19df120222 167 //error = neopixel_set_color_and_show(&m_strip, led_to_enable, red, green, blue);
bickster 0:bb19df120222 168 for (int cv=0; cv < 60; cv++) {
bickster 0:bb19df120222 169
bickster 0:bb19df120222 170 neopixel_set_color_and_show(&m_strip, cv, red, green, blue);
bickster 0:bb19df120222 171 wait_ms(500);
bickster 0:bb19df120222 172 }
bickster 0:bb19df120222 173
bickster 0:bb19df120222 174 if (error) {
bickster 0:bb19df120222 175 //led_to_enable was not within number leds_per_strip
bickster 0:bb19df120222 176 }
bickster 0:bb19df120222 177
bickster 0:bb19df120222 178 //error = neopixel_set_color_and_show(&m_strip, 1, red, green, blue);
bickster 0:bb19df120222 179 while (1) {
bickster 0:bb19df120222 180 wait_ms(500);
bickster 0:bb19df120222 181 }
bickster 0:bb19df120222 182 //clear and remove strip
bickster 0:bb19df120222 183 //neopixel_clear(&m_strip);
bickster 0:bb19df120222 184 //neopixel_destroy(&m_strip);
bickster 0:bb19df120222 185 }
bickster 0:bb19df120222 186 */