если при обновлении сначала сделать экран.клир(), а потом выводить новое, то оно моргнет. Если делать это 100 раз в секунду (так часто оно не сможет конечно, там будет 10-20 раз максимум) то естественно будет дико мерцать. Но вообще делать клир() нет смысла - надо просто писать поверх старого
дак у ТСа (то есть у Гристана) новые данные не полностью затирают старые, а при попытке затереть пробелами какие-то белые квадраты появляются. Там вообще непонятно что накручено, возможно даже память переполняется учитывая ее количество.
Это не только у меня, есть тут тема на форуме у человека тоже: " отрисовка пробела для экрана ткая же, как и отрисовка цифры 4, к примеру. Там логика такова, что он не заменяет ранее засвеченные пикселы, а с каждым новым выводом как будто дорисовываются новые, а старые не гасятся. Символ 0 для него - это не перевести пиксел в положение "выключено", а просто не рисовать на этом пикселе ничего". Не очень понятно) но я не один такой. Попробую просто код с библиотекой экрана и одним символом, ради интереса.
если там какая-то такая кривая библиотека, то проще всего выкинуть эту аттини и взять ардуину нано или про-микро или типа того и использовать вот эту библиотеку https://github.com/NikolayDikiy/ASOLED
выкинь это всё. Аттини не для библиотек. Там надо делать всё ручками. Сбрасывать в SSD1306 ничего не надо. Закинул в ОЗУ, дёрнул D/C и всё - картинка на экране.
это не кривая библиотека, а принцип рисования фонтов с прозрачным фоном - символы фона не рисуются. а просто пропускаются. Например. все фонты в очень известной и раскрученной либе Adafruit_GFX работают именно так. Прозрачный фон букв позволяет выводить текст по изображению. Вот. для иллюстрации - прозрачный и непрозрачный текст (условно. конечно) Минус такого фонта - если нужно выести новую надпись поверх старой - то старую сначала надо явно стереть, а лишь потом выводить новую. Что. видимо. и создает проблемы ТС
у меня даже больше вопрос - нафига это в мегакомпактной библиотеке, заточенной специально под тини. там памяти тупо не хватит ни на какие фоны и прочие спецэффекты
если фонт был изначально без фона. переделать алгоритм не так просто. Я это проходил в библиотеке для светодиодных матриц - это нетривиальная задача. Проще выводить как есть... скорее всего так авторы библиотеки и поступили, переложив проблему очистки на юзеров
Если интересно как выглядит обновление пробелами Спойлер: видео В целом даже красивый спец.эффект Всем огромное спасибо, особенно akl Код (C++): uint32_t myTimer1; //bool refresh_flag=false; int temperature_old; #include <OneWire.h> #include <Tiny4kOLED.h> //библтотека OLED #include "HISKYF21_font.h" // шрифт const DCfont *currentFont = FONTHISKYF21; OneWire ds(4); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком void setup(){ oled.begin(64, 48, sizeof(tiny4koled_init_64x48r), tiny4koled_init_64x48r); oled.clear(); oled.on(); } void loop(){ byte data[2]; // Место для значения температуры // Определяем температуру от датчика DS18b20 ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память if (millis() - myTimer1 >= 5000) { myTimer1 = millis(); ds.reset(); // Теперь готовимся получить значение измеренной температуры ds.write(0xCC); ds.write(0xBE); // Просим передать нам значение регистров со значением температуры data[0] = ds.read(); // Получаем и считываем ответ. Читаем младший байт значения температуры data[1] = ds.read(); // А теперь старший float temperature = ((data[1] << 8) | data[0]) * 0.0625; //вычесление температуры if(temperature_old!=temperature) {temperature_old=temperature; oled.setCursor(16, 0); oled.setFont(FONT6X8); oled.print(F("TEMP:")); //заголовок oled.setFont((FONTHISKYF21)); //огромный шрифт oled.setCursor(9,2); oled.print(F(" .. ")); //точки вместо пробела, менее заметны при обновлении oled.setCursor(9,2); oled.print((temperature),1); //вывод температуры oled.setCursor(50,2); oled.print(F("/")); //знак цельсия } } }
Нет)) рано обрадовался. Пробелы тоже остаются как мусор, белым квадратом. Если что то толковое получится напишу. Спасибо еще раз
команды для датчика температуры убери из основного цикла вовнутрь 5-секундного, а то он теребонькается тысячи раз в секунду что с этими пробелами непонятно. Я хз насчет всяких там прозрачных шрифтов, но мне кажется у прозрачных шрифтов и пробел должен быть прозрачный, а он типа инвертированный получается. попробуй вместо принт("5 пробелов") сделать oled.writeAsciiInternal(' '); oled.writeAsciiInternal(' '); oled.writeAsciiInternal(' '); oled.writeAsciiInternal(' '); oled.writeAsciiInternal(' '); вот так 5 раз
еще желательно это проверить на обычном нормальном шрифте, а то этот огромный FONTHISKYF21 как-то не очень понятно откуда взят и почему вдруг он стал огромный, если это он https://github.com/datacute/TinyOLED-Fonts/blob/master/src/HISKYF21_font.h то там обычный 6х8
Шрифт рисовал сам. Там только цифры и несколько знаков, за основу брал подобный цифровой шрифт из этой же папки. Точно, пробел то я не добавлял в шрифт.... Стыдно