From 568ddf68107f981c89e8b53ab23b35d319dbe55a Mon Sep 17 00:00:00 2001 From: Jens Noack Date: Wed, 28 Oct 2020 09:17:33 +0100 Subject: [PATCH] added support for the LDR based brightness dimming --- OmobiDisplayApp/QBluetoothLeUart | 1 + .../include/LedDisplayController.h | 14 ++ .../src/LedDisplayController.cpp | 127 +++++++++++++++--- vscode/OmobiLEDdisplayBluetooth/src/main.cpp | 1 + 4 files changed, 123 insertions(+), 20 deletions(-) create mode 160000 OmobiDisplayApp/QBluetoothLeUart diff --git a/OmobiDisplayApp/QBluetoothLeUart b/OmobiDisplayApp/QBluetoothLeUart new file mode 160000 index 0000000..76e4575 --- /dev/null +++ b/OmobiDisplayApp/QBluetoothLeUart @@ -0,0 +1 @@ +Subproject commit 76e457593e889885fd410fdbcdd659706a1eceb8 diff --git a/vscode/OmobiLEDdisplayBluetooth/include/LedDisplayController.h b/vscode/OmobiLEDdisplayBluetooth/include/LedDisplayController.h index b1611f4..0dc7981 100644 --- a/vscode/OmobiLEDdisplayBluetooth/include/LedDisplayController.h +++ b/vscode/OmobiLEDdisplayBluetooth/include/LedDisplayController.h @@ -1,6 +1,8 @@ #ifndef LED_DISPLAY_CONTROLLER #define LED_DISPLAY_CONTROLLER +#define LDR_PIN 36 + #include #include #include @@ -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 *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 diff --git a/vscode/OmobiLEDdisplayBluetooth/src/LedDisplayController.cpp b/vscode/OmobiLEDdisplayBluetooth/src/LedDisplayController.cpp index ff7af9d..4a9fe70 100644 --- a/vscode/OmobiLEDdisplayBluetooth/src/LedDisplayController.cpp +++ b/vscode/OmobiLEDdisplayBluetooth/src/LedDisplayController.cpp @@ -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,20 +156,27 @@ 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; - - switch (text_sets.sets[text_curr_nr].alignment) { - case AlignLeft: - text_pos = 0; - break; - case AlignRight: - text_pos = this->matrix->width(); - break; - case AlignCenter: - text_pos = this->matrix->width() - textpixel; - text_pos = text_pos / 2; - break; + 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() - 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); @@ -180,12 +200,25 @@ 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); - (int)text_pos--; - if (int(text_pos + textpixel) < 0) + if(0==text_sets.sets[text_curr_nr].scrollDirection) { - text_pos = this->matrix->width(); - text_pass++; - //Serial.printf("Pass[%d] - set nr %d, Text: '%s' \n", text_pass, text_curr_nr, text_sets.sets[text_curr_nr].text); + (int)text_pos--; + if (int(text_pos + textpixel) < 0) + { + text_pos = this->matrix->width(); + text_pass++; + //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); + } } } } @@ -193,7 +226,7 @@ void LedDisplayController::disp_scroll_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) { diff --git a/vscode/OmobiLEDdisplayBluetooth/src/main.cpp b/vscode/OmobiLEDdisplayBluetooth/src/main.cpp index 5b9336d..1062d41 100644 --- a/vscode/OmobiLEDdisplayBluetooth/src/main.cpp +++ b/vscode/OmobiLEDdisplayBluetooth/src/main.cpp @@ -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); }