Как подружить DMD (DMD2) и IRremote
- Войдите на сайт для отправки комментариев
День добрый.
Решаю задачу "табло валют" на LED P10 32х16.
Нужно сделать чтобы курс менять с ИК пульта.
Захват кодов с IRremote в чистом виде на ура. (например в IRDemo)
Как только стартуем
dmd.begin();
Через порт наблюдаем как рандомом сыплется ерунда.
Подскажите куда копать?
Уж 3 день бьюсь. Экран готов. Шрифты настроены. А с пультом засада.
Причем пробывал и DMD и DMD2 ситуация одинакова. Замены IR библиотеки нет.
Поиск ничего не дал. У людей есть проблемы но они с таймерами. У меня и Мега и Уно. Переводил в Меге на другие таймеры. Результат тот же.
С датчиком все ок. Потому как их 3 и смена не помогает. И еще в чистом коде где только IRremote все ок.
В общем осталось только сюда написать. Свои мысли иссякли :)
/* Quick demo of major drawing operations on a single DMD */ #include <SPI.h> #include <DMD2.h> #include <fonts/SystemFont5x7.h> #include <IRremote.h> int RECV_PIN = 3; IRrecv irrecv(RECV_PIN); decode_results results; SoftDMD dmd(1,1); // DMD controls the entire display // the setup routine runs once when you press reset: void setup() { dmd.setBrightness(255); dmd.selectFont(SystemFont5x7); dmd.begin(); // Circle with a line at a tangent to it dmd.drawCircle(24,8,5); dmd.drawLine(14,9,28,15); // Outline box containing a filled box dmd.drawBox(6,10,11,15); dmd.drawFilledBox(8,12,9,13); Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } int n = 123; // the loop routine runs over and over again forever: void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } delay(100); dmd.begin(); dmd.drawString(0,0,String(n)); n = n + 1; delay(1000); if(n % 2 == 0) { dmd.drawFilledBox(0,11,4,15, GRAPHICS_OFF); dmd.drawBox(0,11,4,15); } else { dmd.drawFilledBox(0,11,4,15); } }А зачем в 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, по отдельности всё работает, но совместив не работает приём радио сигнала с приёмника.
ниже код при котором екран работает но код переданый с пульта в монитор порта не выводится
/*-------------------------------------------------------------------------------------- Includes --------------------------------------------------------------------------------------*/ #include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // #include "SystemFont5x7.h" #include "Arial_black_16.h" //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 1 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); #include <RemoteReceiver.h> /*-------------------------------------------------------------------------------------- Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets called at the period set in Timer1.initialize(); --------------------------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*-------------------------------------------------------------------------------------- setup Called by the Arduino architecture before the main loop begins --------------------------------------------------------------------------------------*/ void setup(void) { Serial.begin(115200); //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize( 5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() //Interrupt 0 to indicate that you will call an interrupt handler with InterruptChain RemoteReceiver::init(0, 3, showOldCode); //подключите приемник 433 МГц к цифровому контакту 2. } /*-------------------------------------------------------------------------------------- loop Arduino architecture main loop --------------------------------------------------------------------------------------*/ void loop(void) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) // draw a circle dmd.drawCircle( 16, 8, 5, GRAPHICS_NORMAL ); delay( 1000 ); dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) // draw a filled box dmd.drawFilledBox( 24, 3, 29, 13, GRAPHICS_NORMAL ); delay( 1000 ); } // показывает полученный код void showOldCode(unsigned long receivedCode, unsigned int period) { // Print the received code. Serial.print("Code: "); Serial.print(receivedCode); Serial.print(", period: "); Serial.print(period); Serial.println("us."); }если закоментить строку //Timer1.attachInterrupt( ScanDMD );
то радио код в монитор порта выводится но не работает дисплей.
как здесь можно использовать прерывание чтоб не было конфликта?
кроме TimerOne существует библиотека Timertwo
не работает,
Timer0 и Timer2 — 8-разрядные, поэтому максимальное значение, которое воспринимает — 255. Но Timer1-то 16-разрядный!
Timer0 и Timer2 — 8-разрядные, поэтому максимальное значение, которое воспринимает — 255. Но Timer1-то 16-разрядный!
что за ерунду вы пишете... Какая разница что за разрядность у таймера? - ведь все, для чего вам нужен таймер - раз в 5000мкс сгенерить прерывание для вывода на экран. С этим справится любой таймер, в принципе, это и без таймера можно сделать, на миллис...
спасибо за ответ, получается ерунда с экраном и приёмником
ввожу следующий код:
/*-------------------------------------------------------------------------------------- Includes --------------------------------------------------------------------------------------*/ #include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // #include <MsTimer2.h> #include "SystemFont5x7.h" #include "Arial_black_16.h" //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 1 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); #include <RemoteReceiver.h> /*-------------------------------------------------------------------------------------- Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets called at the period set in Timer1.initialize(); --------------------------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*-------------------------------------------------------------------------------------- setup Called by the Arduino architecture before the main loop begins --------------------------------------------------------------------------------------*/ void setup(void) { Serial.begin(115200); //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display // Timer1.initialize( 5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. // Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() MsTimer2::set(50, ScanDMD); // 50ms period MsTimer2::start(); //Interrupt 0 to indicate that you will call an interrupt handler with InterruptChain RemoteReceiver::init(0, 3, showOldCode); //подключите приемник 433 МГц к цифровому контакту 2. } /*-------------------------------------------------------------------------------------- loop Arduino architecture main loop --------------------------------------------------------------------------------------*/ void loop(void) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) // draw a circle dmd.drawCircle( 16, 8, 5, GRAPHICS_NORMAL ); delay( 1000 ); dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) // draw a filled box dmd.drawFilledBox( 24, 3, 29, 13, GRAPHICS_NORMAL ); delay( 1000 ); } // показывает полученный код void showOldCode(unsigned long receivedCode, unsigned int period) { // Print the received code. Serial.print("Code: "); Serial.print(receivedCode); Serial.print(", period: "); Serial.print(period); Serial.println("us."); }если ввести 50ms
MsTimer2::set(50, ScanDMD); // 50ms period
то жутко медленное обновление екрана, но в сериный монитор порта
потсупают ответы от радиоприёмника:
На экране что отображать планируется?
цифры
начать с того, что в обработчике прерывания нельзя использовать обращение к Сериал
В функции showOldCode вам нужно оставить только копирование кода приемника в глобальную переменную , а выводить ее в Сериал - уже в loop().
И , конечно, в таком коде как у вас - выводится она будет не чаще, чем длительность всех команд в ЛУПе. Переписывайте код без делеев.
Ну вот, как цифры изменились - так и выводите. Выставляйте флаг по факту, в лупе его отлавливайте, рисуйте на экране чего надо и флаг сбрасывайте.
dneese - сравнивая ваш код из сообщений №10 и №14 - вижу, что он одинаково себя ведет и на Таймере1 и на Таймере2 - работает при периоде DMD 50мс и не работает на 5мс Похоже, что у вас проблема вовсе не в занятости таймера, а в том что вы в прерывание Remote пытаетесь вызывать Serial
Можете вернуть обратно Таймер1. Переписывайте процедуру showOldCode - в ней корень ошибки, имхо
спасибо за ответ, вернул первый код
процудуру showOldcode изменил так:
/*-------------------------------------------------------------------------------------- Includes --------------------------------------------------------------------------------------*/ #include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // #include "SystemFont5x7.h" #include "Arial_black_16.h" //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 1 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); #include <RemoteReceiver.h> /*-------------------------------------------------------------------------------------- Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets called at the period set in Timer1.initialize(); --------------------------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*-------------------------------------------------------------------------------------- setup Called by the Arduino architecture before the main loop begins --------------------------------------------------------------------------------------*/ void setup(void) { dmd.selectFont(SystemFont5x7);// установим шрифт dmd.drawChar( 2, 1, '9', GRAPHICS_NORMAL ); // печатаем на екран девятку Serial.begin(115200); //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize(5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() //Interrupt 0 to indicate that you will call an interrupt handler with InterruptChain RemoteReceiver::init(0, 3, showOldCode); //подключите приемник 433 МГц к цифровому контакту 2. } /*-------------------------------------------------------------------------------------- loop Arduino architecture main loop --------------------------------------------------------------------------------------*/ void loop(void) { } // показывает полученный код void showOldCode(unsigned long receivedCode) { if (receivedCode== 352833) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 20, 1, '0', GRAPHICS_NORMAL ); // нолик } if (receivedCode== 352829) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 10, 1, '1', GRAPHICS_NORMAL ); // один } if (receivedCode== 353805) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 20, 10, '2', GRAPHICS_NORMAL ); // два } if (receivedCode== 353801 ) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 10, 10, '3', GRAPHICS_NORMAL ); // три } }теперь при Timer1.initialize(150000 ); // 150ms отображение на екране очень медленное, но при нажатии на радиопульт код приходит и цифра отображается но очень коряво мигает попиксельно тормозит
но если установить Timer1.initialize(1000 ); // 1ms отображение на экране идеальное, но код не ловится хоть тресни.
в loop вообще пусто.
#include "IRremote.h" #include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // //#include "Arial_black_16.h" #include <Arial_Black_16_ISO_8859_1.h> #include <EEPROM.h> #define BUTTON_PIN 10 #define STATUS_PIN 5 //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 3 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); IRrecv irrecv(12); // указываем вывод, к которому подключен приемник IRsend irsend; decode_results results; //unsigned int Rub[DISPLAYS_ACROSS]; // массив со значениями рублей //unsigned int Kop[DISPLAYS_ACROSS]; // массив со значениями копеек byte Rub[DISPLAYS_ACROSS]; // массив со значениями рублей byte Kop[DISPLAYS_ACROSS]; // массив со значениями копеек //byte kolvoPanel=3; unsigned long lastMillis = millis(); unsigned long OldKod; boolean flag = 0; boolean clockTime = false; // флаг того что выводим byte rejim=0; byte timeRead=5; // Storage for the recorded code int codeType = -1; // The type of code unsigned long codeValue; // The code value if not raw unsigned int rawCodes[RAWBUF]; // The durations if raw int codeLen; // The length of the code int toggle = 0; // The RC5/6 toggle state void ScanDMD() { dmd.scanDisplayBySPI(); } void ShowClockNumbers( unsigned int uiTime, boolean bColonOn, byte N_Panel ) { // dmd.clearScreen(true); if( bColonOn && (rejim==1 || rejim==3 || rejim==5) ){ dmd.drawChar( 1+(32*(N_Panel-1)), 0,'0'+((uiTime%10000)/1000), GRAPHICS_NORMAL ); // thousands dmd.drawChar( 8+(32*(N_Panel-1)), 0,'0'+ ((uiTime%1000) /100), GRAPHICS_NORMAL ); // hundreds } else if (rejim==1 || rejim==3 || rejim==5) { dmd.drawChar( 1+(32*(N_Panel-1)), 0,' ', GRAPHICS_NORMAL ); // thousands dmd.drawChar( 8+(32*(N_Panel-1)), 0, ' ', GRAPHICS_NORMAL ); // hundreds } else{ dmd.drawChar( 1+(32*(N_Panel-1)), 0,'0'+((uiTime%10000)/1000), GRAPHICS_NORMAL ); // thousands dmd.drawChar( 8+(32*(N_Panel-1)), 0, '0'+((uiTime%1000) /100), GRAPHICS_NORMAL ); // hundreds } if( bColonOn && (rejim==2 || rejim==4 || rejim==6) ){ dmd.drawChar( 18+(32*(N_Panel-1)), 0, '0'+((uiTime%100) /10), GRAPHICS_NORMAL ); // tens dmd.drawChar( 25+(32*(N_Panel-1)), 0,'0'+ (uiTime%10), GRAPHICS_NORMAL ); // units } else if (rejim==2 || rejim==4 || rejim==6){ dmd.drawChar( 18+(32*(N_Panel-1)), 0, ' ', GRAPHICS_NORMAL ); // tens dmd.drawChar( 25+(32*(N_Panel-1)), 0, ' ', GRAPHICS_NORMAL ); // units } else{ dmd.drawChar( 18+(32*(N_Panel-1)), 0, '0'+((uiTime%100) /10), GRAPHICS_NORMAL ); // tens dmd.drawChar( 25+(32*(N_Panel-1)), 0, '0'+(uiTime%10), GRAPHICS_NORMAL ); // units } dmd.drawChar( 15+(32*(N_Panel-1)), 3, '.', GRAPHICS_NORMAL ); // clock colon overlay on } void readSet(){ for (byte i =0; i < DISPLAYS_ACROSS; i++){ Rub[i] = EEPROM.read(i); Kop[i] = EEPROM.read(i+10); } //первый запуск //первый запуск } void setup() { readSet(); irrecv.enableIRIn(); // запускаем прием //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize( 5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() //clear/init the DMD pixels held in RAM dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.selectFont(Arial_Black_16_ISO_8859_1); Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(STATUS_PIN, OUTPUT); } void loop() { unsigned int ui; if ( irrecv.decode( &results )) { // если данные пришли codeType = results->decode_type; int count = results->rawlen; codeValue = results.value; // codeLen = results->bits; // switch ( results.value ) { switch ( codeValue ) { // case 0xBC253F00: //меню case 0x807F8A75: //меню OldKod=0xBC253F00; rejim=1; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1); // delay( 100 ); break; // case 0x95AFFB4D: //право case 0x807F7A85: //право OldKod=0x95AFFB4D; rejim++; if (rejim>(DISPLAYS_ACROSS*2)) rejim=1; if (rejim==2) {ui=Rub[0]*100+Kop[0];ShowClockNumbers( ui, clockTime, 1 );} if (rejim==3) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==4) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==5) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} if (rejim==6) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} // delay( 100 ); break; // case 0x845E5420: // лево case 0x807FB24D: // лево OldKod=0x845E5420; rejim--; if (rejim==0) rejim=(DISPLAYS_ACROSS*2); if (rejim==2) {ui=Rub[0]*100+Kop[0];ShowClockNumbers( ui, clockTime, 1 );} if (rejim==3) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==4) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==5) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} if (rejim==6) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} // delay( 100 ); break; // case 0x5985AF7D: // ок case 0x807F827D: // ок OldKod=0x62B79B2C; rejim=0; for (byte i =0; i < DISPLAYS_ACROSS; i++){ ui=Rub[i]*100+Kop[i]; ShowClockNumbers( ui, true, i+1 ); } // digitalWrite( 13, HIGH ); // delay( 100 ); break; // case 0xEC9A30D9: //верх case 0x807F9A65: //верх OldKod=0xEC9A30D9; if(rejim==1 || rejim==3 || rejim==5){ if (rejim==1){ Rub[0]=Rub[0]+1; if (Rub[0]==100)Rub[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0, Rub[0]);} if (rejim==3){ Rub[1]=Rub[1]+1; if (Rub[1]==100)Rub[0]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1, Rub[1]);} if (rejim==5){ Rub[2]=Rub[2]+1; if (Rub[2]==100)Rub[0]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2, Rub[2]);} } if(rejim==2 || rejim==4 || rejim==6){ if (rejim==2){ Kop[0]=Kop[0]+1; if (Kop[0]==100)Kop[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0+10, Kop[0]);} if (rejim==4){ Kop[1]=Kop[1]+1; if (Kop[1]==100)Kop[1]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1+10, Kop[1]);} if (rejim==6){ Kop[2]=Kop[2]+1; if (Kop[2]==100)Kop[2]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2+10, Kop[2]);} } // digitalWrite( 13, HIGH ); // delay( 100 ); break; // case 0x99247EBA: // низ case 0x807FAA55: // низ OldKod=0x99247EBA; if(rejim==1 || rejim==3 || rejim==5){ if (rejim==1){ Rub[0]=Rub[0]-1; if (Rub[0]-1<0)Rub[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0, Rub[0]);} if (rejim==3){ Rub[1]=Rub[1]-1; if (Rub[1]-1<0)Rub[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1, Rub[1]);} if (rejim==5){ Rub[2]=Rub[2]-1; if (Rub[2]-1<0)Rub[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2, Rub[2]);} } if(rejim==2 || rejim==4 || rejim==6){ if (rejim==2){ Kop[0]=Kop[0]-1; if (Kop[0]-1<0)Kop[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0+10, Kop[0]);} if (rejim==4){ Kop[1]=Kop[1]-1; if (Kop[1]-1<0)Kop[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1+10, Kop[1]);} if (rejim==6){ Kop[2]=Kop[2]-1; if (Kop[2]-1<0)Kop[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2+10, Kop[2]);} } // digitalWrite( 13, LOW ); // delay( 100 ); break; // case 0xFFFFFFFF: //if(OldKod==0xEC9A30D9){ // if(rejim==1 || rejim==3 || rejim==5){ // if (rejim==1){ Rub[0]=Rub[0]+1; if (Rub[0]==100)Rub[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0, Rub[0]);} // if (rejim==3){ Rub[1]=Rub[1]+1; if (Rub[1]==100)Rub[0]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1, Rub[1]);} // if (rejim==5){ Rub[2]=Rub[2]+1; if (Rub[2]==100)Rub[0]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2, Rub[2]);} // } // if(rejim==2 || rejim==4 || rejim==6){ // if (rejim==2){ Kop[0]=Kop[0]+1; if (Kop[0]==100)Kop[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0+10, Kop[0]);} // if (rejim==4){ Kop[1]=Kop[1]+1; if (Kop[1]==100)Kop[1]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1+10, Kop[1]);} // if (rejim==6){ Kop[2]=Kop[2]+1; if (Kop[2]==100)Kop[2]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2+10, Kop[2]);} // } // // } //if(OldKod==0x99247EBA){ // if(rejim==1 || rejim==3 || rejim==5){ // if (rejim==1){ Rub[0]=Rub[0]-1; if (Rub[0]-1<0)Rub[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0, Rub[0]);} // if (rejim==3){ Rub[1]=Rub[1]-1; if (Rub[1]-1<0)Rub[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1, Rub[1]);} // if (rejim==5){ Rub[2]=Rub[2]-1; if (Rub[2]-1<0)Rub[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2, Rub[2]);} // } // if(rejim==2 || rejim==4 || rejim==6){ // if (rejim==2){ Kop[0]=Kop[0]-1; if (Kop[0]-1<0)Kop[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0+10, Kop[0]);} // if (rejim==4){ Kop[1]=Kop[1]-1; if (Kop[1]-1<0)Kop[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1+10, Kop[1]);} // if (rejim==6){ Kop[2]=Kop[2]-1; if (Kop[2]-1<0)Kop[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2+10, Kop[2]);} // } // // } //delay( 100 ); // break; } Serial.print(results.value, HEX); Serial.print(" DEC "); Serial.println(results.value, DEC); // codeValue = results->value; // codeLen = results->bits; Serial.print("rejim "); Serial.println(rejim); irrecv.resume(); // принимаем следующую команду } // ui = 1234; // ShowClockNumbers( ui, true ); // delay( 1000 ); // ShowClockNumbers( ui, false ); // delay( 1000 ); // ShowClockNumbers( ui, true ); // delay( 1000 ); // ShowClockNumbers( ui, false ); // delay( 1000 ); // if (rejim == 0) { // в режиме ничего не меряем if (flag == 0) { ui=Rub[0]*100+Kop[0]; if (rejim==1 || rejim==2) {ShowClockNumbers( ui, clockTime, 1 );} ui=Rub[1]*100+Kop[1]; if (rejim==3 || rejim==4) {ShowClockNumbers( ui, clockTime, 2 );} ui=Rub[2]*100+Kop[2]; if (rejim==5 || rejim==6) {ShowClockNumbers( ui, clockTime, 3 );} if (rejim==0) { for (byte i =0; i < DISPLAYS_ACROSS; i++){ ui=Rub[i]*100+Kop[i]; ShowClockNumbers( ui, true, i+1 ); } } lastMillis = millis(); clockTime=!clockTime; flag = 1; } if (millis() - lastMillis >= timeRead * 100) { flag = 0; } // } // delay( 300 ); }проблема таже, но через раз работает
проблема в том, что данные с пульта дешифруются неправильно, из-за прерываний на отрисовку экрана.
Естественно. IRRemote вообще не любит, когда кто-то кроме него прерываниями пользуется или запрещает их. Поэтому рисовать надо не по таймеру, а по изменению данных. Или просто не блокируя прерывания.
подключите приёмник к пину 2
и ещё у вас 115 строка не компилируется с оибкой exit status 1
#include "IRremote.h" #include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // //#include "Arial_black_16.h" #include <Arial_Black_16_ISO_8859_1.h> #include <EEPROM.h> #define BUTTON_PIN 10 //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 2 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); IRrecv irrecv(12); // указываем вывод, к которому подключен приемник decode_results results; //unsigned int Rub[DISPLAYS_ACROSS]; // массив со значениями рублей //unsigned int Kop[DISPLAYS_ACROSS]; // массив со значениями копеек byte Rub[DISPLAYS_ACROSS]; // массив со значениями рублей byte Kop[DISPLAYS_ACROSS]; // массив со значениями копеек //byte kolvoPanel=3; unsigned long lastMillis = millis(); unsigned long OldKod; boolean flag = 0; boolean clockTime = false; // флаг того что выводим byte rejim=0; byte timeRead=5; //unsigned long codeValue; // The code value if not raw //unsigned int rawCodes[RAWBUF]; // The durations if raw //int codeLen; // The length of the code void ScanDMD() { dmd.scanDisplayBySPI(); } void ShowClockNumbers( unsigned int uiTime, boolean bColonOn, byte N_Panel ) { // dmd.clearScreen(true); if( bColonOn && (rejim==1 || rejim==3 || rejim==5) ){ dmd.drawChar( 1+(32*(N_Panel-1)), 0,'0'+((uiTime%10000)/1000), GRAPHICS_NORMAL ); // thousands dmd.drawChar( 8+(32*(N_Panel-1)), 0,'0'+ ((uiTime%1000) /100), GRAPHICS_NORMAL ); // hundreds } else if (rejim==1 || rejim==3 || rejim==5) { dmd.drawChar( 1+(32*(N_Panel-1)), 0,' ', GRAPHICS_NORMAL ); // thousands dmd.drawChar( 8+(32*(N_Panel-1)), 0, ' ', GRAPHICS_NORMAL ); // hundreds } else{ dmd.drawChar( 1+(32*(N_Panel-1)), 0,'0'+((uiTime%10000)/1000), GRAPHICS_NORMAL ); // thousands dmd.drawChar( 8+(32*(N_Panel-1)), 0, '0'+((uiTime%1000) /100), GRAPHICS_NORMAL ); // hundreds } if( bColonOn && (rejim==2 || rejim==4 || rejim==6) ){ dmd.drawChar( 18+(32*(N_Panel-1)), 0, '0'+((uiTime%100) /10), GRAPHICS_NORMAL ); // tens dmd.drawChar( 25+(32*(N_Panel-1)), 0,'0'+ (uiTime%10), GRAPHICS_NORMAL ); // units } else if (rejim==2 || rejim==4 || rejim==6){ dmd.drawChar( 18+(32*(N_Panel-1)), 0, ' ', GRAPHICS_NORMAL ); // tens dmd.drawChar( 25+(32*(N_Panel-1)), 0, ' ', GRAPHICS_NORMAL ); // units } else{ dmd.drawChar( 18+(32*(N_Panel-1)), 0, '0'+((uiTime%100) /10), GRAPHICS_NORMAL ); // tens dmd.drawChar( 25+(32*(N_Panel-1)), 0, '0'+(uiTime%10), GRAPHICS_NORMAL ); // units } dmd.drawChar( 15+(32*(N_Panel-1)), 3, '.', GRAPHICS_NORMAL ); // clock colon overlay on } void readSet(){ for (byte i =0; i < DISPLAYS_ACROSS; i++){ Rub[i] = EEPROM.read(i); Kop[i] = EEPROM.read(i+10); } //первый запуск //первый запуск } void setup() { readSet(); irrecv.enableIRIn(); // запускаем прием //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize(5000); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() //clear/init the DMD pixels held in RAM dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.selectFont(Arial_Black_16_ISO_8859_1); Serial.begin(9600); } void loop() { unsigned int ui; if ( irrecv.decode( &results )) { // если данные пришли delay(300); // задержка перед выполнением определения кнопок, чтобы избежать быстрое двойное нажатие switch ( results.value ) { case 0xBC253F00: //меню // case 0x807F8A75: //меню OldKod=0xBC253F00; rejim=1; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1); // delay( 100 ); break; case 0x95AFFB4D: //право // case 0x807F7A85: //право OldKod=0x95AFFB4D; rejim++; if (rejim>(DISPLAYS_ACROSS*2)) rejim=1; if (rejim==2) {ui=Rub[0]*100+Kop[0];ShowClockNumbers( ui, clockTime, 1 );} if (rejim==3) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==4) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==5) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} if (rejim==6) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} // delay( 100 ); break; case 0x845E5420: // лево // case 0x807FB24D: // лево OldKod=0x845E5420; rejim--; if (rejim==0) rejim=(DISPLAYS_ACROSS*2); if (rejim==2) {ui=Rub[0]*100+Kop[0];ShowClockNumbers( ui, clockTime, 1 );} if (rejim==3) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==4) {ui=Rub[1]*100+Kop[1];ShowClockNumbers( ui, clockTime, 2 );} if (rejim==5) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} if (rejim==6) {ui=Rub[2]*100+Kop[2];ShowClockNumbers( ui, clockTime, 3 );} // delay( 100 ); break; case 0x5985AF7D: // ок // case 0x807F827D: // ок OldKod=0x5985AF7D; rejim=0; for (byte i =0; i < DISPLAYS_ACROSS; i++){ ui=Rub[i]*100+Kop[i]; ShowClockNumbers( ui, true, i+1 ); } // digitalWrite( 13, HIGH ); // delay( 100 ); break; case 0xEC9A30D9: //верх // case 0x807F9A65: //верх OldKod=0xEC9A30D9; if(rejim==1 || rejim==3 || rejim==5){ if (rejim==1){ Rub[0]=Rub[0]+1; if (Rub[0]==100)Rub[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0, Rub[0]);} if (rejim==3){ Rub[1]=Rub[1]+1; if (Rub[1]==100)Rub[0]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1, Rub[1]);} if (rejim==5){ Rub[2]=Rub[2]+1; if (Rub[2]==100)Rub[0]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2, Rub[2]);} } if(rejim==2 || rejim==4 || rejim==6){ if (rejim==2){ Kop[0]=Kop[0]+1; if (Kop[0]==100)Kop[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0+10, Kop[0]);} if (rejim==4){ Kop[1]=Kop[1]+1; if (Kop[1]==100)Kop[1]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1+10, Kop[1]);} if (rejim==6){ Kop[2]=Kop[2]+1; if (Kop[2]==100)Kop[2]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2+10, Kop[2]);} } // digitalWrite( 13, HIGH ); // delay( 100 ); break; case 0x99247EBA: // низ // case 0x807FAA55: // низ OldKod=0x99247EBA; if(rejim==1 || rejim==3 || rejim==5){ if (rejim==1){ Rub[0]=Rub[0]-1; if (Rub[0]-1<0)Rub[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0, Rub[0]);} if (rejim==3){ Rub[1]=Rub[1]-1; if (Rub[1]-1<0)Rub[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1, Rub[1]);} if (rejim==5){ Rub[2]=Rub[2]-1; if (Rub[2]-1<0)Rub[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2, Rub[2]);} } if(rejim==2 || rejim==4 || rejim==6){ if (rejim==2){ Kop[0]=Kop[0]-1; if (Kop[0]-1<0)Kop[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, clockTime,1);EEPROM.write(0+10, Kop[0]);} if (rejim==4){ Kop[1]=Kop[1]-1; if (Kop[1]-1<0)Kop[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, clockTime,2);EEPROM.write(1+10, Kop[1]);} if (rejim==6){ Kop[2]=Kop[2]-1; if (Kop[2]-1<0)Kop[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, clockTime,3);EEPROM.write(2+10, Kop[2]);} } // digitalWrite( 13, LOW ); // delay( 100 ); break; // case 0xFFFFFFFF: //if(OldKod==0xEC9A30D9){ // if(rejim==1 || rejim==3 || rejim==5){ // if (rejim==1){ Rub[0]=Rub[0]+1; if (Rub[0]==100)Rub[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0, Rub[0]);} // if (rejim==3){ Rub[1]=Rub[1]+1; if (Rub[1]==100)Rub[0]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1, Rub[1]);} // if (rejim==5){ Rub[2]=Rub[2]+1; if (Rub[2]==100)Rub[0]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2, Rub[2]);} // } // if(rejim==2 || rejim==4 || rejim==6){ // if (rejim==2){ Kop[0]=Kop[0]+1; if (Kop[0]==100)Kop[0]=99; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0+10, Kop[0]);} // if (rejim==4){ Kop[1]=Kop[1]+1; if (Kop[1]==100)Kop[1]=99; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1+10, Kop[1]);} // if (rejim==6){ Kop[2]=Kop[2]+1; if (Kop[2]==100)Kop[2]=99; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2+10, Kop[2]);} // } // // } //if(OldKod==0x99247EBA){ // if(rejim==1 || rejim==3 || rejim==5){ // if (rejim==1){ Rub[0]=Rub[0]-1; if (Rub[0]-1<0)Rub[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0, Rub[0]);} // if (rejim==3){ Rub[1]=Rub[1]-1; if (Rub[1]-1<0)Rub[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1, Rub[1]);} // if (rejim==5){ Rub[2]=Rub[2]-1; if (Rub[2]-1<0)Rub[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2, Rub[2]);} // } // if(rejim==2 || rejim==4 || rejim==6){ // if (rejim==2){ Kop[0]=Kop[0]-1; if (Kop[0]-1<0)Kop[0]=0; ui=Rub[0]*100+Kop[0]; ShowClockNumbers( ui, true,1);EEPROM.write(0+10, Kop[0]);} // if (rejim==4){ Kop[1]=Kop[1]-1; if (Kop[1]-1<0)Kop[1]=0; ui=Rub[1]*100+Kop[1]; ShowClockNumbers( ui, true,2);EEPROM.write(1+10, Kop[1]);} // if (rejim==6){ Kop[2]=Kop[2]-1; if (Kop[2]-1<0)Kop[2]=0; ui=Rub[2]*100+Kop[2]; ShowClockNumbers( ui, true,3);EEPROM.write(2+10, Kop[2]);} // } // // } //delay( 100 ); // break; } Serial.print(results.value, HEX); Serial.print(" DEC "); Serial.println(results.value, DEC); // codeValue = results->value; // codeLen = results->bits; Serial.print("rejim "); Serial.println(rejim); delay(50); //пауза между повторами // irrecv.resume(); // принимаем следующую команду } // ui = 1234; // ShowClockNumbers( ui, true ); // delay( 1000 ); // ShowClockNumbers( ui, false ); // delay( 1000 ); // ShowClockNumbers( ui, true ); // delay( 1000 ); // ShowClockNumbers( ui, false ); // delay( 1000 ); // if (rejim == 0) { // в режиме ничего не меряем if (flag == 0) { ui=Rub[0]*100+Kop[0]; if (rejim==1 || rejim==2) {ShowClockNumbers( ui, clockTime, 1 );} ui=Rub[1]*100+Kop[1]; if (rejim==3 || rejim==4) {ShowClockNumbers( ui, clockTime, 2 );} ui=Rub[2]*100+Kop[2]; if (rejim==5 || rejim==6) {ShowClockNumbers( ui, clockTime, 3 );} if (rejim==0) { for (byte i =0; i < DISPLAYS_ACROSS; i++){ ui=Rub[i]*100+Kop[i]; ShowClockNumbers( ui, true, i+1 ); } } lastMillis = millis(); clockTime=!clockTime; flag = 1; } if (millis() - lastMillis >= timeRead * 100) { flag = 0; } // } //delay( 50 ); }исправил
проблема в том, что данные с пульта дешифруются неправильно, из-за прерываний на отрисовку экрана.
Не совсем так. Не из-за прерываний, а из-за долгой их обработки. В тот момент когда приходят данные с пульта у Вас работает обработчик прерывания выпихивающие данные в табло. И данные теряются т.к. не зафиксированы вовремя. Проблема плевая, но с либками пора завязывать ;)
/ /*-------------------------------------------------------------------------------------- Includes --------------------------------------------------------------------------------------*/ #include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // #include "SystemFont5x7.h" #include "Arial_black_16.h" //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 1 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); #include <RemoteReceiver.h> /*-------------------------------------------------------------------------------------- Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets called at the period set in Timer1.initialize(); --------------------------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*-------------------------------------------------------------------------------------- setup Called by the Arduino architecture before the main loop begins --------------------------------------------------------------------------------------*/ void setup(void) { dmd.selectFont(SystemFont5x7);// установим шрифт dmd.drawChar( 2, 1, '9', GRAPHICS_NORMAL ); // печатаем на екран девятку Serial.begin(115200); //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize(5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() //Interrupt 0 to indicate that you will call an interrupt handler with InterruptChain RemoteReceiver::init(0, 3, showOldCode); //подключите приемник 433 МГц к цифровому контакту 2. } /*-------------------------------------------------------------------------------------- loop Arduino architecture main loop --------------------------------------------------------------------------------------*/ void loop(void) { } // показывает полученный код void showOldCode(unsigned long receivedCode) { Serial.print("Code: "); Serial.print(receivedCode); if (receivedCode== 352833) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 20, 1, '0', GRAPHICS_NORMAL ); // нолик } if (receivedCode== 352829) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 10, 1, '1', GRAPHICS_NORMAL ); // один } if (receivedCode== 353805) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 20, 10, '2', GRAPHICS_NORMAL ); // два } if (receivedCode== 353801 ) { dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 10, 10, '3', GRAPHICS_NORMAL ); // три } }нужно управлять матрицей с радиопульта, кто сталкивался?
dneese, месяц назад в сообщении #17 я вам уже писал, в чем ваша проблема. Функция showOldCode() выхывается внутри прерывания, поэтому в нее крайне нежелательно вставлять образение к Сериал - и АБСОЛЮТНО НЕДОПУСТИМО пихать в нее такие огромные функции. как вывод текста на DMD. Оставьте внутри showOldCode() только получение данных с приемника, а всю работы с DMD вынесите в loop()
вы бьетесь с этой несложной задачкой уже который месяц... если сами не в состоянии разобраться - давно б заплатили кому-то
давно б заплатили кому-то
если я за свои поделки буду платить, то я обанкрочусь . да и цену решения я не могу определить,
тут дело не в коде, код я изменил но ничего не поменялось
/*-------------------------------------------------------------------------------------- Includes --------------------------------------------------------------------------------------*/ #include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // #include "SystemFont5x7.h" #include "Arial_black_16.h" //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 1 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); long Code; boolean flag=false; #include <RemoteReceiver.h> /*-------------------------------------------------------------------------------------- Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets called at the period set in Timer1.initialize(); --------------------------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*-------------------------------------------------------------------------------------- setup Called by the Arduino architecture before the main loop begins --------------------------------------------------------------------------------------*/ void setup(void) { dmd.selectFont(SystemFont5x7);// установим шрифт dmd.drawChar( 2, 1, '9', GRAPHICS_NORMAL ); // печатаем на екран девятку Serial.begin(115200); //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize(5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() //Interrupt 0 to indicate that you will call an interrupt handler with InterruptChain RemoteReceiver::init(0, 3, showOldCode); //подключите приемник 433 МГц к цифровому контакту 2. } /*-------------------------------------------------------------------------------------- loop Arduino architecture main loop --------------------------------------------------------------------------------------*/ void loop(void) { if (Code== 352833&&flag ==true) { flag=false; Serial.print("Code: "); Serial.print(Code); dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 20, 1, '0', GRAPHICS_NORMAL ); // нолик } if (Code== 352829&&flag ==true) { flag=false; dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 10, 1, '1', GRAPHICS_NORMAL ); // один } if (Code== 353805&&flag ==true) { flag=false; dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 20, 10, '2', GRAPHICS_NORMAL ); // два } if (Code== 353801 &&flag ==true) { flag=false; dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) dmd.drawChar( 10, 10, '3', GRAPHICS_NORMAL ); // три } } // показывает полученный код void showOldCode(unsigned long receivedCode) { Code=receivedCode; flag=true; }експерментальным путём выяснилось что если поднести пульт к приёмнику на растояние ближе пол метра, то всё работает и в первом коде и в этом. Похоже тут наводка на радиосигнал идёт, потому что отключив матрицу от шлейфа, радиус действия увеличивается на десятки метров.
тут дело не в коде, код я изменил но ничего не поменялось
в коде. в коде... код в сообщении #28 абсолютно нерабочий, а с #30 уже можно разбираться.
експерментальным путём выяснилось что если поднести пульт к приёмнику на растояние ближе пол метра, то всё работает и в первом коде и в этом. Похоже тут наводка на радиосигнал идёт, потому что отключив матрицу от шлейфа, радиус действия увеличивается на десятки метров.
похоже на то, что теперь проблема не в коде, а в схеме или в сборке.
Многие модули RF433 с Али совершенный мусор, может вместо RF433 взять что-то поприличнее, типа HC-12 ? радус действия на открытом воздухе будет до 300-500 метров
Up, решил проблему подключив Bluetooth и накатал приложение для android, потому что с ИК пультом работает только с одной, двумя, тремя матрицами, а мне нужно напимер шесть семь или восемь. Всё это на nano подцепил и управление пультом виснет если много матриц, победить думаю подключив ещё nano, и принимать ИК команды ей, а потом по serial передавать на первое nano, которое уже на матрицы выведет. Решение не красивое, но по другому не знаю как, кто что подскажет?
Возьмите вместо нано Блюпилл - потянет 30-40 матриц и Сериал тормозить не будет
А на нано DMd особо не разогнать, там при наращивании числа матриц и Сериал начинает буквы терять, мы в прошлом году проверяли с lean74
Думал об этом, спасибо, теперь точно попробую, так и знал что частоты 16 герц мало
В разделе Проекты найдете тему про DMD библиотеку для СТМ - пишите туда, помогу