Как подружить DMD (DMD2) и IRremote
- Войдите на сайт для отправки комментариев
День добрый.
Решаю задачу "табло валют" на LED P10 32х16.
Нужно сделать чтобы курс менять с ИК пульта.
Захват кодов с IRremote в чистом виде на ура. (например в IRDemo)
Как только стартуем
dmd.begin();
Через порт наблюдаем как рандомом сыплется ерунда.
Подскажите куда копать?
Уж 3 день бьюсь. Экран готов. Шрифты настроены. А с пультом засада.
Причем пробывал и DMD и DMD2 ситуация одинакова. Замены IR библиотеки нет.
Поиск ничего не дал. У людей есть проблемы но они с таймерами. У меня и Мега и Уно. Переводил в Меге на другие таймеры. Результат тот же.
С датчиком все ок. Потому как их 3 и смена не помогает. И еще в чистом коде где только IRremote все ок.
В общем осталось только сюда написать. Свои мысли иссякли :)
А зачем в 47 строке идет повторная инициализация объекта DMD? Вы же его уже в 22 проинициализировали. Я попробую завтра проверить, может чего умного напишу.
UP,
так же не могу победить, dmd2 и irremote,
странно на dmd работает отлично, но там нет печати integer только string
поэтому не устраивает
а также используется TimerOne,
как прикрутить TimerOne к dmd2 ?
есть ли может другое решение?
странно на dmd работает отлично, но там нет печати integer только string
после такого заявления следует гнать ссаными тряпками с програмисткого форума.
Что, неужели перевести целое в строку - это проблема????
пипец новички выродились. Скоро будут приходить и спрашивать - мол, "нашел в инете готовый скетч. выводит на экран "1", а мне надо "2" - поэтому не подходит, Помогитяя!"
Всё прекрасно работает у меня: и коды с пульта ловятся, и на матрицу выводятся. Юзаю библиотеку DMD, какой версии - хз, но точно не новую, там есть правки под свои нужды.
В целом - никаких проблем не замечено, работает под Uno и Pro Mini аж за здрасьте.
спасибо за ответ, я хоть и не автор темы, но отписал тут что имею такую же проблему как у автора.
и у меня не было вопроса перевести целое в строку! если нет что сказать по теме лучше промолчать.
если печатать в серийный порт, проблем нет, была проблема вывода библиотекой dmd, конвертация в string не проходит . Проблему решил печатая один символ отдельно три раза (три разных символа)со смещением пикселей на матрице. использовав
пока так работает на dmd, и iarduino_IR_RX.h
но хочется dmd2,
и у меня не было вопроса перевести целое в строку! если нет что сказать по теме лучше промолчать.
у вас не было такого вопроса, но были жалобы - что якобы библиотека не подходит, потому что умеет выводить только строки и не умеет числа.
Если вы не поняли - это я вам решение подсказал! Если библиотека умеет выводить строки - то числа вам и не нужны. просто переведите число в строку.
А вы вместо этого опять пишете какую-то ересь - "конвертация в стринг не проходит". как она может не проходить? - может конвертировать не умеете?
спасибо за ответ, и подсказку, возможно я не умею конвентировать число в строку, но автор темы три года назад указал на проблему сочетания двух библиотек, и так как библиотеки используют второй аппаратный таймер, как для раскодирования данных с ИК-приёмника «в фоновом режиме», так и для вывода на екран. так как 3 или 11 вывод, уже заняты это помешает корректной работе одной из библиотек.
конфликт двух библиотек. по отдельности обе идеально работают. вот что нужно решить в этой теме.
я не никрофил чтоб поднимать темы спустя три года. вопрос просто не решен, я понимаю что у всех всё работает но у кого-то может и нет именно по этой причине. А в библиотеке DMD, используется библиотека TimerOne, которая для вывода на екран использует первый апаратный таймер timer1, поэтому конфликта нет и всё работает.
У меня другой вопрос, как подружить DMD и RemoteReceiver.h или RCSwitch.h, по отдельности всё работает, но совместив не работает приём радио сигнала с приёмника.
ниже код при котором екран работает но код переданый с пульта в монитор порта не выводится
если закоментить строку //Timer1.attachInterrupt( ScanDMD );
то радио код в монитор порта выводится но не работает дисплей.
как здесь можно использовать прерывание чтоб не было конфликта?
кроме TimerOne существует библиотека Timertwo
не работает,
Timer0 и Timer2 — 8-разрядные, поэтому максимальное значение, которое воспринимает — 255. Но Timer1-то 16-разрядный!
Timer0 и Timer2 — 8-разрядные, поэтому максимальное значение, которое воспринимает — 255. Но Timer1-то 16-разрядный!
что за ерунду вы пишете... Какая разница что за разрядность у таймера? - ведь все, для чего вам нужен таймер - раз в 5000мкс сгенерить прерывание для вывода на экран. С этим справится любой таймер, в принципе, это и без таймера можно сделать, на миллис...
спасибо за ответ, получается ерунда с экраном и приёмником
ввожу следующий код:
если ввести 50ms
MsTimer2::set(50, ScanDMD); // 50ms period
то жутко медленное обновление екрана, но в сериный монитор порта
потсупают ответы от радиоприёмника:
На экране что отображать планируется?
цифры
начать с того, что в обработчике прерывания нельзя использовать обращение к Сериал
В функции showOldCode вам нужно оставить только копирование кода приемника в глобальную переменную , а выводить ее в Сериал - уже в loop().
И , конечно, в таком коде как у вас - выводится она будет не чаще, чем длительность всех команд в ЛУПе. Переписывайте код без делеев.
Ну вот, как цифры изменились - так и выводите. Выставляйте флаг по факту, в лупе его отлавливайте, рисуйте на экране чего надо и флаг сбрасывайте.
dneese - сравнивая ваш код из сообщений №10 и №14 - вижу, что он одинаково себя ведет и на Таймере1 и на Таймере2 - работает при периоде DMD 50мс и не работает на 5мс Похоже, что у вас проблема вовсе не в занятости таймера, а в том что вы в прерывание Remote пытаетесь вызывать Serial
Можете вернуть обратно Таймер1. Переписывайте процедуру showOldCode - в ней корень ошибки, имхо
спасибо за ответ, вернул первый код
процудуру showOldcode изменил так:
теперь при Timer1.initialize(150000 ); // 150ms отображение на екране очень медленное, но при нажатии на радиопульт код приходит и цифра отображается но очень коряво мигает попиксельно тормозит
но если установить Timer1.initialize(1000 ); // 1ms отображение на экране идеальное, но код не ловится хоть тресни.
в loop вообще пусто.
проблема таже, но через раз работает
проблема в том, что данные с пульта дешифруются неправильно, из-за прерываний на отрисовку экрана.
Естественно. IRRemote вообще не любит, когда кто-то кроме него прерываниями пользуется или запрещает их. Поэтому рисовать надо не по таймеру, а по изменению данных. Или просто не блокируя прерывания.
подключите приёмник к пину 2
и ещё у вас 115 строка не компилируется с оибкой exit status 1
исправил
проблема в том, что данные с пульта дешифруются неправильно, из-за прерываний на отрисовку экрана.
Не совсем так. Не из-за прерываний, а из-за долгой их обработки. В тот момент когда приходят данные с пульта у Вас работает обработчик прерывания выпихивающие данные в табло. И данные теряются т.к. не зафиксированы вовремя. Проблема плевая, но с либками пора завязывать ;)
нужно управлять матрицей с радиопульта, кто сталкивался?
dneese, месяц назад в сообщении #17 я вам уже писал, в чем ваша проблема. Функция showOldCode() выхывается внутри прерывания, поэтому в нее крайне нежелательно вставлять образение к Сериал - и АБСОЛЮТНО НЕДОПУСТИМО пихать в нее такие огромные функции. как вывод текста на DMD. Оставьте внутри showOldCode() только получение данных с приемника, а всю работы с DMD вынесите в loop()
вы бьетесь с этой несложной задачкой уже который месяц... если сами не в состоянии разобраться - давно б заплатили кому-то
давно б заплатили кому-то
если я за свои поделки буду платить, то я обанкрочусь . да и цену решения я не могу определить,
тут дело не в коде, код я изменил но ничего не поменялось
експерментальным путём выяснилось что если поднести пульт к приёмнику на растояние ближе пол метра, то всё работает и в первом коде и в этом. Похоже тут наводка на радиосигнал идёт, потому что отключив матрицу от шлейфа, радиус действия увеличивается на десятки метров.
тут дело не в коде, код я изменил но ничего не поменялось
в коде. в коде... код в сообщении #28 абсолютно нерабочий, а с #30 уже можно разбираться.
експерментальным путём выяснилось что если поднести пульт к приёмнику на растояние ближе пол метра, то всё работает и в первом коде и в этом. Похоже тут наводка на радиосигнал идёт, потому что отключив матрицу от шлейфа, радиус действия увеличивается на десятки метров.
похоже на то, что теперь проблема не в коде, а в схеме или в сборке.
Многие модули RF433 с Али совершенный мусор, может вместо RF433 взять что-то поприличнее, типа HC-12 ? радус действия на открытом воздухе будет до 300-500 метров
Up, решил проблему подключив Bluetooth и накатал приложение для android, потому что с ИК пультом работает только с одной, двумя, тремя матрицами, а мне нужно напимер шесть семь или восемь. Всё это на nano подцепил и управление пультом виснет если много матриц, победить думаю подключив ещё nano, и принимать ИК команды ей, а потом по serial передавать на первое nano, которое уже на матрицы выведет. Решение не красивое, но по другому не знаю как, кто что подскажет?
Возьмите вместо нано Блюпилл - потянет 30-40 матриц и Сериал тормозить не будет
А на нано DMd особо не разогнать, там при наращивании числа матриц и Сериал начинает буквы терять, мы в прошлом году проверяли с lean74
Думал об этом, спасибо, теперь точно попробую, так и знал что частоты 16 герц мало
В разделе Проекты найдете тему про DMD библиотеку для СТМ - пишите туда, помогу