1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
| #include "driver_oled.h" #include "esp_log.h" #include "string.h" #include "font8x8.h"
static const char *TAG = "OLED_DRIVER";
static i2c_port_t oled_i2c_port; static uint8_t oled_i2c_addr; static gpio_num_t oled_reset_pin; static int oled_width = 128; static int oled_height = 64;
static const uint8_t oled_init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x00, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
static esp_err_t oled_send_cmd(uint8_t cmd) { uint8_t data[2] = {0x00, cmd}; return hal_i2c_write(oled_i2c_port, oled_i2c_addr, data, 2); }
static esp_err_t oled_send_data(uint8_t *data, size_t data_len) { uint8_t control_byte = 0x40; uint8_t buffer[data_len + 1]; buffer[0] = control_byte; memcpy(&buffer[1], data, data_len); return hal_i2c_write(oled_i2c_port, oled_i2c_addr, buffer, data_len + 1); }
esp_err_t driver_oled_init(i2c_port_t i2c_port, uint8_t oled_addr, gpio_num_t reset_pin) { ESP_LOGI(TAG, "Initializing OLED driver"); oled_i2c_port = i2c_port; oled_i2c_addr = oled_addr; oled_reset_pin = reset_pin;
if (oled_reset_pin != GPIO_NUM_NC) { hal_gpio_config_t reset_config; reset_config.mode = GPIO_MODE_OUTPUT; reset_config.pull = GPIO_PULLDOWN_DISABLE; reset_config.port = oled_reset_pin; ESP_ERROR_CHECK(hal_gpio_init(&reset_config)); ESP_ERROR_CHECK(hal_gpio_set_level(oled_reset_pin, 0)); vTaskDelay(pdMS_TO_TICKS(10)); ESP_ERROR_CHECK(hal_gpio_set_level(oled_reset_pin, 1)); vTaskDelay(pdMS_TO_TICKS(10)); }
for (int i = 0; i < sizeof(oled_init_cmds); i++) { ESP_ERROR_CHECK(oled_send_cmd(oled_init_cmds[i])); }
ESP_LOGI(TAG, "OLED driver initialized successfully"); return ESP_OK; }
esp_err_t driver_oled_clear() { ESP_LOGD(TAG, "Clearing OLED display"); uint8_t clear_buffer[oled_width * oled_height / 8]; memset(clear_buffer, 0x00, sizeof(clear_buffer)); return oled_send_data(clear_buffer, sizeof(clear_buffer)); }
esp_err_t driver_oled_display_text(int row, int col, const char *text) { if (row < 0 || row >= oled_height / 8 || col < 0 || col >= oled_width / 8) { ESP_LOGE(TAG, "Text position out of bounds: row=%d, col=%d", row, col); return ESP_ERR_INVALID_ARG; }
ESP_LOGD(TAG, "Displaying text '%s' at row=%d, col=%d", text, row, col); driver_oled_set_cursor(row, col);
for (int i = 0; text[i] != '\0'; i++) { if (text[i] >= ' ' && text[i] <= '~') { oled_send_data((uint8_t *)&font8x8_basic[text[i] - ' '], 8); } else { oled_send_data((uint8_t *)&font8x8_basic[0], 8); } } return ESP_OK; }
esp_err_t driver_oled_display_number(int row, int col, int number) { char buffer[16]; snprintf(buffer, sizeof(buffer), "%d", number); return driver_oled_display_text(row, col, buffer); }
esp_err_t driver_oled_set_cursor(int row, int col) { ESP_LOGD(TAG, "Setting cursor to row=%d, col=%d", row, col); uint8_t cmd_buffer[2]; cmd_buffer[0] = 0xB0 + row; cmd_buffer[1] = ((col & 0x0F)) | 0x10; ESP_ERROR_CHECK(oled_send_cmd(cmd_buffer[0])); ESP_ERROR_CHECK(oled_send_cmd(cmd_buffer[1])); cmd_buffer[1] = ((col & 0xF0) >> 4); ESP_ERROR_CHECK(oled_send_cmd(cmd_buffer[1])); return ESP_OK; }
esp_err_t driver_oled_draw_hline(int row, int col, int length) { ESP_LOGW(TAG, "driver_oled_draw_hline not implemented yet"); return ESP_OK; }
esp_err_t driver_oled_draw_vline(int row, int col, int length) { ESP_LOGW(TAG, "driver_oled_draw_vline not implemented yet"); return ESP_OK; }
esp_err_t driver_oled_draw_rect(int row, int col, int width, int height) { ESP_LOGW(TAG, "driver_oled_draw_rect not implemented yet"); return ESP_OK; }
esp_err_t driver_oled_fill_rect(int row, int col, int width, int height) { ESP_LOGW(TAG, "driver_oled_fill_rect not implemented yet"); return ESP_OK; }
esp_err_t driver_oled_draw_pixel(int row, int col) { ESP_LOGW(TAG, "driver_oled_draw_pixel not implemented yet"); return ESP_OK; }
esp_err_t driver_oled_set_rotation(int rotation) { ESP_LOGW(TAG, "driver_oled_set_rotation not implemented yet"); return ESP_OK; }
|