A Smart LED stripe is a chain of connected digital LEDs (also referenced as NEOPIXEL) which can be individually controlled. The stripe in our lab equipment consists of eight RGB LEDs. There exist also other colour configurations such as RGBWW (Red+Green+Blue+Warm White+Cold White) or WWA (Warm White+Cold White+Amber). They are controlled with just one pin/GPIO. GPIO sends the digital signal to the first LED in a chain and the LED passes data to the next one, and so on.
The most common type of LED stripes is WS2812B (RGB). Initially LED Stripes were powered with 5V, but that limits the length of the chain up to some 1-2m (because of the voltage drop), so nowadays LED stripes powered with 12V and even 24V are getting more and more popular.
In this scenario, you will learn how to control a small LED RGB Stripe, composed of 8 Smart (Digital) LEDs with STM32 SoC.
Familiarise yourself with a hardware reference on the LED Stripe. It is controlled with a single GPIO (D8 in Arduino style naming, or PC_12 in Nucleo style naming), as presented in the “Table 1: STM32WB55 Node Hardware Details” on the hardware reference page. To control a WS2812B LED stipe, we will use a library:
adafruit/Adafruit NeoPixel@^1.12.0
There are at least two ways (algorithms) to implement this task:
delay(…);
) function calls in the void loop();
or,Implement a rainbow of colours flowing through the LED Stripe.
When booking a device, ensure the LED stripe is visible in the camera.
Below, we provide a sample colour configuration that does not reflect the desired effect that should result from the exercise. It is just for instructional purposes. You need to invent how to implement a rainbow effect yourself.
Include necessary library:
#include "Adafruit_NeoPixel.h"
Declare configuration and a controller class:
#define NEOPIXEL_PIN D8 //Arduino numbering D8, STM numbering PC_12 #define NUMPIXELS 8 //How many LEDs are attached Adafruit_NeoPixel strip(NUMPIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);
The strip class definition contains the number of pixels, the pin for transmission, and the type of LEDs. In our laboratory LEDs use Green Red Blue format of data and 800kHz data transmission frequency.
To switch a particular LED, use the function setPixelColor();
. It accepts parameters of different types.
void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b); void setPixelColor(uint16_t n, uint32_t c);
If you use the first version you give the LED number as the first parameter and then three colour values for red, green and blue colour intensity as the number in the 0-255 range.
If you use the second version you give the LED number as the first parameter and a 32-bit version of the colour information. To convert three RGB bytes to 32-bit value you can use the function Color();
:
static uint32_t Color(uint8_t r, uint8_t g, uint8_t b);
The setPixelColor();
sets the appropriate data in the internal buffer of the class object. Sending it to the LED stripe requires the usage of the show();
function afterwards.
The different versions of the setPixelColor();
function can look like in the following code:
strip.setPixelColor(0, strip.Color(10, 0, 0)); // Red strip.setPixelColor(1, 0, 10, 0); // Green strip.setPixelColor(2, 0, 0, 10); // Blue strip.setPixelColor(3, 0x000F0F0F); // White strip.show(); // Update strip
Observe the flow of the colours via the stripe.
I cannot see the colour via the video camera - everything looks white…: Try to lower the LED's brightness.