Как подружить DMD (DMD2) и IRremote

basel1980
Offline
Зарегистрирован: 17.06.2015

День добрый.

Решаю задачу "табло валют" на LED P10 32х16.

Нужно сделать чтобы курс менять с ИК пульта.

Захват кодов с IRremote в чистом виде на ура. (например в IRDemo)

Как только стартуем 

dmd.begin();

Через порт наблюдаем как рандомом сыплется ерунда.

 

Подскажите куда копать?

Уж 3 день бьюсь. Экран готов. Шрифты настроены. А с пультом засада. 

Причем пробывал и DMD и DMD2 ситуация одинакова. Замены IR библиотеки нет.

Поиск ничего не дал. У людей есть проблемы но они с таймерами. У меня и Мега и Уно. Переводил в Меге на другие таймеры. Результат тот же.

С датчиком все ок. Потому как их 3 и смена не помогает. И еще в чистом коде где только IRremote все ок.

В общем осталось только сюда написать. Свои мысли иссякли :)

basel1980
Offline
Зарегистрирован: 17.06.2015
/*
  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);
  }
}

 

basel1980
Offline
Зарегистрирован: 17.06.2015
РАспиновка меги к led модулю стандартная в общем то.

MikSer
Offline
Зарегистрирован: 27.01.2012

А зачем в 47 строке идет повторная инициализация объекта DMD? Вы же его уже в 22 проинициализировали. Я попробую завтра проверить, может чего умного напишу.

dneese
Offline
Зарегистрирован: 20.12.2018

UP,

так же не могу победить, dmd2 и irremote,

странно на dmd  работает отлично, но там нет печати integer только string

dmd.drawString( 15,0, "+", 1, GRAPHICS_NORMAL );

поэтому не устраивает

а также используется TimerOne,

как прикрутить TimerOne к dmd2 ?

есть ли может другое решение?

 

b707
Offline
Зарегистрирован: 26.05.2017

dneese пишет:

странно на dmd  работает отлично, но там нет печати integer только string

 

после такого заявления следует гнать ссаными тряпками с програмисткого форума.

Что, неужели перевести целое в строку - это проблема????

пипец новички выродились. Скоро будут приходить и спрашивать - мол, "нашел в инете готовый скетч. выводит на экран "1", а мне надо "2" - поэтому не подходит, Помогитяя!"

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Всё прекрасно работает у меня: и коды с пульта ловятся, и на матрицу выводятся. Юзаю библиотеку DMD, какой версии - хз, но точно не новую, там есть правки под свои нужды.

В целом - никаких проблем не замечено, работает под Uno и Pro Mini аж за здрасьте.

dneese
Offline
Зарегистрирован: 20.12.2018

спасибо за ответ, я хоть и не автор темы, но отписал тут что имею такую же проблему как у автора.

и у меня не было вопроса перевести целое в строку! если нет что сказать по теме лучше промолчать.

если печатать в серийный порт, проблем нет, была проблема вывода библиотекой dmd, конвертация в string не проходит . Проблему решил печатая один символ отдельно три раза (три разных символа)со смещением пикселей на матрице. использовав 

void ShowClockNumbers( unsigned int uiTime )

 

пока так работает на dmd, и iarduino_IR_RX.h

но хочется dmd2, 

b707
Offline
Зарегистрирован: 26.05.2017

dneese пишет:

и у меня не было вопроса перевести целое в строку! если нет что сказать по теме лучше промолчать.

у вас не было такого вопроса, но были жалобы - что якобы библиотека не подходит, потому что умеет выводить только строки и не умеет числа.

Если вы не поняли - это я вам решение подсказал! Если библиотека умеет выводить строки - то числа вам и не нужны. просто переведите число в строку.

А вы вместо этого опять пишете какую-то ересь - "конвертация в стринг не проходит". как она может не проходить? - может конвертировать не умеете?

dneese
Offline
Зарегистрирован: 20.12.2018

спасибо за ответ, и подсказку, возможно я не умею конвентировать число в строку, но автор темы три года назад указал на проблему сочетания двух библиотек, и так как библиотеки используют второй аппаратный таймер, как для раскодирования данных с ИК-приёмника «в фоновом режиме», так и для вывода на екран. так как 3 или 11 вывод, уже заняты это помешает корректной работе одной из библиотек. 

конфликт двух библиотек. по отдельности обе идеально работают. вот что нужно решить в этой теме.

я не никрофил чтоб поднимать темы спустя три года. вопрос просто не решен, я понимаю что у всех всё работает но у кого-то может и нет именно по этой причине. А в библиотеке DMD, используется библиотека TimerOne, которая для вывода на екран использует первый апаратный таймер timer1, поэтому конфликта нет и всё работает.

dneese
Offline
Зарегистрирован: 20.12.2018

У меня другой вопрос, как подружить 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 );

то радио код в монитор порта выводится но не работает дисплей.

как здесь можно использовать прерывание чтоб не было конфликта?

b707
Offline
Зарегистрирован: 26.05.2017

кроме TimerOne существует библиотека Timertwo

dneese
Offline
Зарегистрирован: 20.12.2018

не работает,

Timer0 и Timer2 — 8-разрядные, поэтому максимальное значение, которое воспринимает — 255. Но Timer1-то 16-разрядный!

b707
Offline
Зарегистрирован: 26.05.2017

dneese пишет:

Timer0 и Timer2 — 8-разрядные, поэтому максимальное значение, которое воспринимает — 255. Но Timer1-то 16-разрядный!

что за ерунду вы пишете... Какая разница что за разрядность у таймера? - ведь все, для чего вам нужен таймер - раз в 5000мкс сгенерить прерывание для вывода на экран. С этим справится любой таймер, в принципе, это и без таймера можно сделать, на миллис...

dneese
Offline
Зарегистрирован: 20.12.2018

спасибо за ответ, получается ерунда с экраном и приёмником

ввожу следующий код:

/*--------------------------------------------------------------------------------------
  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

то жутко медленное обновление екрана, но в сериный монитор порта

потсупают ответы от радиоприёмника:

15:27:03.733 -> Code: 352829, period: 147us.
15:27:04.929 -> Code: 352829, period: 146us.
15:27:04.998 -> Code: 352829, period: 148us.
 
а если выставить MsTimer2::set(5, ScanDMD); // 5ms period
то экран обновляется нормально, но монитор порта пуст.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

На экране что отображать планируется?

dneese
Offline
Зарегистрирован: 20.12.2018

цифры

b707
Offline
Зарегистрирован: 26.05.2017

начать с того, что в обработчике прерывания нельзя использовать обращение к Сериал

В функции showOldCode вам нужно оставить только копирование кода приемника в глобальную переменную , а выводить ее в Сериал - уже в loop().

И , конечно, в таком коде как у вас - выводится она будет не чаще, чем длительность всех команд в ЛУПе. Переписывайте код без делеев.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну вот, как цифры изменились - так и выводите. Выставляйте флаг по факту, в лупе его отлавливайте, рисуйте на экране чего надо и флаг сбрасывайте.

b707
Offline
Зарегистрирован: 26.05.2017

dneese - сравнивая ваш код из сообщений №10 и №14 - вижу, что  он одинаково себя ведет и на Таймере1 и на Таймере2  - работает при периоде DMD 50мс и не работает на 5мс  Похоже, что у вас проблема вовсе не в занятости таймера, а в том что вы в прерывание Remote пытаетесь вызывать Serial

Можете вернуть обратно Таймер1. Переписывайте процедуру showOldCode - в ней корень ошибки, имхо

dneese
Offline
Зарегистрирован: 20.12.2018

спасибо за ответ, вернул первый код

процудуру 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 вообще пусто.

 

IvanP
Offline
Зарегистрирован: 19.11.2018
#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 );
}

проблема таже, но через раз работает

IvanP
Offline
Зарегистрирован: 19.11.2018

проблема в том, что данные с пульта дешифруются неправильно, из-за прерываний на отрисовку экрана.

sadman41
Offline
Зарегистрирован: 19.10.2016

Естественно. IRRemote вообще не любит, когда кто-то кроме него прерываниями пользуется или запрещает их. Поэтому рисовать надо не по таймеру, а по изменению данных. Или просто не блокируя прерывания.

dneese
Offline
Зарегистрирован: 20.12.2018

подключите приёмник к пину 2

и ещё у вас 115 строка не компилируется с оибкой exit status 1

base operand of '->' has non-pointer type 'decode_results'
 
IvanP
Offline
Зарегистрирован: 19.11.2018

 

#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 );
}

исправил

Скетч использует 16320 байт (53%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 745 байт (36%) динамической памяти, оставляя 1303 байт для локальных переменных. Максимум: 2048 байт.

 

Logik
Offline
Зарегистрирован: 05.08.2014

IvanP пишет:

проблема в том, что данные с пульта дешифруются неправильно, из-за прерываний на отрисовку экрана.

Не совсем так. Не из-за прерываний, а из-за долгой их обработки. В тот момент когда приходят данные с пульта у Вас работает обработчик прерывания выпихивающие данные в табло. И данные теряются т.к. не зафиксированы вовремя. Проблема плевая, но с либками пора завязывать ;)

dneese
Offline
Зарегистрирован: 20.12.2018
всё работает, в серийный монитор порта коды выводятся
но смущает какие-то моргающие точки возле цифры 4 раз в пол секунды
 
 
а вообще для ИК я использую 
#include <iarduino_IR_RX.h>    
там тоже всё работает отлично, в отличии от радиоприёмника RemoteReceiver
 
dneese
Offline
Зарегистрирован: 20.12.2018


Ребята помогите разобратся, есть приемник 433 МГц, матрица P10 led, arduino nano, код ниже описаный работает идеально, но только когда экран отключен физически, код от радиопульта приходит и в монитор потра выводится и символы на дисплей печатает, но только если физически отключен дисплей.
Как только дисплей подключаю шлейфом в разьём, он отображает правильно символы всё ок
но вот радиоприёмник больше не работает, команды с радиопульта не ловит, отключаю шлейф от дисплея всё ок., тоесть по отдельности всё работает но вместе нет.
 

/

/*--------------------------------------------------------------------------------------
  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 );   // три
  }  

  
} 

 

нужно управлять матрицей с радиопульта, кто сталкивался?

b707
Offline
Зарегистрирован: 26.05.2017

dneese, месяц назад в сообщении #17 я вам уже писал, в чем ваша проблема. Функция showOldCode() выхывается внутри прерывания, поэтому в нее крайне нежелательно вставлять образение к Сериал - и АБСОЛЮТНО НЕДОПУСТИМО пихать в нее такие огромные функции. как вывод текста на DMD. Оставьте внутри showOldCode() только получение данных с приемника, а всю работы с DMD вынесите в loop()

вы бьетесь с этой несложной задачкой уже который месяц... если сами не в состоянии разобраться - давно б заплатили кому-то

dneese
Offline
Зарегистрирован: 20.12.2018

b707 пишет:

 давно б заплатили кому-то

если я за свои поделки буду платить, то я обанкрочусь . да и цену решения я не могу определить, 

тут дело не в коде, код я изменил но ничего не поменялось

/*--------------------------------------------------------------------------------------
  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;
  
} 

експерментальным путём выяснилось что если поднести пульт к приёмнику на растояние ближе пол метра, то всё работает и в первом коде и  в этом. Похоже тут наводка на радиосигнал идёт, потому что отключив матрицу от шлейфа, радиус действия увеличивается на десятки метров.

b707
Offline
Зарегистрирован: 26.05.2017

dneese пишет:

тут дело не в коде, код я изменил но ничего не поменялось

в коде. в коде... код в сообщении #28 абсолютно нерабочий, а с #30 уже можно разбираться.

Цитата:

експерментальным путём выяснилось что если поднести пульт к приёмнику на растояние ближе пол метра, то всё работает и в первом коде и  в этом. Похоже тут наводка на радиосигнал идёт, потому что отключив матрицу от шлейфа, радиус действия увеличивается на десятки метров.

похоже на то, что теперь проблема не в коде, а в схеме или в сборке.

Многие модули RF433 с Али совершенный мусор, может вместо RF433 взять что-то поприличнее, типа HC-12 ? радус действия на открытом воздухе будет до 300-500 метров

dneese
Offline
Зарегистрирован: 20.12.2018

Up, решил проблему подключив Bluetooth и накатал приложение для android, потому что с ИК пультом работает только с одной, двумя, тремя матрицами, а мне нужно напимер шесть семь или восемь. Всё это на nano подцепил и управление пультом виснет если много матриц, победить думаю подключив ещё nano, и принимать ИК команды ей, а потом по serial передавать на первое nano, которое уже на матрицы выведет. Решение не красивое, но по другому не знаю как, кто что подскажет?

b707
Offline
Зарегистрирован: 26.05.2017

Возьмите вместо нано Блюпилл - потянет 30-40 матриц и Сериал тормозить не будет
А на нано DMd особо не разогнать, там при наращивании числа матриц и Сериал начинает буквы терять, мы в прошлом году проверяли с lean74

dneese
Offline
Зарегистрирован: 20.12.2018

Думал об этом, спасибо, теперь точно попробую, так и знал что частоты 16 герц мало

b707
Offline
Зарегистрирован: 26.05.2017

В разделе Проекты найдете тему про DMD библиотеку для СТМ - пишите туда, помогу