added support for the LDR based brightness dimming
This commit is contained in:
parent
949942ac32
commit
568ddf6810
4 changed files with 123 additions and 20 deletions
1
OmobiDisplayApp/QBluetoothLeUart
Submodule
1
OmobiDisplayApp/QBluetoothLeUart
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 76e457593e889885fd410fdbcdd659706a1eceb8
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef LED_DISPLAY_CONTROLLER
|
||||
#define LED_DISPLAY_CONTROLLER
|
||||
|
||||
#define LDR_PIN 36
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_NeoMatrix.h>
|
||||
|
@ -34,6 +36,8 @@ public:
|
|||
textpixel = 0;
|
||||
disp_show = false;
|
||||
|
||||
|
||||
this->brightness_init();
|
||||
this->disp_init();
|
||||
|
||||
// create updater task
|
||||
|
@ -98,6 +102,13 @@ private:
|
|||
TaskHandle_t displayUpdateTask;
|
||||
NeoPixelBrightnessBusGfx<NeoGrbFeature, Neo800KbpsMethod> *matrix;
|
||||
|
||||
// brigthness meassurement collection set
|
||||
static const uint8_t meas_slots = 5;
|
||||
uint8_t current_meas_slot;
|
||||
uint16_t brightness_levels[meas_slots];
|
||||
float brightness_adjust;
|
||||
long last_brightness_meas;
|
||||
|
||||
// matrix variables
|
||||
uint16_t text_curr_nr;
|
||||
uint32_t text_set_starttime;
|
||||
|
@ -117,9 +128,12 @@ private:
|
|||
// matrix control
|
||||
//uint16_t remap(uint16_t x, uint16_t y);
|
||||
void disp_init();
|
||||
void brightness_init();
|
||||
void disp_start_set();
|
||||
void disp_scroll_text();
|
||||
void show_matrix(const char *text, int pos, const char *color);
|
||||
void measureBrightnessEnv( void );
|
||||
uint8_t adjustBrightnessToEnv( void );
|
||||
uint16_t colorFromHex(String hex);
|
||||
|
||||
// storage structs
|
||||
|
|
|
@ -9,6 +9,7 @@ void LedDisplayController::loop()
|
|||
//Serial.printf("Ligth: %d \n" , analogRead(36));
|
||||
if (this->disp_show)
|
||||
{
|
||||
measureBrightnessEnv();
|
||||
disp_start_set();
|
||||
if (true == text_sets.sets[text_curr_nr].active)
|
||||
{
|
||||
|
@ -60,7 +61,7 @@ bool LedDisplayController::setBrightness(int brightness)
|
|||
|
||||
|
||||
this->text_sets.disp_brightness = brightness;
|
||||
this->matrix->SetBrightness(pow (2, (this->text_sets.disp_brightness / RFade)) - 1);
|
||||
this->matrix->SetBrightness( adjustBrightnessToEnv() );
|
||||
this->matrix->Show();
|
||||
this->storeTextSets();
|
||||
return true;
|
||||
|
@ -75,12 +76,24 @@ void LedDisplayController::setAutomaticBrightnessAdjustment(bool automaticBright
|
|||
{
|
||||
this->text_sets.disp_automatic_brightness_adjustment = automaticBrightnessAdjustment;
|
||||
this->storeTextSets();
|
||||
brightness_init();
|
||||
measureBrightnessEnv();
|
||||
|
||||
}
|
||||
|
||||
// ------------------
|
||||
// - Matrix control -
|
||||
// ------------------
|
||||
|
||||
void LedDisplayController::brightness_init()
|
||||
{
|
||||
for(uint8_t i = 0; i < meas_slots; i++)
|
||||
this->brightness_levels[i] = analogRead(LDR_PIN);
|
||||
this->current_meas_slot = 0;
|
||||
this->last_brightness_meas = millis();
|
||||
measureBrightnessEnv();
|
||||
}
|
||||
|
||||
void LedDisplayController::disp_init()
|
||||
{
|
||||
text_curr_nr = 0;
|
||||
|
@ -143,21 +156,28 @@ void LedDisplayController::disp_start_set()
|
|||
textpixel = 6 * strlen(text_sets.sets[text_curr_nr].text);
|
||||
// scrolling text has always left or right allignment - depending on direction of scroll
|
||||
if (true == text_sets.sets[text_curr_nr].scroll)
|
||||
text_sets.sets[text_curr_nr].alignment = AlignRight;
|
||||
|
||||
{
|
||||
if(0 == text_sets.sets[text_curr_nr].scrollDirection)
|
||||
text_pos = this->matrix->width();
|
||||
else
|
||||
text_pos = 0 - textpixel;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (text_sets.sets[text_curr_nr].alignment)
|
||||
{
|
||||
case AlignLeft:
|
||||
text_pos = 0;
|
||||
break;
|
||||
case AlignRight:
|
||||
text_pos = this->matrix->width();
|
||||
text_pos = this->matrix->width() - textpixel;
|
||||
break;
|
||||
case AlignCenter:
|
||||
text_pos = this->matrix->width() - textpixel;
|
||||
text_pos = text_pos / 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
show_matrix(text_sets.sets[text_curr_nr].text, text_pos, text_sets.sets[text_curr_nr].color);
|
||||
text_set_starttime = millis();
|
||||
|
@ -180,6 +200,8 @@ void LedDisplayController::disp_scroll_text()
|
|||
//Serial.printf("speed %d, waittime: %d' \n", text_sets.sets[text_curr_nr].scrollSpeed, display_show_wait_ms);
|
||||
this->matrix->fillScreen(0);
|
||||
show_matrix(text_sets.sets[text_curr_nr].text, text_pos, text_sets.sets[text_curr_nr].color);
|
||||
if(0==text_sets.sets[text_curr_nr].scrollDirection)
|
||||
{
|
||||
(int)text_pos--;
|
||||
if (int(text_pos + textpixel) < 0)
|
||||
{
|
||||
|
@ -188,12 +210,23 @@ void LedDisplayController::disp_scroll_text()
|
|||
//Serial.printf("Pass[%d] - set nr %d, Text: '%s' \n", text_pass, text_curr_nr, text_sets.sets[text_curr_nr].text);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
(int)text_pos++;
|
||||
if (text_pos > this->matrix->width())
|
||||
{
|
||||
text_pos = 0 - textpixel;
|
||||
text_pass++;
|
||||
//Serial.printf("Pass[%d] - set nr %d, Text: '%s' \n", text_pass, text_curr_nr, text_sets.sets[text_curr_nr].text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LedDisplayController::show_matrix(const char *text, int pos, const char *color)
|
||||
{
|
||||
//Serial.printf("TEXT: %s (pos=%d, color=%d)\n", text, pos, this->colorFromHex(String(color)));
|
||||
this->matrix->SetBrightness(pow (2, (this->text_sets.disp_brightness / RFade)) - 1);
|
||||
this->matrix->SetBrightness( adjustBrightnessToEnv() );
|
||||
this->matrix->setTextColor(this->colorFromHex(String(color)));
|
||||
this->matrix->setCursor(pos, 0);
|
||||
this->matrix->print(text);
|
||||
|
@ -202,6 +235,60 @@ void LedDisplayController::show_matrix(const char *text, int pos, const char *co
|
|||
//portENABLE_INTERRUPTS();
|
||||
}
|
||||
|
||||
|
||||
uint8_t LedDisplayController::adjustBrightnessToEnv( void )
|
||||
{
|
||||
uint8_t brightness = ( pow (2, (this->text_sets.disp_brightness / RFade)) ) ;
|
||||
uint8_t brightness_adj = brightness * this->brightness_adjust ;
|
||||
//Serial.printf("brightness without adjust : %d . Adjust is: %f. Brightness with adjust : %d .\n", brightness, this->brightness_adjust, brightness_adj);
|
||||
return brightness_adj;
|
||||
}
|
||||
|
||||
void LedDisplayController::measureBrightnessEnv( void )
|
||||
{
|
||||
if(true == this->text_sets.disp_automatic_brightness_adjustment)
|
||||
{
|
||||
if( millis() - this->last_brightness_meas > 1000)
|
||||
{
|
||||
this->brightness_levels[this->current_meas_slot] = analogRead(LDR_PIN);
|
||||
//Serial.printf("brightness last measured value = %d\n", brightness_levels[current_meas_slot]);
|
||||
this->current_meas_slot = this->current_meas_slot+1>=this->meas_slots? 0 : this->current_meas_slot+1;
|
||||
this->last_brightness_meas = millis();
|
||||
|
||||
uint16_t smallest = brightness_levels[0];
|
||||
uint16_t biggest = brightness_levels[0];
|
||||
uint64_t sum = brightness_levels[0];
|
||||
|
||||
for(uint8_t i = 1; i < this->meas_slots; i++)
|
||||
{
|
||||
sum = sum + this->brightness_levels[i] ;
|
||||
if( this->brightness_levels[i] < smallest )
|
||||
smallest = this->brightness_levels[i];
|
||||
else
|
||||
{
|
||||
if( this->brightness_levels[i] > biggest )
|
||||
biggest = this->brightness_levels[i];
|
||||
}
|
||||
}
|
||||
|
||||
sum = sum - smallest - biggest;
|
||||
sum = sum / (this->meas_slots - 2);
|
||||
//Serial.printf("brightness median value = %llu \n", sum);
|
||||
|
||||
float adjust = ( ( ( ( 100.0/ ( 4095.0 / 2.0 ) ) * (float)sum ) ) / 100.0 );
|
||||
adjust = adjust > 1.0 ? 1.0 : adjust ;
|
||||
adjust = adjust < 0.2 ? 0.1 : adjust ;
|
||||
this->brightness_adjust = adjust;
|
||||
Serial.printf("brightness_adjust = %f\n", this->brightness_adjust);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this->brightness_adjust = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint16_t LedDisplayController::colorFromHex(String hex)
|
||||
{
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ void setup()
|
|||
void loop()
|
||||
{
|
||||
// nothing to do in loop
|
||||
//Serial.printf("LDR value is: %d\n", analogRead(LDR_PIN));
|
||||
display->loop();
|
||||
delay(1);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue