Медленная частота обновления на экране I2C OLED
Я пытаюсь создать небольшую портативную консоль с 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: проблема может заключаться в самом экране. К сожалению, у меня нет резервной копии. Я закажу один как можно скорее и проверю эту теорию.
@Marco Giacomin, 👍2
Обсуждение1 ответ
Лучший ответ:
Решено путем обновления библиотеки Adafruit sdd1306 и библиотеки Adafruit GFX
EDIT: почему меня минусуют?
«Система» автоматически отклонила ваш вопрос, потому что в нем очень мало контента. Я проголосовал за это, чтобы отменить голосование против. Пожалуйста, отредактируйте свой ответ, чтобы удалить РЕДАКТИРОВАТЬ и добавить немного больше информации. Возможно, номера версий библиотек, которые не работали, и номера версий, которые вы используете сейчас., @VE7JRO
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- OVF в последовательном мониторе вместо данных
- ЖК-дисплей I2C отображает странные символы
- Соединение I2C зависает Ведущий если ведомый отключается
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
Я бы предложил использовать
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