1c7e329140
Fixed bit shift in demo application of using RMT peripheral. Init data array to be transmitted was off by one, as for the first iteration (i==0) the mask was 1<<8, which results in shifted RGB value in color variable Closes https://github.com/espressif/arduino-esp32/issues/2921
90 lines
2.3 KiB
C++
90 lines
2.3 KiB
C++
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "freertos/event_groups.h"
|
|
#include "Arduino.h"
|
|
|
|
#include "esp32-hal.h"
|
|
|
|
#define NR_OF_LEDS 8*4
|
|
#define NR_OF_ALL_BITS 24*NR_OF_LEDS
|
|
|
|
//
|
|
// Note: This example uses Neopixel LED board, 32 LEDs chained one
|
|
// after another, each RGB LED has its 24 bit value
|
|
// for color configuration (8b for each color)
|
|
//
|
|
// Bits encoded as pulses as follows:
|
|
//
|
|
// "0":
|
|
// +-------+ +--
|
|
// | | |
|
|
// | | |
|
|
// | | |
|
|
// ---| |--------------|
|
|
// + + +
|
|
// | 0.4us | 0.85 0us |
|
|
//
|
|
// "1":
|
|
// +-------------+ +--
|
|
// | | |
|
|
// | | |
|
|
// | | |
|
|
// | | |
|
|
// ---+ +-------+
|
|
// | 0.8us | 0.4us |
|
|
|
|
rmt_data_t led_data[NR_OF_ALL_BITS];
|
|
|
|
rmt_obj_t* rmt_send = NULL;
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
|
|
if ((rmt_send = rmtInit(18, true, RMT_MEM_64)) == NULL)
|
|
{
|
|
Serial.println("init sender failed\n");
|
|
}
|
|
|
|
float realTick = rmtSetTick(rmt_send, 100);
|
|
Serial.printf("real tick set to: %fns\n", realTick);
|
|
|
|
}
|
|
|
|
int color[] = { 0x55, 0x11, 0x77 }; // RGB value
|
|
int led_index = 0;
|
|
|
|
void loop()
|
|
{
|
|
// Init data with only one led ON
|
|
int led, col, bit;
|
|
int i=0;
|
|
for (led=0; led<NR_OF_LEDS; led++) {
|
|
for (col=0; col<3; col++ ) {
|
|
for (bit=0; bit<8; bit++){
|
|
if ( (color[col] & (1<<(7-bit))) && (led == led_index) ) {
|
|
led_data[i].level0 = 1;
|
|
led_data[i].duration0 = 8;
|
|
led_data[i].level1 = 0;
|
|
led_data[i].duration1 = 4;
|
|
} else {
|
|
led_data[i].level0 = 1;
|
|
led_data[i].duration0 = 4;
|
|
led_data[i].level1 = 0;
|
|
led_data[i].duration1 = 8;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
// make the led travel in the pannel
|
|
if ((++led_index)>=NR_OF_LEDS) {
|
|
led_index = 0;
|
|
}
|
|
|
|
// Send the data
|
|
rmtWrite(rmt_send, led_data, NR_OF_ALL_BITS);
|
|
|
|
delay(100);
|
|
}
|