Медленная частота обновления на экране I2C OLED

arduino-uno i2c performance

Я пытаюсь создать небольшую портативную консоль с 6 кнопками и 0,96-дюймовым OLED-дисплеем I2C: https://imgur.com/a/AKiRMWN

Кнопки направления используют аналоговый контакт и различные резисторы для экономии места, а две остальные кнопки используют цифровой контакт. Однако, несмотря на использование тех же библиотек, что и в других проектах, скетч работает очень медленно, что приводит к снижению частоты обновления экрана.

Вот код:

#define wid 64  // Определяет половину ширины экрана для графической ссылки
#define hei 32

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display;  // Создаем дисплей

int av;
const float sp = 3;
float pos[2]={0,0};  // Позиция курсора

void setup() {
   delay(100);  // Даем экрану время для настройки
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // Инициализировать дисплей с адресом I2C 0x3C
   display.clearDisplay();
   display.setTextColor(WHITE);
   display.display();   // Очищает экран от любых оставшихся изображений
  }

void loop() {
  av=analogRead(A0);  // Считывает направленный ввод
  av=inputRefine(av); // Присваивает ему направление
  switch (av)         // соответственно изменяет положение курсора
  {
    case 1:
    pos[1]-=sp;
    break;

    case 2:
    pos[0] += sp;
    break;

    case 3:
    pos[1] += sp;
    break;

    case 4:
    pos[0] -= sp;
    break;
  }
  display.clearDisplay();

  display.setCursor(5,5);
  display.print(millis());  // Печатает системное время в углу экрана

  display.drawCircle(wid + pos[0], hei + pos[1], 5, WHITE);  // Рисует круг в позиции курсора
  display.display();
  }

int inputRefine(int av)
{
  int a=0;
  if (av>500&&av<600) a=2;
  else if(av>1000) a=3;
  else if(av>920&&av<950) a=4;
  else if(av>680&&av<720) a=1;

  return a;
}

Что замедляет выполнение?

EDIT: даже закомментирование любой ненужной строки не устраняет отставание. РЕДАКТИРОВАТЬ 2: проблема может заключаться в самом экране. К сожалению, у меня нет резервной копии. Я закажу один как можно скорее и проверю эту теорию.

, 👍2

Обсуждение

Я бы предложил использовать int вместо float для float pos[2]={0,0};. Я бы предложил добавить некоторый код, который измеряет, сколько мс использует каждая часть вашего кода, и выводит его на последовательную консоль., @Gerben

Вот отличный способ отладки такого рода вещей, тем более, что скетч довольно прост. Закомментируйте все, кроме строк, которые обновляют отображение. Оставьте их в использовании фиктивных значений для поз. Теперь вы знаете, как быстро он может обновляться. Затем добавьте вещи обратно, одну за другой, и когда это замедлится, вы поймете, в чем проблема. Кроме того, я поддерживаю комментарий @Gerben о числах с плавающей запятой - никогда не используйте их на процессорах такого типа, если в этом нет крайней необходимости; они очень-очень медленные по сравнению с целыми числами., @romkey

Я удалил все ненужные строки и оставил только display.print(millis()); графическая команда, но отставание все равно остается. Может ли это быть аппаратной проблемой?, @Marco Giacomin

Вы рассчитывали возможную частоту обновления? Проверьте, что происходит на «display.display();», https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cpp#L886. Сколько байт передано? Сколько времени это займет?, @Mikael Patel

Я ужасно неопытен в том, как обрабатывается исходный код библиотеки, но я попытался поменять местами каждую часть оборудования, связанную с консолью (единственная часть, которой у меня нет по крайней мере двух копий, — это экран), и отставание не исчезло. т прекратить. Думаю проблема может быть в экране., @Marco Giacomin


1 ответ


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

2

Решено путем обновления библиотеки Adafruit sdd1306 и библиотеки Adafruit GFX

EDIT: почему меня минусуют?

,

«Система» автоматически отклонила ваш вопрос, потому что в нем очень мало контента. Я проголосовал за это, чтобы отменить голосование против. Пожалуйста, отредактируйте свой ответ, чтобы удалить РЕДАКТИРОВАТЬ и добавить немного больше информации. Возможно, номера версий библиотек, которые не работали, и номера версий, которые вы используете сейчас., @VE7JRO