OLED 128x32 - очистка строки

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем AlexAxel, 15 июн 2018.

  1. AlexAxel

    AlexAxel Нерд

    Добрый день. Имеется OLED-экран 128х32 на 1306, весьма распространенный. Код:
    Код (C++):
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    int i=0;
    int b=0;

    void setup()
    {
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.clearDisplay();
       display.display();
    }

    void loop()
    {
    display.setCursor(0, 0);
    i++;
    b++;
      display.println("N1: "+ String(i,DEC));
      display.println("N2: "+ String(b,DEC));
       display.display();
    }
    При таких раскладах символы, которые суть результат приращения переменных i и b не заменяются на новые, а как бы рисуются прямо поверх предыдущих выведенных. Если в цикле поставить команду display.clearDisplay() (очистка экрана) - то все в порядке, полностью обновляется содержимое экрана. Но по ряду причин меня это не устраивает - надо очищать только область, в которой выводятся значения переменных. Возможно ли реализовать такую очистку? или какую-нибудь другую библиотеку мож использовать?
     
  2. DIYMan

    DIYMan Гуру

    Сперва пиши в той области строку из пробелов, длиной, равную текущей - потом выводи свою строку. ЕМНИП в библиотеке используется экранный буфер, так что всё будет норм в плане быстродействия - весь экран очищать не придётся, т.к. конкретный вывод на железо делается вызовом метода display() библиотеки.

    Хотя, конечно, скетч странноватый - с дичайшей частотой в loop писать на экран. Ты бы хоть delay поставил в конце loop, на секунду.
     
    BAR__MEN нравится это.
  3. AlexAxel

    AlexAxel Нерд

    Это просто пример скетча, чтобы показать. В оригинале изменение производится по внешнему сигналу. Про пробелы в курсе, но эта штука хорошо отрабатывает на LCD16x2, а здесь не годится - отрисовка пробела для экрана ткая же, как и отрисовка цифры 4, к примеру. Там логика такова, что он не заменяет ранее засвеченные пикселы, а с каждым новым выводом как будто дорисовываются новые, а старые не гасятся. Символ 0 для него - это не перевести пиксел в положение "выключено", а просто не рисовать на этом пикселе ничего
     
    Последнее редактирование: 15 июн 2018
  4. DIYMan

    DIYMan Гуру

    Ага, ясно. Тогда, имхо, надо смотреть, чего там в библиотеке сделано для работы с экранным буфером, и дописать туда, как вариант, очистку определённой его области. Может, оно там уже есть где-то даже.
     
  5. Daniil

    Daniil Гик

    А нельзя вычислить координаты символа и вписать по этим координатам нужное число?
     
  6. DetSimen

    DetSimen Гуру

    Там, в библиотеке, флажок есть, перепечатывать символ или накладывать на уже имеющийся
     
    DIYMan нравится это.
  7. AlexAxel

    AlexAxel Нерд

    А не ткнете где? Пожалуйста...
     
  8. DetSimen

    DetSimen Гуру

    Я не у компа щас. В понедельник только.
     
  9. DetSimen

    DetSimen Гуру

    Нет, в Адафрутовской библиотеке я такова не нашол. У меня другая библиотека, безбуферная, там таких проблем нет.
     
  10. AlexAxel

    AlexAxel Нерд

    Спасибо за ответ. А какая у Вас библиотека? И как она к памяти относится по сравнению с Адафруит (та жрет динамическую память как не в себя)
     
  11. DetSimen

    DetSimen Гуру

    Моя биб-ка называеца SSD1306Ascii. Экранного буфера у нее нет, но и графики тоже нет, библиотека предназначена для вывода текста. Примерно так


    Если извратиться, то можно и самому спрайты рисовать.
    Видео моё. Мерцания видит только камера телефона, на глаз они незаметны
     
    Andrey12 и AlexAxel нравится это.
  12. AlexAxel

    AlexAxel Нерд

    Круть, то что надо в плане памяти. Необходимо и достаточно. А какой командой установка курсора происходит на точку? setCursor(x,y) двигает только по оси х, а на изменение y ноль эмоций. И перенос длинного текста как нибудь реализовать можно?
     
  13. AlexAxel

    AlexAxel Нерд

    Вопрос снят, значение y - от 0 до 3.
     
  14. DetSimen

    DetSimen Гуру

    "У" меняеца дискретно, в зависимости от высоты шрифта
     
    AlexAxel нравится это.
  15. DetSimen

    DetSimen Гуру

    это же текстовая биб-ка
     
    AlexAxel нравится это.
  16. AlexAxel

    AlexAxel Нерд

    Ага, я понял уже. А с переносом строки как поступать? Длинная строка уходит за край экрана...
     
  17. DetSimen

    DetSimen Гуру

    Разбивать строку только. Мануально.
    Она же ничего нигде не хранит, сразу выводит на экран то, что ей подсунули.
     
    AlexAxel нравится это.
  18. DetSimen

    DetSimen Гуру

    Я бы бегущую строку сделал, если вся не помещается
     
    AlexAxel нравится это.
  19. AlexAxel

    AlexAxel Нерд

    да, на этом наверное остановлюсь. спасибо еще раз
     
    DetSimen нравится это.
  20. DetSimen

    DetSimen Гуру

    Спасиба в стакан не налёшь. :(
    Но можно нажать "Мне нравица". :)
     
    Andrey12 и AlexAxel нравится это.