Skip to content

Commit 7b150b9

Browse files
committed
library: add RGB LED TLC59731
Signed-off-by: Frederic Pillon <[email protected]>
1 parent bb11ba8 commit 7b150b9

File tree

5 files changed

+311
-0
lines changed

5 files changed

+311
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
RGB_LED_TLC59731
3+
4+
This example code is in the public domain.
5+
6+
Blink one RGB LED with different default colors:
7+
RGB_LED_TLC59731::OFF
8+
RGB_LED_TLC59731::RED
9+
RGB_LED_TLC59731::GREEN
10+
RGB_LED_TLC59731::BLUE
11+
RGB_LED_TLC59731::MAGENTA
12+
RGB_LED_TLC59731::CYAN
13+
RGB_LED_TLC59731::YELLOW
14+
RGB_LED_TLC59731::WHITE
15+
*/
16+
17+
#include <RGB_LED_TLC59731.h>
18+
19+
static uint8_t step = 1;
20+
21+
/**
22+
STM32WB5MM-DK have an RGB LED connected to TLC59731
23+
It requires to enable it thanks LED_SELECT pin
24+
and to have JP5 on and JP4 off
25+
*/
26+
#if defined(RGB_LED) && defined(LED_SELECT)
27+
RGB_LED_TLC59731 LED(RGB_LED, LED_SELECT);
28+
#else
29+
RGB_LED_TLC59731 LED();
30+
#endif
31+
32+
void setup() {
33+
/* Change default brightness */
34+
LED.setBrightness(0x10);
35+
}
36+
37+
void loop() {
38+
uint8_t *color = RGB_LED_TLC59731::OFF;
39+
switch (step) {
40+
case 1:
41+
color = RGB_LED_TLC59731::RED;
42+
break;
43+
case 2:
44+
color = RGB_LED_TLC59731::GREEN;
45+
break;
46+
case 4:
47+
color = RGB_LED_TLC59731::BLUE;
48+
break;
49+
case 8:
50+
color = RGB_LED_TLC59731::MAGENTA;
51+
break;
52+
case 16:
53+
color = RGB_LED_TLC59731::CYAN;
54+
break;
55+
case 32:
56+
color = RGB_LED_TLC59731::YELLOW;
57+
break;
58+
case 64:
59+
color = RGB_LED_TLC59731::WHITE;
60+
break;
61+
default:
62+
color = RGB_LED_TLC59731::OFF;
63+
break;
64+
}
65+
/* Blink */
66+
LED.on(color);
67+
delay(500);
68+
LED.off();
69+
delay(500);
70+
step = (step == 64) ? 1 : step * 2;
71+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#######################################
2+
# Syntax Coloring Map For RGB_LED_TLC59731
3+
#######################################
4+
5+
#######################################
6+
# Datatypes (KEYWORD1)
7+
#######################################
8+
9+
RGB_LED_TLC59731 KEYWORD1
10+
11+
#######################################
12+
# Methods and Functions (KEYWORD2)
13+
#######################################
14+
15+
on KEYWORD2
16+
off KEYWORD2
17+
getBrightness KEYWORD2
18+
setBrightness KEYWORD2
19+
20+
#######################################
21+
# Constants (LITERAL1)
22+
#######################################
23+
24+
OFF LITERAL1
25+
RED LITERAL1
26+
GREEN LITERAL1
27+
BLUE LITERAL1
28+
MAGENTA LITERAL1
29+
CYAN LITERAL1
30+
YELLOW LITERAL1
31+
WHITE LITERAL
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=RGB LED TLC59731
2+
version=1.0.0
3+
author=Frederic Pillon
4+
maintainer=stm32duino
5+
sentence=Allows to control one RGB LED driven by TLC59731 PWM LED Driver
6+
paragraph=Control one RGB LED driven by TLC59731 PWM LED Driver
7+
category=Signal Input/Output
8+
url=https://github.com/stm32duino/Arduino_Core_STM32/tree/master/libraries/RGB_LED_TLC59731
9+
architectures=stm32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
/*
2+
*******************************************************************************
3+
* Copyright (c) 2021, STMicroelectronics
4+
* All rights reserved.
5+
*
6+
* This software component is licensed by ST under BSD 3-Clause license,
7+
* the "License"; You may not use this file except in compliance with the
8+
* License. You may obtain a copy of the License at:
9+
* opensource.org/licenses/BSD-3-Clause
10+
*
11+
*******************************************************************************
12+
*/
13+
#include "RGB_LED_TLC59731.h"
14+
15+
#define WRITE_COMMAND 0x3A
16+
#ifndef DEFAULT_BRIGHTNESS
17+
#define DEFAULT_BRIGHTNESS 0x41
18+
#endif
19+
uint8_t RGB_LED_TLC59731::brightness = DEFAULT_BRIGHTNESS;
20+
uint8_t RGB_LED_TLC59731::OFF[3] = {0, 0, 0 };
21+
uint8_t RGB_LED_TLC59731::RED[3] = {DEFAULT_BRIGHTNESS, 0, 0 };
22+
uint8_t RGB_LED_TLC59731::GREEN[3] = {0, DEFAULT_BRIGHTNESS, 0 };
23+
uint8_t RGB_LED_TLC59731::BLUE[3] = {0, 0, DEFAULT_BRIGHTNESS};
24+
uint8_t RGB_LED_TLC59731::MAGENTA[3] = {DEFAULT_BRIGHTNESS, 0, DEFAULT_BRIGHTNESS};
25+
uint8_t RGB_LED_TLC59731::CYAN[3] = {0, DEFAULT_BRIGHTNESS, DEFAULT_BRIGHTNESS};
26+
uint8_t RGB_LED_TLC59731::YELLOW[3] = {DEFAULT_BRIGHTNESS, DEFAULT_BRIGHTNESS, 0 };
27+
uint8_t RGB_LED_TLC59731::WHITE[3] = {DEFAULT_BRIGHTNESS, DEFAULT_BRIGHTNESS, DEFAULT_BRIGHTNESS};
28+
29+
/**
30+
* @brief Set RGB LED color
31+
* @param rgb[3]: red,green, blue value in range [0-255]
32+
* @retval None
33+
*/
34+
void RGB_LED_TLC59731::on(uint8_t rgb[3]) {
35+
on(rgb[0], rgb[1], rgb[2]);
36+
}
37+
38+
/**
39+
* @brief Set RGB LED color
40+
* @param red: red value in range [0-255]
41+
* @param green: green value in range [0-255]
42+
* @param blue: blue value in range [0-255]
43+
* @retval None
44+
*/
45+
void RGB_LED_TLC59731::on(uint8_t red, uint8_t green, uint8_t blue)
46+
{
47+
if (!_enabled) {
48+
if (_enable_pin != NC) {
49+
pinMode(pinNametoDigitalPin(_enable_pin), OUTPUT);
50+
digitalWriteFast(_enable_pin, HIGH);
51+
}
52+
53+
pinMode(pinNametoDigitalPin(_rgb_pin), OUTPUT);
54+
_enabled = true;
55+
}
56+
/* Data Transfer Rate (T_CYCLE) Measurement Sequence */
57+
digitalWriteFast(_rgb_pin, HIGH);
58+
delayMicroseconds(_T_Rise);
59+
digitalWriteFast(_rgb_pin, LOW);
60+
delayMicroseconds(_T_Cycle0);
61+
/* Write command */
62+
senByte(WRITE_COMMAND);
63+
/* Write the GS data */
64+
senByte(red);
65+
senByte(green);
66+
senByte(blue);
67+
/* GS Latch */
68+
delayMicroseconds(_T_GS_Lat);
69+
}
70+
71+
/**
72+
* @brief Set RGB LED Off
73+
* @param None
74+
* @retval None
75+
*/
76+
void RGB_LED_TLC59731::off(void)
77+
{
78+
/* Set RGB LED off value */
79+
on(RGB_LED_TLC59731::OFF);
80+
pinMode(pinNametoDigitalPin(_rgb_pin), INPUT_ANALOG);
81+
82+
if (_enable_pin != NC) {
83+
digitalWriteFast(_enable_pin, LOW);
84+
pinMode(pinNametoDigitalPin(_enable_pin), INPUT_ANALOG);
85+
_enabled = false;
86+
}
87+
}
88+
89+
/**
90+
* @brief Set brightness value
91+
* @param value: new brightness value
92+
* @retval None
93+
*/
94+
void RGB_LED_TLC59731::setBrightness(uint8_t value)
95+
{
96+
RGB_LED_TLC59731::brightness = value;
97+
RGB_LED_TLC59731::RED[0] = value;
98+
RGB_LED_TLC59731::GREEN[1] = value;
99+
RGB_LED_TLC59731::BLUE[2] = value;
100+
RGB_LED_TLC59731::MAGENTA[0] = value;
101+
RGB_LED_TLC59731::MAGENTA[2] = value;
102+
RGB_LED_TLC59731::CYAN[1] = value;
103+
RGB_LED_TLC59731::CYAN[2] = value;
104+
RGB_LED_TLC59731::YELLOW[0] = value;
105+
RGB_LED_TLC59731::YELLOW[1] = value;
106+
RGB_LED_TLC59731::WHITE[0] = value;
107+
RGB_LED_TLC59731::WHITE[1] = value;
108+
RGB_LED_TLC59731::WHITE[2] = value;
109+
}
110+
111+
/* Private */
112+
void RGB_LED_TLC59731::sendBit(uint8_t bit)
113+
{
114+
/* Start next cycle */
115+
digitalWriteFast(_rgb_pin, HIGH);
116+
delayMicroseconds(_T_Rise);
117+
digitalWriteFast(_rgb_pin, LOW);
118+
delayMicroseconds(_T_Rise);
119+
120+
if (bit) {
121+
digitalWriteFast(_rgb_pin, HIGH);
122+
delayMicroseconds(_T_Rise);
123+
digitalWriteFast(_rgb_pin, LOW);
124+
delayMicroseconds(_T_Cycle1);
125+
} else {
126+
delayMicroseconds(_T_Cycle0);
127+
}
128+
}
129+
130+
131+
void RGB_LED_TLC59731::senByte(uint8_t byte)
132+
{
133+
sendBit(byte & (1 << 7));
134+
sendBit(byte & (1 << 6));
135+
sendBit(byte & (1 << 5));
136+
sendBit(byte & (1 << 4));
137+
sendBit(byte & (1 << 3));
138+
sendBit(byte & (1 << 2));
139+
sendBit(byte & (1 << 1));
140+
sendBit(byte & (1 << 0));
141+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
*******************************************************************************
3+
* Copyright (c) 2021, STMicroelectronics
4+
* All rights reserved.
5+
*
6+
* This software component is licensed by ST under BSD 3-Clause license,
7+
* the "License"; You may not use this file except in compliance with the
8+
* License. You may obtain a copy of the License at:
9+
* opensource.org/licenses/BSD-3-Clause
10+
*
11+
*******************************************************************************
12+
*/
13+
#ifndef __RGB_LED_TLC59731_H__
14+
#define __RGB_LED_TLC59731_H__
15+
16+
#include "Arduino.h"
17+
18+
#ifndef DEFAULT_BRIGHTNESS
19+
#define DEFAULT_BRIGHTNESS 0x41
20+
#endif
21+
22+
class RGB_LED_TLC59731 {
23+
24+
public:
25+
RGB_LED_TLC59731(uint32_t rgb_pin = LED_BUILTIN, uint32_t enable_pin = NC):
26+
_rgb_pin(digitalPinToPinName(rgb_pin)), _enable_pin(digitalPinToPinName(enable_pin)) {};
27+
void on(uint8_t rgb[3]);
28+
void on(uint8_t red, uint8_t green, uint8_t blue);
29+
void off(void);
30+
inline uint8_t getBrightness(void) { return brightness;}
31+
void setBrightness(uint8_t value);
32+
33+
static uint8_t brightness;
34+
static uint8_t OFF[3];
35+
static uint8_t RED[3];
36+
static uint8_t GREEN[3];
37+
static uint8_t BLUE[3];
38+
static uint8_t MAGENTA[3];
39+
static uint8_t CYAN[3];
40+
static uint8_t YELLOW[3];
41+
static uint8_t WHITE[3];
42+
43+
private:
44+
PinName _rgb_pin;
45+
PinName _enable_pin;
46+
47+
bool _enabled{false};
48+
const uint32_t _T_Rise{1};
49+
const uint32_t _T_Cycle0{4};
50+
const uint32_t _T_Cycle1{1};
51+
// GS Data Latch (GSLAT) Sequence delay
52+
const uint32_t _T_GS_Lat{_T_Cycle0*8};
53+
54+
void sendBit(uint8_t bit);
55+
void senByte(uint8_t byte);
56+
};
57+
58+
// extern IWatchdogClass IWatchdog;
59+
#endif /* __RGB_LED_TLC59731_H__ */

0 commit comments

Comments
 (0)