mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00: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:
		
				
					committed by
					
						 Guillermo Ruffino
						Guillermo Ruffino
					
				
			
			
				
	
			
			
			
						parent
						
							cfe4638665
						
					
				
				
					commit
					228670df78
				
			| @@ -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}; | ||||
| }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user