Библиотека Adafruit_GFX
- Войдите на сайт для отправки комментариев
Ср, 26/12/2018 - 02:23
Есть TFT дисплей 3.2 Продавец с Али в комплекте дал библиотеку Adafruit_GFX 1.0.2 (актуальная 1.3.6) и MCUFRIEND 2.9.1 (актуальная 2.9.9)
MCUFRIEND кое-как удалось сменить на актуальную. А Adafruit никак.
1. Есть ли шанс все же обновить Adafruit?
2. Собственно, пытался обновить ради ускорения. Очень медленно рисует, мои данные выводит 500мс.
Будет ли быстрее, если обновить удастся?
Шанс есть. А в чем проблема-то? Нажимаем <ctrl> + <shift> + I . Находим там Adafruit GFX и устанавливаем.
MCUFRIEND кое-как удалось сменить на актуальную. А Adafruit никак.
1. Есть ли шанс все же обновить Adafruit?
2. Собственно, пытался обновить ради ускорения. Очень медленно рисует, мои данные выводит 500мс.
Будет ли быстрее, если обновить удастся?
а можете обьяснить, как это "не удается обновить библиотеку"? - вы ее как обновляете? - надо скачать новую и заменить ею старую. Что вообще может помешать при этом - не представляю
Насчет станет ли быстрее - я бы особо не рассчитывал. Чтобы убыстрить процесс в разы - обычно нужно переписать библиотеку с нуля, а не выпустить новую версию. Процентов 20 может прибавить в скорости - и то хорошо.
Для начала я бы тщательно пересмотрел свой собственный код работы с дисплеем - может это не библиотека виновата?
Для начала я бы тщательно пересмотрел свой собственный код работы с дисплеем - может это не библиотека виновата?
Неистово плюсую. Бывает, напишешь в лоб - вроде норм. Потом отложишь на пару дней, вернёшься, оптимизируешь - и получаешь прирост в производительности отрисовки в несколько раз. И такое постоянно :)
Не, ну как обновлять библиотеки я все же понимаю. Проблема в том, что не встают.
И с MCUFRIEND я рано обрадовался. Пока ситуация такая. Если обновить Adafruit - ошибка "declaration of 'FreeSmallFont' as array of references". Причем SmallFont относится как раз к MCUFRIEND. Если обновить MCUFRIEND , на экран ничего не выводится.
Двадцать процентов было бы уже не плохо.
Насчет кода, вот код вывода который выполняется ок. 100 мс. Причем отнюдь не из-за опроса сенсора.
Много тут можно оптимизировать?
Много тут можно оптимизировать?
Много. Во-первых, в строке номер 1 надо передавать String по ссылке, а не по значению. Во-вторых - вангую, что в функции utf8rus ( строка 4) - тоже идёт передача параметра типа String по значению. В-третьих - мешаем мух с котлетами: зачем-то в этой функции идёт работа с Blynk. В-четвёртых - в строке 12 совершенно дикое склеивание. В-пятых: вы несколько раз делаете float(tmp)/10 - вместо этого можно делать это один раз в начале функции, потом уже используя результат. В-шестых: в строке 6 идёт опрос датчиков температуры - опять путанье мух с котлетами. В-седьмых: функция tone - блокирующая, и опять тут не к месту, т.к. очередная порция смешения мух с котлетами.
Вердикт: вывод в интерфейс должен быть отделён от работы с данными - никаких опросов датчиков и работы с Blynk там физически быть не должно. Плюс - поправлять, чтобы не было дико лишней работы с оперативкой. Плюс - если параметр Name имеет ограниченный набор значений - то лучше один раз переконвертировать, и потом уже в этот параметр подставлять уже переконвертированные значения, таким образом избавившись от вызова utf8rus каждый раз внутри функции.
Это то, что сразу бросилось в глаза.
Не, ну как обновлять библиотеки я все же понимаю. Проблема в том, что не встают.
По нормальному объяснить, в чем проблема, так и не желаете?
DIYMan, спасибо. Посмотрю, что можно сделать. Разносить опрос датчика, обработку и вывод его значения будет весьма неудобно. Но что не сделаешь для быстродействия.
asam, очень желаю. Подскажите, как. Могу только повторить. При обновлении MCUFRIEND ошибок нет, но вывода на экран не происходит. Это видно и по скорости работы программы.
При обновлении Adafruit вылезает ошибка
declaration of 'FreeSmallFont' as array of references
В коде есть строка
которая относиться как раз к библиотеке MCUFRIEND. Чем еще можно прояснить ситуацию?
дак это две разные декларации
FreeSmallFont
и
extern
uint8_t SmallFont[];
Да, но компилятор при ошибке указывает именно на эту строку.
Да, но компилятор при ошибке указывает именно на эту строку.
И что теперь? Вешаться?
В общем, Вас уже дважды просили объяснить толком. Для особо непонятливых, объясняю смысл слова "толком".
1. Проверочный скетч в студию полностью (копипастом)
2. Ссылку на библиотеку в студию
3. Текст сообщения об ошибке в студию полностью (копипастом)
Если, по каким-то причинам, "нет", то "на нет и суда нет".
DIYMan, спасибо. Посмотрю, что можно сделать. Разносить опрос датчика, обработку и вывод его значения будет весьма неудобно. Но что не сделаешь для быстродействия.
Leopoll - вы не поняли. Разносить надо обязательно, и делать это надо всегда, не только потому, что у вас тормозит вывод на экран. И пусть это для вас "неудобно". А чтобы в следующий раз не было "неудобно" исправлять - сразу пишите правильно.
Поймите, такая вещь как Blynk - легко может замедлять ваш вывод на экран раз в двадцать. Более того, если бы у вас в программе были какие-то критичные к быстродействию куски - такое программирование как у вас, где перемешана работа с сетью, с датчиками, с экраном - может сделать программу не просто медленной, а вовсе не рабочей. Все процедуры, требующие большого времени исполнения - надо оформлять отдельным кодом в неблокирующем режиме, чтобы эти действия выполнялись "за кадром" и не мешали основной программе.
несмотря на "желание" - вы так и не написали, как вы обновляете библиотеки. Понимаете, библиотеки при обновлении просто в принципе не могут "не встать" - поэтому вас и просят написать, как вы это делаете.
Или же вы просто выражаться не умеете и термином "библиотеки не встали" описываете то, что у вас с обновленными либами код не собирается? - ну так это не потому, что "библиотеки не установились", а потому что ваш код написан под старую библиотеку и для новой не подходит. Перепишите код под новую библиотеку и все заработает.
b707, спасибо, конечно вы правы. Если не трудно, дайте ссылку, как создавать неблокирующий режим. Мне казалось, полноценной многозадачности в ардуино нет. Во время выполнения любой фунции остальные не работают.
Да, видимо выражаться не умею. Конечно, код написан под старые библиотеки. Надеялся на обратную совместимость. Нет нигде мануала, как адаптировать код под новые? Наверно ведь не так много отличий, и многие должны были это проходить. Если нет, то сделаю все "в студию", надо время.
ну вот к примеру идеальные неблокирующие функции и, даже три
Мне казалось, полноценной многозадачности в ардуино нет. Во время выполнения любой фунции остальные не работают.
Полноценной многозадачности нет, но можно несколько задач выполнять попеременно. Именно поэтому большие задачи надо разбивать на маленькие кусочки, выполняющиеся как можно быстрее - чтобы между частями одной задачи успевать выполнять части других. Например, одновременно а)выводить на TFT экран секундомер, б)прокручивать на том же экране движущуюся строку, в)при этом без задержек реагировать на кнопки управления и г) еще в фоне 30 раз в секунду считывать и регулировать какой-нибудь параметр. А пользователю будет казаться, что программа все это делает разом.
мануала не встречал. Общий принцип простой - внимательно читаете ошибки, которые выдает компилятор(включить в опциях расширенный вывод) - находите в библиотеке строки, в которых ошибки возникают, сравниваете эти места со старой версией и разбираетесь, что надо поменять.
А имеет смысл проверять предыдущее значение и вывод на экран делать только если данные изменились? Тогда время обработки будет сильно зависить от потока данных.
А имеет смысл проверять предыдущее значение и вывод на экран делать только если данные изменились? Тогда время обработки будет сильно зависить от потока данных.
В общем случае выводить на экран стоит только изменившиеся данные.
А имеет смысл проверять предыдущее значение и вывод на экран делать только если данные изменились? Тогда время обработки будет сильно зависить от потока данных.
Всем спасибо за помощь.
Еще есть вопрос. Не буду создавать новую тему. Использую библиотеку SimpleTimer. Работает не очень. Есть проблемы с именованными таймерами. Например в коде:
Любой таймер, помещенный на первом месте в этом списке, работать не будет.
Можете подсказать хорошую библиотеку таймера, если возможно, то чтобы синтаксис команд не очень отличался?
Например в коде:
Любой таймер, помещенный на первом месте в этом списке, работать не будет.
И на втором месте - тоже не будет работать. В таком коде, что у вас - ТОЛЬКО ПОСЛЕlНИЙ ТАЙМЕР работает. Потому что у вас в коде только один таймер, а не три.
Чтобы было понятнее, ваш код аналогичен вот такому:
как выдумаете, если последовательно ОДНОЙ И ТОЙ ЖЕ переменной присвоить разные значения - она будет все их помнить? :) - смешной вопрос, правда?
Ну так у вас точно также - у вас везде один и тот же таймер с названием timer...
Правильный код для трех таймеров:
а вообще, для таких редких событий никакие библиотеки с таймерами вовсе не нужны, это пишется в одну строку на основе millis
Совершенно точно, все таймеры кроме первого работают. И в официальном примере timer1, timer2 нет.
http://playground.arduino.cc/Code/SimpleTimer#Example
ну Ок, Вы правы - ваши таймеры поддерживают несколько интервалов в одном инстансе таймера.
Почему первый не запускается - я поискал в Гугле и нашел, что часть пользователей тоже жалуется на это, а другие пишут, что у них все ОК. Возможно, библиотека плохо совместима с какими-то версиями Ардуино ИДЕ.
Вообще, я бы на Вашем месте отказался от этой библиотеки. Чуть выше в ветке мы с вами обсуждали "многозадачность" Ардуино - так вот, эта библиотека абсолютно никк не помогает построить программу. быстро переключающуся между задачами. Чтобы получить быстро выполняющийся код - нужно рабивать каждую задачу на маленькие подзадачки и выполнять их по отдельности. Эта библиотека просто запускает большие задачи по заданным интервалам, что, как я уже говорил - в разы проще делать вручную буквально одной строкой кода.
Ну, с библиотекой удобнее. У меня не только редкие события, это для примера. Ну, ладно.
Все же прошу помощи с MCUFRIEND.
Тестовый код:
Библиотеки продавца, с ними работает. Тамже доки на экран.
На новой MCUFRIEND не работает. Ошибок нет. На экран ничего не выводится. Может экран такой кривой, что только с этой версией и может работать?
Все же прошу помощи с MCUFRIEND.
Может экран такой кривой, что только с этой версией и может работать?
в MCUFriend по умолчанию поддержка части дисплеев выключена.
В папке examples этой библиотеки есть два скетча для диагностики дисплея - LCD_ID_readnew и LCD_ID_readreg
Запустите их и напишите сюда ID вашего дисплея
В тестовом примере на старой библиотеке команда tft.readID() выдает 37671.
Скетчи из exapmles похоже дисплей не опознают.
В скетче read_new в комментах указаны другие варианты распиновки. Надо пробовать? У меня Mega 2560.
попробуйте еще пример
dioagnose_TFT_support
В тестовом примере на старой библиотеке команда tft.readID() выдает 37671.
Leopoli
в файле mcufriend.cpp раскомментируйте строчку #define OFFSET_9327 32 - примерно 20-ая - 23-я строка
Она не закомментирована.
На всякий раскоменнтировал все подобные строки. Эффекта нет.