E-Ink дисплей 4.2" 3 цвета, проблемы с отображением при разном расположении объектов на экране
- Войдите на сайт для отправки комментариев
Приветствую всех!
Я в самом начале изучения С++, да и программирования вообще, можно сказать что пилю самый первый свой проект.
Изучаю вот такой дисплей: https://ru.aliexpress.com/item/4-2inch-E-Ink-Display-Module-400x300-E-paper-Module-Red-Black-White-Three-color-SPI/32829541822.html
Есть проблемы при обображении объектов, в координатах которых x > 255. Если x <= 255, то все корректно. Прошу помочь, если не лень разбираться, так как сам не могу справиться. Есть мысль, что величина координаты x ограничена 1 байтом, но найти где это возможное ограничение я не смог. Да и не факт, что мое предположение верно.
На рисунках примеры корректного и некорректного отображения. Рис.1 - вывод символов и строк. Символы и строки не отображаются правильно, если координата x > 255. Черная единичка - координата x <= 255, все правильно. Чуть ниже - та же единичка, но x = 256. Красным сначала должна быть строка "3 -test" с x = 256, а за тем то же самое, но с x = 255
рис.2 - прямоугольники. Прямоугольники рисуются нормально с любыми координатами x, только если ширина рисунка (буфера рисунка) <= 8, как первые два незаполненных прямоугольника. Далее красные заполненные, здесь ширина рисунка (буфера рисунка) задана 16 и координаты у левого x < 255, а у правого x > 255. Прямоугольники изначально одинаковые, шириной 8 и высотой 26, но правый получился растянут через пиксель в вертикали. В самом низу два одинаковых заполненных прямоугольника шириной 16 и высотой 26. Левый при x < 255 - правильно, правый при x > 255 - растянут в вертикали и сужен в горизонтали. Координата "y" ни как не сказывается на корректности отображения, ни до 255, ни после.
Страничка дисплея на сайте производителя https://www.waveshare.com/wiki/4.2inch_e-Paper_Module_(B)
Скачать библиотеку с сайта производителя https://www.waveshare.com/w/upload/a/af/4.2inch-e-paper-module-b-code.7z
Тут та же библиотека с добавленным мной большим шрифтом и рис.1 и 2 в более высоком качестве, чем позволяет форум https://cloud.mail.ru/public/AzzQ/wTYustRCK
Скетч с примером и комментариями
#include <SPI.h> #include <epd4in2b.h> #include <epdpaint.h> #define COLORED 0 #define UNCOLORED 1 Epd epd; // e-paper дисплей. Подключение: RST 8, DC 9, CS 10, BUSY 7, DIN 11, CLK 13, gnd - gnd, 3.3 - 5v (на 3.3 не работает) // ========================================= void setup() { Serial.begin(9600); // e-Paper if (epd.Init() != 0) { Serial.print("e-Paper init failed"); return; } epd.ClearFrame(); // This clears the SRAM of the e-paper display Serial.println("Started"); unsigned char image[512]; // символы и строки не отображаются правильно, если координата x > 255 // смотри рис. 1 Paint paint(image, 64, 64); //ширина должна быть кратна 8 paint.Clear(COLORED); // чистим paint.DrawCharAt(2, 3, 49, &Font64d, UNCOLORED); // рисуем символ "1" белым на черном фоне и потом размещаем его в разных координатах epd.SetPartialWindowBlack(paint.GetImage(), 255, 0, paint.GetWidth(), paint.GetHeight()); // тут, где координата x <= 255, все правильно epd.SetPartialWindowBlack(paint.GetImage(), 256, 70, paint.GetWidth(), paint.GetHeight()); // тут, где координата x > 255, отрисовано не правильно Paint paint1(image, 128, 32); paint1.Clear(COLORED); paint1.DrawStringAt(2, 3, "3 -test", &Font24, UNCOLORED); // пишем строку "3 -test" белым на красном фоне и потом размещаем ее в разных координатах epd.SetPartialWindowRed(paint1.GetImage(), 256, 200, paint1.GetWidth(), paint1.GetHeight()); // тут, где координата x > 255, отрисовано не правильно epd.SetPartialWindowRed(paint1.GetImage(), 255, 256, paint1.GetWidth(), paint1.GetHeight()); // тут, где x <= 255, все правильно, хотя y > 255 // прямоугольники рисуются нормально с любыми координатами x, только если ширина рисунка <= 8, // смотри рис. 2 Paint paint2(image, 8, 64); // здесь ширина рисунка <= 8, все в порядке не зависимо от координаты x paint2.Clear(UNCOLORED); paint2.DrawRectangle(0, 0, 7, 25, COLORED); // рисуем черный прямоугольник и потом размещаем его в разных координатах epd.SetPartialWindowBlack(paint2.GetImage(), 10, 0, paint2.GetWidth(), paint2.GetHeight()); epd.SetPartialWindowBlack(paint2.GetImage(), 360, 0, paint2.GetWidth(), paint2.GetHeight()); // рисуется правильно, даже если координата x > 255 Paint paint4(image, 16, 64); // здесь ширина рисунка > 8, и рисует не то, что нужно, если в координатах x > 255 paint4.Clear(UNCOLORED); paint4.DrawFilledRectangle(0, 0, 7, 25, COLORED); // рисуем красный заполненный прямоугольник шириной 8 и потом размещаем его в разных координатах epd.SetPartialWindowRed(paint4.GetImage(), 10, 70, paint4.GetWidth(), paint4.GetHeight()); // здесь x <= 255, и все рисуется правильно epd.SetPartialWindowRed(paint4.GetImage(), 360, 70, paint4.GetWidth(), paint4.GetHeight()); // здесь x > 255, не корректно, через пиксель растянут по вертикали paint4.Clear(UNCOLORED); paint4.DrawFilledRectangle(0, 0, 15, 25, COLORED); // рисуем черный заполненный прямоугольник шириной 16 и потом размещаем его в разных координатах epd.SetPartialWindowBlack(paint4.GetImage(), 10, 130, paint4.GetWidth(), paint4.GetHeight()); // здесь x <= 255, и все рисуется правильно epd.SetPartialWindowBlack(paint4.GetImage(), 360, 130, paint4.GetWidth(), paint4.GetHeight()); // здесь x > 255, не корректно, сужен до 8 и вытянут по вертикали epd.DisplayFrame(); // This displays the data from the SRAM in e-Paper module epd.Sleep(); // Deep sleep } // ========================================= void loop() { }
Заранее благодарю за помощь
Написал производителю, он исправил ошибку в своих библиотеках. Теперь все отображается верно.
Может кому пригодится информация
Написал производителю, он исправил ошибку в своих библиотеках. Теперь все отображается верно.
Может кому пригодится информация
Спасибо! Более чем пригодилась!!!. С Вашим кодом заработала
А вы показания с датчиков не выводили E-ink?
Это не мой код, это производитель. ))
Показания выводил, конечно.
Коли не сложно, поделитесь примером вывода показаний датчиков, а то всю голову сломал
Я могу только вывод на экран показать. Съем данных с датчиков - это от датчиков зависит.
Вывод в два этапа,
на первом при инициализации в setup рисуем один раз таблицы и надписи, которые не меняются
На втором в loop - выводим данные из переменных на экран