GY-63_MS5611/libraries/Kelvin2RGB/README.md

111 lines
4.2 KiB
Markdown
Raw Normal View History

2021-01-29 06:31:58 -05:00
[![Arduino CI](https://github.com/RobTillaart/Kelvin2RGB/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
2021-11-06 10:56:44 -04:00
[![Arduino-lint](https://github.com/RobTillaart/Kelvin2RGB/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/Kelvin2RGB/actions/workflows/arduino-lint.yml)
[![JSON check](https://github.com/RobTillaart/Kelvin2RGB/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/Kelvin2RGB/actions/workflows/jsoncheck.yml)
2021-01-29 06:31:58 -05:00
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/Kelvin2RGB/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/Kelvin2RGB.svg?maxAge=3600)](https://github.com/RobTillaart/Kelvin2RGB/releases)
# Kelvin2RGB
2021-12-20 11:09:35 -05:00
Arduino library for converting temperature and brightness to RGB values.
2021-06-02 07:46:05 -04:00
2021-01-29 06:31:58 -05:00
## Credentials
This library is based upon an article of Tanner Helland
and a related story by Neil Bartlett
http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/
http://www.zombieprototypes.com/?p=210
https://en.wikipedia.org/wiki/Color_temperature#Categorizing_different_lighting
There are more approximation formulas, some claim to be better,
2021-06-02 07:46:05 -04:00
however these are not investigated. On request these can be added.
2021-01-29 06:31:58 -05:00
## Description
The library converts a temperature in Kelvin and a brightness (0..100%)
to 3 numbers red, green and blue.
2021-12-20 11:09:35 -05:00
These numbers are weights can be used to correct a colour image for virtual white temperature.
2021-01-29 06:31:58 -05:00
2021-06-02 07:46:05 -04:00
There are 2 convert functions where the **convert_NB()** is claimed to be
the more accurate one.
With the numbers R,G,B calculated one can convert images so they will look
more like taken with candle light, sunrise or sunset etc.
2021-01-29 06:31:58 -05:00
**pseudo code**
```cpp
Kelvin2RGB KRGB;
KRGB.convert(1850, 100); // sunrise light factors
for each pixel in image
{
red *= KRGB.red();
green *= KRGB.green();
blue *= KRGB.blue();
drawPixel();
}
```
The numbers can also be used to reduce the blue channel so it has less effect
on "getting sleepy".
The library uses floats for the R,G and B weights to keep values as accurate as possible.
Especially with images with more than 8 bits per channel this is preferred.
That said it is also possible to use this on a 565 image or to adjust color lookup tables.
## Interface
2021-11-06 10:56:44 -04:00
The interface is straightforward:
2021-01-29 06:31:58 -05:00
- **Kelvin2RGB()** constructor
2021-11-06 10:56:44 -04:00
- **void begin()** empty function for now.
- **void reset()** resets all internal values to 0.
- **void convert_TH(float temperature, float brightness = 100)**
2021-01-29 06:31:58 -05:00
temperature = 0..65500 temperature below 1000 is not well defined.
brightness = 0..100%,
2021-11-06 10:56:44 -04:00
- **void convert_NB(float temperature, float brightness = 100)**
2021-01-29 06:31:58 -05:00
temperature = 0..65500 temperature below 1000 is not well defined.
brightness = 0..100%,
Is a bit more accurate and slightly slower (few %). Read link above for more information.
- **float temperature()** returns temperature, to check the value used.
- **float brightness()** returns brightness, to check the value used.
- **float red()** returns red channel weight 0.0 .. 1.0
note this is different from Helland / Bartlett who both use an integer value 0 .. 255
- **float green()** returns green channel weight 0.0 .. 1.0
- **float blue()** returns blue channel weight 0.0 .. 1.0
2021-11-06 10:56:44 -04:00
- **uint32_t setRGB(float red, float green, float blue, float brightness = 100)** sets RGB values
red, green, blue should be in 0 .. 1.0 range. brightness should be in 0..100%, Default = 100%.
returns a 24 bit RGB value,
- **uint32_t RGB()** returns a 24 bit RGB value, 0 .. 16777215
2021-01-29 06:31:58 -05:00
more efficient than 3 floats for communication.
2021-11-06 10:56:44 -04:00
- **uint16_t RGB565()** returns a 16 bit RGB value,
5 bits for red, 6 for green and 5 for blue.
- **uint32_t BGR()** returns a 24 bit BGR value, 0 .. 16777215
- **uint32_t CMYK()** returns a 32 bit = 4 byte CMYK value,
2021-06-02 07:46:05 -04:00
2021-01-29 06:31:58 -05:00
2021-06-02 07:46:05 -04:00
## Future
2021-01-29 06:31:58 -05:00
2021-11-06 10:56:44 -04:00
- separate brightness per colour channel to mimic "artificial illumination" (0.2.0 ?)
2021-01-29 06:31:58 -05:00
- define constants like candleLight as parameter.
2021-06-02 07:46:05 -04:00
- investigate other formulas.
2021-11-06 10:56:44 -04:00
- investigate timing and performance
- investigate usability for RGB led strip.
2021-06-02 07:46:05 -04:00
- remove begin() ?
2021-11-06 10:56:44 -04:00
- add examples
- CMYK()
- BGR()
- Led-strip()
2021-01-29 06:31:58 -05:00
## Operations
See examples