LED debuging, imported ColorUtil-Class from IoLight

This commit is contained in:
Ollo 2024-12-06 18:07:18 +01:00
parent f8c6b4d351
commit e7a2eab923
4 changed files with 243 additions and 32 deletions

45
include/ColorUtil.h Normal file
View File

@ -0,0 +1,45 @@
/**
* @brief ColorUtil collection
* @file ColorUtil.h
*
*/
#ifndef COLOR_UTIL
#define COLOR_UTIL
#include <stdint.h>
#ifndef UNIT_TEST
#include <Adafruit_NeoPixel.h>
typedef enum dir_t {
FORWARD = 0,
BACKWARD
} Direction;
void RainbowCycle (Adafruit_NeoPixel* pix, uint8_t *pIndex);
#endif
/**
* @brief Extract color form a given string
* possible values are:
* - red
* - green
* - blue
* - white
* - black
* - off
* - #RRGGBB (red, green blue as hex values: 0-F (uppercase))
* - #rrggbb (red, green blue as hex values: 0-f (lowercase))
* @param text The text with the color information
* @param length The amount of characters in the given text
* @return uint32_t 32-bit color value. Most significant byte is white (for RGBW
pixels) or ignored (for RGB pixels), next is red, then green,
and least significant byte is blue.
*/
uint32_t extractColor(const char *text, int length);
uint32_t Color(uint8_t r, uint8_t g, uint8_t b);
#endif /* COLOR_UTIL */

View File

@ -16,10 +16,10 @@
#define GPIO_DS18B20 D2 /**< One-Wire used for Dallas temperature sensor */ #define GPIO_DS18B20 D2 /**< One-Wire used for Dallas temperature sensor */
#define WS2812SINGLE_GPIO_PIN D5 #define WS2812SINGLE_GPIO_PIN D3
#define WS2812SINGLE_LEDS 3 #define WS2812SINGLE_LEDS 3
#define WS2812STRIP_GPIO_PIN D3 #define WS2812STRIP_GPIO_PIN D5
#define WS2812STRIP_LEDS 13 #define WS2812STRIP_LEDS 13
#endif /* End FANLEDCTL_PINS */ #endif /* End FANLEDCTL_PINS */

147
src/ColorUtil.cpp Normal file
View File

