Распечатать текст при любом значении Y на 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 на ЖК-дисплее?
Спасибо, что прочитали мой пост, любые советы приветствуются.
@Runsva, 👍3
Обсуждение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()
{}
Теперь дает желаемый результат:
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
- Отправка значения с одного Arduino на другой
- Черные квадраты дисплея Arduino 16x2
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
https://wokwi.com/projects/341940000159433299, @jsotola
@jsotola, беглый взгляд на ваш код, связанный с Adafruit, и я думаю, что вижу те же ограничения по вертикальным числам, которые комментировал Рохит., @st2000
@Runsva, это всего лишь предположение, но после написания кода интерфейса с небольшим дисплеем Sharp могут возникнуть некоторые трудности с устранением аномалий, которых можно избежать, разместив изображения (символы) в ограниченных местах. Кроме того, эти символы могут быть частью программирования дисплея, и их размещение ограничено дисплеем. Я думаю, ты можешь делать то, что хочешь. Но вам, возможно, придется написать весь код с нуля., @st2000