MoDyz: Стрелочные индикаторы
- Войдите на сайт для отправки комментариев
Основная задача Android-приложения MoDyz - создание удобного интерфейса для связи с микроконтроллерами по Bluetooth или WiFi. Изначально упор делался на отображении информации и динамическом представлении ее в графическом виде. Эдакая рисовалка с минимумом органов управления. Тема с представлением первой версии была открыта на форуме где-то в 17-м году.
Потом в приложение добавлялись разные кнопки, движки, крутилки, поля ввода и прочие элементы, позволяющие управлять подключенным микроконтроллером. Все эти элементы отображались на экране очень схематично.
А в начале лета на глаза мне попался набор различных элементов для организации на интернет-страницах приборных панелей. Это и подтолкнуло к разработке 3D-версии стрелочного индикатора для использования в MoDyz.
На данный момент запрограммированы основные свойства стрелочного индикатора. В программном интерфейсе с Arduino пока что имеются лишь три функции:
Создание объекта | SSGC |
Определение свойств шкалы | SSGS |
Установка нового значения | SSGV |
Скриншот (кликабельно) демонстрирует внешний вид индикаторов, создаваемых и управляемых с помощью имеющихся функций интерфейса:
код будет? Или это коммерческий продукт?
Основная задача Android-приложения MoDyz
Да похер - много таких приложений.
Какие данные и в каком формате идут от МК?
код будет? Или это коммерческий продукт?
Свежую версию приложения MoDyz и библиотеки MD_Scout можно скачать по этой ссылке.
Какие данные и в каком формате идут от МК?
Общий формат команд, отправляемых микроконтроллером на смартфон/планшет:
Создание нового стрелочного индикатора - команда SSGC:
Здесь id - идентификатор нового индикатора, x,y и r - координаты центра и радиус индикатора, frameType - тип ободка, bgColor - цвет (текстура) циферблата, ptrType и ptrColor - тип и цвет стрелки.
Настройка шкалы стрелочного индикатора - команда SSGS:
Здесь id - идентификатор индикатора, созданного ранее командой SSGC, sType - тип шкалы, freeAngle - свободный угол (имеет значение только для одного типа шкалы), vMin и vMax - минимальное и максимальное отображаемые значения.
Установка отображаемого стрелочным индикатором значения - команда SSGV:
Ну, тут, наверное, все понятно и так: id - идентификатор, newValue- новое значение.
Для ленивых (к ним я отношу и себя) есть библиотека MD_Scout, с помощью которой производится сборка необходимых команд и их отправка Android-устройству. Она, в том числе, содержит и функции управления стрелочным индикатором:
Свежую версию приложения MoDyz и библиотеки MD_Scout можно скачать по этой ссылке.
Особенно радует наличие подробной документации и большого количества примеров.
Ну, наличие подробной документации и большого количества примеров предполагает наличие большого количества читателей документации и пользователей примеров. Пока что, перефразируя классиков, "узок их круг, страшно далеки они от" вхождения в тему.
Такчто, малята, немного терпения: и описания доступных функций, и примеры их применения будут появляться постепенно, по мере прихода читателей/пользователей в тему.
Особенно радует наличие подробной документации и большого количества примеров.
Нате вам первый из большого количества примеров.
Вот такой скетч, демонстрирующий работу стрелочных индикаторов (а заодно и кнопок-крутилок) получился у меня за выходные:
В результате взаимодействия смартфона (или планшета) с установленным на него приложением MoDyz и вышеприведенного скетча получится вот такая картинка (та что справа - слева та картинка, которую выдает мой отладочный планшет с правами администратора aka бога):
Вращая левую крутилку (двигая пальцем в пределах окружности), можно задавать значение для левого стрелочного индикатора, вращая правую - для правого.
В скетче также представлена работа с текстами: вывод текста с выравниванием по центру в верхней строчке и по левому краю - в нижней. Базовые точки помечены маленькими цветными столбиками - красным в верхней строке и синим в нижней.
Исходная картинка строится в функции drawScene() (строки 54-104), а изменения положения стрелок производятся в функции setGaugeValue() (строки 106-111).
В строках 113-125 происходит разбор полученных команд. Первой должна поступить команда "fun1", вызывающая отрисовку представленной на картинке сцены, т.е. выполнение функции drawScene(). Она отправляется со смартфона при нажатии кнопки "Send Drw". Тискать на другие кнопки можно, но реакции это не вызовет никакой (если, конечно, в скетче не запрограммирована обработка той или иной команды, присылаемой при нажатии соответствующей кнопки). На все, кроме кнопки SnSht. Это единственная кнопка, никак не взаимодействующая с микроконтроллером - она делает снимок экрана и сохраняет его в основной памяти в каталоге "Pictures".
Строки 39-47 (sendString()): отправка накопившейся информации в Bluetooth-канал.
Строки 49-52 (addCmdString()): буферизация отправляемых команд с отправкой накопившегося при достижении буферной строкой определенной длины.
Все, расположенное выше строки 39, надеюсь, не требует объяснений - сосредоточимся на строках 54-111?
Так что, малята, немного терпения...
Не совсем ясна ваша генеральная линия. В "мит апп инвенторе" рисуются все " красивые управлялки" для Ардуино и всё. Другое дело библиотека и приложение которые превращают смартфон в мобильный дисплей для ардуино. Потому как цена такого отдельного дисплейчика будет сопоставима с ценой б/у смартфона :-)
Не совсем ясна ваша генеральная линия.
Моя генеральная линия - колебаться с линией партии!!! ;)
Ну, графическое программирование - это на любителя. Как по мне - так сильно на любителя. А у меня как раз "другое дело" - библиотека и приложение. Вся логика управления дисплеем (а также управления с дисплея) крутится на микроконтроллере. Это позволяет работать с ним не с какого-либо конкретного смартфона (на котором спроектирована панель управления), а с любого, имеющегося под рукой - главное, чтобы на нем MoDyz был установлен.
Цена смартфона, используемого в качестве дисплейчика, будет сопоставима с ценой смартфона?!?! Да вы что, неужели?!?!
И вообще - разве это проблема для человека, у которого смартфон и так каждый день оттягивает карман?
-----
Чтобы отвлечься от общих разговоров, подкину немного конкретики, а именно - шпаргалки по типам ободков и стрелок:
Эти шпаргалки относятся к параметрам FrameType и PointerType вышеупомянутой библиотечной функции ssgCreate() и имеют диапазоны допустимых значений, определяющих внешний вид соответственно ободка (0-10) и стрелки (0-15, реализованы пока что варианты с 0 по 10):
На мой взгляд, Вы предлагаете несколько странное решение. Более перспективным мне представляется использование браузера, тогда не придется придумывать свой протокол и делать свое приложение.
При использовании браузера панель управления тоже сама собой не нарисуется - ему придется подробно объяснять, что и где разместить, как реагировать на информацию, поступающую от МК, какие команды генерить в качестве реакции на те или иные действия с элементами панели управления. И что в результате имеем? Свой протокол, обернутый в HTML-протокол...
Цена смартфона, используемого в качестве дисплейчика, будет сопоставима с ценой смартфона?!?! Да вы что, неужели?!?!
Нет.
Цена графического дисплея на Али с диагональю около 13-14 см и возможностью управления с УНО.
А у вас как раз другое дело - приложение и библиотека, просто линия другая :-)
Впрочем, я не настаиваю, вам виднее.
Стрелочный индикатор очень удобен для оценки текущего значения отображаемого им параметра. Не зря он находи широкое применение в разнообразных технических устройствах. Но иногда полезно знать более точное - три-четыре цифры - значение параметра. А для такого больше подходит дисплей. Его можно просто разместить на экране рядом с индикатором, но тогда придется дважды передавать параметр - один раз индикатору, второй - дисплею. Несколько расточительно..
Поэтому у индикатора появилась новая функция - дисплей, дублирующий стрелочную индикацию цифровым отображением. При этом текущее значение отправляется стрелочному индикатору и он сам заботится о его представлении двумя способами.
Все, что необходимо сделать - один раз после создания индикатора послать команду активации дисплея. Пересылаемая для этого команда выглядит так:
или в виде функции, определенной в модуле md_scout:
Но к делу...
Так выглядят стрелочные индикаторы без дисплеев:
а после двух вызовов функции ssgDefineDisplay
приобретают следующий вид:
приобретают следующий вид:
Ещё так можно делать, чтоб красоту стрелок не перебивать.
приобретают следующий вид:
Ещё так можно делать, чтоб красоту стрелок не перебивать.
интересное решение, я за!