@ -0,0 +1,147 @@
/**
* @brief ColorUtil collection
* @file ColorUtil.c
*
* See:
* https://learn.adafruit.com/multi-tasking-the-arduino-part-3/utility-functions
*/
#include "ColorUtil.h"
#include "string.h"
#include <stdio.h>
#define MIN(a, b) ((a) > (b) ? b : a)
#define COMPARE_STR(text,length, staticText) strncmp(text, staticText, MIN(length, (int) strlen(staticText)))
#ifdef UNIT_TEST
#include "test_helper.h"
#else
#include <Adafruit_NeoPixel.h>
/*!
@brief Convert separate red, green and blue values into a single
"packed" 32-bit RGB color.
@param r Red brightness, 0 to 255.
@param g Green brightness, 0 to 255.
@param b Blue brightness, 0 to 255.
Copied from Adafruit_NeoPixel.h
@return 32-bit packed RGB value, which can then be assigned to a
variable for later use or passed to the setPixelColor()
function. Packed RGB format is predictable, regardless of
LED strand color order.
*/
uint32_t Color(uint8_t r, uint8_t g, uint8_t b) {
return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b;
}
/**
* @brief
*
* @param WheelPos
*
* The colours are a transition r - g - b - back to r
*
* @return uint32_t
*/
uint32_t Wheel(uint8_t WheelPos)
{
WheelPos = 255 - WheelPos;
if(WheelPos < 85)
{
return Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else if(WheelPos < 170)
{
WheelPos -= 85;
return Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
else
{
WheelPos -= 170;
return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}
void RainbowCycle (Adafruit_NeoPixel* pix, uint8_t *pIndex)
{
uint8_t Index = (*pIndex);
for(int i=0; i< pix->numPixels(); i++)
{
pix->setPixelColor(i, Wheel(((i * 256 / pix->numPixels()) + Index) & 255));
}
(*pIndex) = Index + 1;
pix->show();
}
#endif
uint32_t extractColor(const char *text, int length) {
int parsed = 0;
/* invalid values are returned as black */
if ((length <= 0) ||
(text == NULL) ||
(strlen(text) < (unsigned int) length)){
return 0xFFFFFFFF;
}
if ( (COMPARE_STR(text, length, "off") == 0) || (COMPARE_STR(text, length, "OFF") == 0) ||
(COMPARE_STR(text, length, "black") == 0) || (COMPARE_STR(text, length, "BLACK") == 0) ) {
return 0;
} else if ( (COMPARE_STR(text, length, "red") == 0) || (COMPARE_STR(text, length, "RED") == 0) ) {
return 0x00FF0000;
} else if ( (COMPARE_STR(text, length, "green") == 0) || (COMPARE_STR(text, length, "GREEN") == 0) ) {
return 0x0000FF00;
} else if ( (COMPARE_STR(text, length, "blue") == 0) || (COMPARE_STR(text, length, "BLUE") == 0) ) {
return 0x000000FF;
} else if ((COMPARE_STR(text, length, "white") == 0) || (COMPARE_STR(text, length, "WHITE") == 0) ) {
return 0x00FFFFFF;
} else if (text[0] == '#' && length == 7) { /* parse #rrggbb or #RRGGBB */
int red, green, blue = 0;
parsed = sscanf(text, "#%2X%2X%2X", &red, &green, &blue);
if (parsed == 3) {
uint32_t c = blue;
c |= (green << 8);
c |= (red << 16);
#ifdef UNIT_TEST
printf("rrggbb %s = %x\n", text, c);
#endif
return c;
} else {
/* try to parse lower case hex values */
parsed = sscanf(text, "#%2x%2x%2x", &red, &green, &blue);
if (parsed == 3) {
uint32_t c = blue;
c |= (green << 8);
c |= (red << 16);
#ifdef UNIT_TEST
printf("RRGGBB %s = %x\n", text, c);
#endif
return c;
} else {
return 0;
}
}
} else {
int hue; /* OpenHAB hue (0-360°) */
int satu; /* OpenHAB saturation (0-100%) */
int bright; /* brightness (0-100%) */
parsed = sscanf(text, "%d,%d,%d", &hue, &satu, &bright);
if (parsed == 3) {
#ifndef UNIT_TEST
return Adafruit_NeoPixel::ColorHSV(65535 * hue / 360,
255 * satu / 100,
255 * bright / 100);
#else
return replacementColorHSV(65535 * hue / 360,
255 * satu / 100,
255 * bright / 100);
#endif
} else {
return 0xFFFFFFFF; /* wrong format */
}
}
return 0xFFFFFFFF;
}

View File

@ -3,9 +3,10 @@
#include <DallasTemperature.h> #include <DallasTemperature.h>
#include <OneWire.h> #include <OneWire.h>
#include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h>
#include "ColorUtil.h"
#include "controller.h" #include "controller.h"
/****************************************************************************** /******************************************************************************
* MAKROS * MACROS
******************************************************************************/ ******************************************************************************/
@ -24,8 +25,8 @@
/****************************************************************************** /******************************************************************************
* LOCAL VARIABLES * LOCAL VARIABLES
******************************************************************************/ ******************************************************************************/
Adafruit_NeoPixel pixels(WS2812STRIP_LEDS, WS2812STRIP_GPIO_PIN, NEO_RBG + NEO_KHZ400); Adafruit_NeoPixel* pixels;
Adafruit_NeoPixel singleLed(WS2812SINGLE_LEDS, WS2812SINGLE_GPIO_PIN, NEO_RBG + NEO_KHZ400); Adafruit_NeoPixel* singleLed;
OneWire oneWire(GPIO_DS18B20); OneWire oneWire(GPIO_DS18B20);
DallasTemperature sensors(&oneWire); DallasTemperature sensors(&oneWire);
@ -35,6 +36,8 @@ DallasTemperature sensors(&oneWire);
* Initialize hardware pins * Initialize hardware pins
*/ */
void setup() { void setup() {
pixels = new Adafruit_NeoPixel(WS2812STRIP_LEDS, WS2812STRIP_GPIO_PIN, NEO_GRB + NEO_KHZ400);
singleLed = new Adafruit_NeoPixel(WS2812SINGLE_LEDS, WS2812SINGLE_GPIO_PIN, NEO_GRB + NEO_KHZ400);
Serial.begin(115200); Serial.begin(115200);
WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_OFF);
@ -42,17 +45,19 @@ void setup() {
{ {
Serial.println(F("\nWifi mode is WIFI_OFF")); Serial.println(F("\nWifi mode is WIFI_OFF"));
} }
#ifdef FAN_ENABLED
/* Setup FAN Control */ /* Setup FAN Control */
pinMode(FAN_PIN, OUTPUT); pinMode(FAN_PIN, OUTPUT);
pinMode(SIGNAL_PIN, INPUT); pinMode(SIGNAL_PIN, INPUT);
#else
Serial.println(F("\nFAN NOT enabled"));
#endif
pixels->begin();
pixels.begin(); pixels->clear();
pixels.clear(); pixels->setBrightness(100);
pixels.setBrightness(100); pixels->fill(Color(255,0,0));
pixels.fill(pixels.Color(255,0,0)); pixels->show();
pixels.show();
/* Initialize Temperature sensor */ /* Initialize Temperature sensor */
@ -64,18 +69,18 @@ void setup() {
Serial.println("Reset 1-Wire Bus"); Serial.println("Reset 1-Wire Bus");
} }
pixels.fill(pixels.Color(0,255,0)); pixels->fill(Color(0,255,0));
pixels.setBrightness(50); pixels->setBrightness(50);
pixels.show(); pixels->show();
/* prepare LED strip pin */ /* prepare LED strip pin */
singleLed.begin(); singleLed->begin();
singleLed.clear(); singleLed->clear();
singleLed.setBrightness(100); singleLed->setBrightness(100);
singleLed.fill(singleLed.Color(255,0,0)); singleLed->fill(Color(255,0,0));
singleLed.show(); singleLed->show();
} }
#ifdef FAN_ENABLED
/** /**
* @brief Get the Fan Speed in round per minutes * @brief Get the Fan Speed in round per minutes
* *
@ -102,6 +107,8 @@ void setFanSpeedPercent(int p) {
analogWrite(FAN_PIN, value); analogWrite(FAN_PIN, value);
} }
#endif
float readTemperature(void) float readTemperature(void)
{ {
int sensorCount = sensors.getDeviceCount(); int sensorCount = sensors.getDeviceCount();
@ -122,12 +129,14 @@ float readTemperature(void)
* @brief Endless loop * @brief Endless loop
* (is called as fast as possible) * (is called as fast as possible)
*/ */
void loop() { void loop()
float temp = readTemperature(); {
float temp = readTemperature();
Serial.print(temp); Serial.print(temp);
Serial.print(";"); Serial.print(";");
int fanSpeedPercent, actualFanSpeedRpm; int fanSpeedPercent, actualFanSpeedRpm = 0;
if (temp < MIN_TEMP) { if (temp < MIN_TEMP) {
fanSpeedPercent = 0; fanSpeedPercent = 0;
@ -137,23 +146,33 @@ void loop() {
fanSpeedPercent = (100 - MIN_FAN_SPEED_PERCENT) * (temp - MIN_TEMP) / (MAX_TEMP - MIN_TEMP) + MIN_FAN_SPEED_PERCENT; fanSpeedPercent = (100 - MIN_FAN_SPEED_PERCENT) * (temp - MIN_TEMP) / (MAX_TEMP - MIN_TEMP) + MIN_FAN_SPEED_PERCENT;
} }
#ifdef FAN_ENABLED
actualFanSpeedRpm = getFanSpeedRpm(); actualFanSpeedRpm = getFanSpeedRpm();
pixels->fill(pixels.Color(255, 0,0));
pixels.fill(pixels.Color(255, 0,0)); pixels->setBrightness(actualFanSpeedRpm);
pixels.setBrightness(fanSpeedPercent); #else
pixels.show(); uint8_t index = (uint8_t) ((actualFanSpeedRpm + 1) % 256);
RainbowCycle(pixels, &index);
#endif
pixels->show();
#ifdef FAN_ENABLED
Serial.print(fanSpeedPercent); Serial.print(fanSpeedPercent);
Serial.print("%;"); Serial.print("%;");
setFanSpeedPercent(fanSpeedPercent); setFanSpeedPercent(fanSpeedPercent);
Serial.print(actualFanSpeedRpm); Serial.print(actualFanSpeedRpm);
Serial.println("RPM"); Serial.println("RPM");
#else
Serial.println("");
#endif
singleLed.fill(singleLed.Color(0,128,128)); singleLed->fill(Color(0,128,128));
singleLed.setBrightness(255 - (actualFanSpeedRpm / 10)); singleLed->setBrightness(fanSpeedPercent);
singleLed.show(); singleLed->show();
#ifdef FAN_ENABLED
delay(DELAY_TIME); delay(DELAY_TIME);
#endif
} }