mirror of
https://github.com/esphome/esphome.git
synced 2024-11-22 11:47:30 +01:00
Fix SSD1306 post-setup brightness control (#1090)
* Fix post-setup brightness control * Add turn_on() and turn_off() methods * Added is_on() method * Set brightness later in setup() * Use clamp() for brightness validation
This commit is contained in:
parent
9a57e8fcb0
commit
69f5d8cd0f
@ -41,7 +41,7 @@ def setup_ssd1036(var, config):
|
||||
reset = yield cg.gpio_pin_expression(config[CONF_RESET_PIN])
|
||||
cg.add(var.set_reset_pin(reset))
|
||||
if CONF_BRIGHTNESS in config:
|
||||
cg.add(var.set_brightness(config[CONF_BRIGHTNESS]))
|
||||
cg.add(var.init_brightness(config[CONF_BRIGHTNESS]))
|
||||
if CONF_EXTERNAL_VCC in config:
|
||||
cg.add(var.set_external_vcc(config[CONF_EXTERNAL_VCC]))
|
||||
if CONF_LAMBDA in config:
|
||||
|
@ -5,7 +5,11 @@
|
||||
namespace esphome {
|
||||
namespace ssd1306_base {
|
||||
|
||||
static const char *TAG = "sd1306";
|
||||
static const char *TAG = "ssd1306";
|
||||
|
||||
static const uint8_t BLACK = 0;
|
||||
static const uint8_t WHITE = 1;
|
||||
static const uint8_t SSD1306_MAX_CONTRAST = 255;
|
||||
|
||||
static const uint8_t SSD1306_COMMAND_DISPLAY_OFF = 0xAE;
|
||||
static const uint8_t SSD1306_COMMAND_DISPLAY_ON = 0xAF;
|
||||
@ -69,27 +73,6 @@ void SSD1306::setup() {
|
||||
break;
|
||||
}
|
||||
|
||||
this->command(SSD1306_COMMAND_SET_CONTRAST);
|
||||
switch (this->model_) {
|
||||
case SSD1306_MODEL_128_32:
|
||||
case SH1106_MODEL_128_32:
|
||||
this->command(0x8F);
|
||||
break;
|
||||
case SSD1306_MODEL_128_64:
|
||||
case SH1106_MODEL_128_64:
|
||||
case SSD1306_MODEL_64_48:
|
||||
case SH1106_MODEL_64_48:
|
||||
this->command(int(255 * (this->brightness_)));
|
||||
break;
|
||||
case SSD1306_MODEL_96_16:
|
||||
case SH1106_MODEL_96_16:
|
||||
if (this->external_vcc_)
|
||||
this->command(0x10);
|
||||
else
|
||||
this->command(0xAF);
|
||||
break;
|
||||
}
|
||||
|
||||
this->command(SSD1306_COMMAND_SET_PRE_CHARGE);
|
||||
if (this->external_vcc_)
|
||||
this->command(0x22);
|
||||
@ -104,7 +87,12 @@ void SSD1306::setup() {
|
||||
|
||||
this->command(SSD1306_COMMAND_DEACTIVATE_SCROLL);
|
||||
|
||||
this->command(SSD1306_COMMAND_DISPLAY_ON);
|
||||
set_brightness(this->brightness_);
|
||||
|
||||
this->fill(BLACK); // clear display - ensures we do not see garbage at power-on
|
||||
this->display(); // ...write buffer, which actually clears the display's memory
|
||||
|
||||
this->turn_on();
|
||||
}
|
||||
void SSD1306::display() {
|
||||
if (this->is_sh1106_()) {
|
||||
@ -140,6 +128,22 @@ void SSD1306::update() {
|
||||
this->do_update_();
|
||||
this->display();
|
||||
}
|
||||
void SSD1306::set_brightness(float brightness) {
|
||||
// validation
|
||||
this->brightness_ = clamp(brightness, 0, 1);
|
||||
// now write the new brightness level to the display
|
||||
this->command(SSD1306_COMMAND_SET_CONTRAST);
|
||||
this->command(int(SSD1306_MAX_CONTRAST * (this->brightness_)));
|
||||
}
|
||||
bool SSD1306::is_on() { return this->is_on_; }
|
||||
void SSD1306::turn_on() {
|
||||
this->command(SSD1306_COMMAND_DISPLAY_ON);
|
||||
this->is_on_ = true;
|
||||
}
|
||||
void SSD1306::turn_off() {
|
||||
this->command(SSD1306_COMMAND_DISPLAY_OFF);
|
||||
this->is_on_ = false;
|
||||
}
|
||||
int SSD1306::get_height_internal() {
|
||||
switch (this->model_) {
|
||||
case SSD1306_MODEL_128_32:
|
||||
@ -178,7 +182,6 @@ int SSD1306::get_width_internal() {
|
||||
size_t SSD1306::get_buffer_length_() {
|
||||
return size_t(this->get_width_internal()) * size_t(this->get_height_internal()) / 8u;
|
||||
}
|
||||
|
||||
void HOT SSD1306::draw_absolute_pixel_internal(int x, int y, Color color) {
|
||||
if (x >= this->get_width_internal() || x < 0 || y >= this->get_height_internal() || y < 0)
|
||||
return;
|
||||
|
@ -29,8 +29,11 @@ class SSD1306 : public PollingComponent, public display::DisplayBuffer {
|
||||
void set_model(SSD1306Model model) { this->model_ = model; }
|
||||
void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; }
|
||||
void set_external_vcc(bool external_vcc) { this->external_vcc_ = external_vcc; }
|
||||
void set_brightness(float brightness) { this->brightness_ = brightness; }
|
||||
|
||||
void init_brightness(float brightness) { this->brightness_ = brightness; }
|
||||
void set_brightness(float brightness);
|
||||
bool is_on();
|
||||
void turn_on();
|
||||
void turn_off();
|
||||
float get_setup_priority() const override { return setup_priority::PROCESSOR; }
|
||||
void fill(Color color) override;
|
||||
|
||||
@ -51,6 +54,7 @@ class SSD1306 : public PollingComponent, public display::DisplayBuffer {
|
||||
SSD1306Model model_{SSD1306_MODEL_128_64};
|
||||
GPIOPin *reset_pin_{nullptr};
|
||||
bool external_vcc_{false};
|
||||
bool is_on_{false};
|
||||
float brightness_{1.0};
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user