Распечатать текст при любом значении Y на SSD1306

lcd ssd1306

Я пытаюсь напечатать несколько строк текста с определенными значениями Y на SSD1306 ЖК-дисплее 128x64. .

Я использую библиотеку ssd1306 Алексея Дынды. Изначально я хотел использовать более распространенные библиотеки ЖК-дисплеев, такие как библиотека ЖК-дисплеев Adafruit SSD1306, однако, к сожалению, она не отображается. можно установить собственные контакты I2C для большинства таких библиотек, что необходимо, поскольку я использую специальную плату с чипом ESP32-WROOM-DA. ssd1306 от Dynda, похоже, способен на это.

У меня есть следующий пример кода, который печатает 6 строк текста:

#include "ssd1306.h"
#include "nano_gfx.h"

const int PIN_I2C_SCL = 16;
const int PIN_I2C_SDA = 13;

void LCDTextDraw(int x, int y, const char* text)
{
  EFontStyle fontStyle;
  
  ssd1306_printFixed(x, y, text, fontStyle);
}

void LCDRectDraw(int x, int y, int w, int h)
{
  ssd1306_fillRect(x, y, x + w, y + h);
}

void LCDScreenClear(bool fill)
{
  ssd1306_clearScreen();

  if (fill)
    LCDRectDraw(0, 0, 128, 64);
}

void LCDInit()
{
  ssd1306_setFixedFont(ssd1306xled_font6x8);
  ssd1306_128x64_i2c_initEx(PIN_I2C_SCL, PIN_I2C_SDA, 0);
}

void setup() 
{
  Serial.begin(9600);

  pinMode(PIN_I2C_SCL, OUTPUT);
  pinMode(PIN_I2C_SDA, OUTPUT);

  LCDInit();
  LCDScreenClear(true);

  LCDTextDraw(30, 0, "TEST 1");
  LCDTextDraw(30, 10, "TEST 2");
  LCDTextDraw(30, 20, "TEST 3");
  LCDTextDraw(30, 30, "TEST 4");
  LCDTextDraw(30, 40, "TEST 5");
  LCDTextDraw(30, 50, "TEST 6");
}

void loop() 
{}

С помощью которого я хочу распечатать 6 строк текста, каждая строка равномерно расположена по вертикали с интервалом 10 пикселей.

На моем ЖК-дисплее отображается следующий результат:

Как вы можете видеть, текстовые строки не расположены равномерно по вертикали, как хотелось бы, с большим пространством между строками TEST 4 и TEST 5. .

Посмотрев на определение функции ssd1306_printFixed, которую я использую для печати текста в приведенном выше примере, оказалось, что она может печатать строки текста только в определенных фиксированных позициях по оси Y. :

@warning ssd1306_printFixed() может выводить символы в фиксированных позициях y: 0, 8, 16, 24, 32 и т. д.
Если вы укажете [10,18], ssd1306_printFixed() будет выводить текст, начиная с позиции [10,16].

Поэтому я также попробовал использовать функцию ssd1306_print (которая использует курсор для обозначения места печати на экране), которая не имеет этого предупреждения в объявлении заголовка. Я заменил свою функцию LCDTextDraw на:

void LCDTextDraw(int x, int y, const char* text)
{
  ssd1306_setCursor8(x, y);
  ssd1306_print(text);
}

Однако на моем ЖК-дисплее это по-прежнему давало точно такой же результат, с теми же проблемами с интервалом.

Как правильно печатать текстовые строки с любым значением Y на ЖК-дисплее?

Спасибо, что прочитали мой пост, любые советы приветствуются.

, 👍3

Обсуждение

https://wokwi.com/projects/341940000159433299, @jsotola

@jsotola, беглый взгляд на ваш код, связанный с Adafruit, и я думаю, что вижу те же ограничения по вертикальным числам, которые комментировал Рохит., @st2000

@Runsva, это всего лишь предположение, но после написания кода интерфейса с небольшим дисплеем Sharp могут возникнуть некоторые трудности с устранением аномалий, которых можно избежать, разместив изображения (символы) в ограниченных местах. Кроме того, эти символы могут быть частью программирования дисплея, и их размещение ограничено дисплеем. Я думаю, ты можешь делать то, что хочешь. Но вам, возможно, придется написать весь код с нуля., @st2000


1 ответ


Лучший ответ:

1

Оказывается, использовать библиотеку Adafruit SSD1306 гораздо проще, чем я сначала думал. Достаточно указать контакты I2C, используемые с Wire, и передать их как ссылку на конструктор Adafruit_SSD1306. Кроме того, в библиотеке Adafruit нет проблем с неравномерным вертикальным расстоянием.

Эквивалентный код ниже с использованием библиотеки Adafruit:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const int PIN_I2C_SCL = 16;
const int PIN_I2C_SDA = 13;

Adafruit_SSD1306 LCD(128, 64, &Wire);

void LCDTextDraw(int x, int y, const char* text, byte size)
{
  LCD.setCursor(x, y);
  LCD.setTextSize(size);
  LCD.print(text);
  LCD.display();
}

void LCDRectFill(int x, int y, int w, int h, int color)
{
  LCD.fillRect(x, y, w, h, color);
}

void LCDScreenClear(bool fill)
{
  LCD.clearDisplay();
  LCD.display();
  LCD.setTextColor(WHITE, BLACK);

  if (fill)
    LCDRectFill(0, 0, 128, 64, 1);
}

void LCDInit()
{
  LCD.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void setup() 
{
  Serial.begin(9600);
  
  pinMode(PIN_I2C_SCL, OUTPUT);
  pinMode(PIN_I2C_SDA, OUTPUT);

  Wire.setPins(PIN_I2C_SDA, PIN_I2C_SCL);
  Wire.begin();

  LCDInit();
  LCDScreenClear(true);

  LCDTextDraw(30, 0, "TEST 1", 1);
  LCDTextDraw(30, 10, "TEST 2", 1);
  LCDTextDraw(30, 20, "TEST 3", 1);
  LCDTextDraw(30, 30, "TEST 4", 1);
  LCDTextDraw(30, 40, "TEST 5", 1);
  LCDTextDraw(30, 50, "TEST 6", 1);
}

void loop() 
{}

Теперь дает желаемый результат:

,