Блокировка\разблокировка ввода\отображения данных с пульта

anagstez
Offline
Зарегистрирован: 28.12.2019

Доброго времени, нуждаюсь в помощи (новичок).

О работе: Ардуина выводит цифры нажатые на пульте, (загрузка анимация, дальше мигает центральная ламель екрана, при получении цифри выводит на дисплей цифру, при нажатии на ноль мигает центральная ламель.)

Задача: Как сделать блокировку вывода последующей цифри. Нажал Например 1, на дисплее цифра отобразилась и все последующие не отображает до нажатия на ноль. Заранее благодарю

 

#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       8
byte numberSegments[10] = { // Всего цифр 10, поэтому в массиве 10 чисел.
//  0b01110111,
  0b00000000, 
  0b00010100, 
  0b10110011, 
  0b10110110, 
  0b11010100, 
  0b11100110, 
  0b11100111, 
  0b00110100, 
  0b11110111,
  0b11110110,
};

#include <IRremote.h>

int irPin = 10;
IRrecv irReciver(irPin); // указываем вывод, к которому подключён приёмник
decode_results results;

int number =0;

int d=50;   // задержка между отрисовкой каждого сегмента, в миллисекундах 

void setup() {
  for (int i = 0; i < SEGMENT_COUNT; ++i)
  pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
  irReciver.enableIRIn(); // запускаем приём

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(5, OUTPUT);

// Анимация
  for  (byte i=1; i<=3; i++) {      
      digitalWrite(8, HIGH);
      delay(d);
      digitalWrite(8, LOW);
      delay(d);
      digitalWrite(2, HIGH);
      delay(d);
      digitalWrite(2, LOW);
      delay(d);
      digitalWrite(3, HIGH);
      delay(d);
      digitalWrite(3, LOW);
      delay(d);
      digitalWrite(4, HIGH);
      delay(d);
      digitalWrite(4, LOW);
      delay(d);
      digitalWrite(6, HIGH);
      delay(d);
      digitalWrite(6, LOW);
      delay(d);
      digitalWrite(7, HIGH);
      delay(d);
      digitalWrite(7, LOW);
      delay(d);
      digitalWrite(3, HIGH);
      delay(d);
      digitalWrite(3, LOW);
      delay(d);
      digitalWrite(9, HIGH);
      delay(d);
      digitalWrite(9, LOW);
      delay(d);
      digitalWrite(7, HIGH);
      delay(d);
      digitalWrite(7, LOW);
      delay(d);             
      }
}

// определяем значение нажатой клавиши
void decodeIR() {
  switch (results.value)
  {
    case 0xFF9867:
      number=0;
      break;
    case 0xFFA25D:
      number=1;
      break;
    case 0xFF629D:
      number=2;
      break;
    case 0xFFE21D:
      number=3;
      break;
    case 0xFF22DD:
      number=4;
      break;
    case 0xFF02FD:
      number=5;
      break;
    case 0xFFC23D:
      number=6;
      break;
    case 0xFFE01F:
      number=7;
      break;
    case 0xFFA857:
      number=8;
      break;
    case 0xFF906F:
      number=9;
      break;
  }
}

void loop(){

//если получен 0 моргать палкою
if (number<1) {
digitalWrite(9, HIGH);
delay(200);
digitalWrite(9, LOW);
delay(200);
}


if (irReciver.decode(&results)) { // если данные пришли
decodeIR(); // расшифровываем данные
irReciver.resume(); // принимаем следующую команду

int mask = numberSegments[number]; // получаем код из массива, в котором содержится полученная цифра
for (int i = 0; i < SEGMENT_COUNT; ++i) { // для каждого из 7 сегментов индикатора
boolean enableSegment = bitRead(mask, i); // определяем: должен ли он быть включён.
digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); // включаем/выключаем сегмент на основе полученного значения
}
}
}

 

otto_sheller
Offline
Зарегистрирован: 23.05.2022

разве это не решит проблему

else (number<1){
    irReciver.resume(); // принимаем следующую команду  
}}

 

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

Завести переменную-флаг, определяющую, можно ли выводить цифры на экран.

Изначально флаг в состоянии "разрешено". Один раз пришел номер - выполнили строчки 134-138, показали его на экране, установили флаг в положение "запрет". Пока не придет ноль - флаг не меняем, цифры не показываем. Как пришел ноль - флаг снова сбрасываем.

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

otto_sheller пишет:

разве это не решит проблему

else (number<1){
    irReciver.resume(); // принимаем следующую команду  
}}

 

нет

anagstez
Offline
Зарегистрирован: 28.12.2019

Благодарю буду сейчас поискать как ето делать)

anagstez
Offline
Зарегистрирован: 28.12.2019

b707 пишет:

Завести переменную-флаг, определяющую, можно ли выводить цифры на экран.

Изначально флаг в состоянии "разрешено". Один раз пришел номер - выполнили строчки 134-138, показали его на экране, установили флаг в положение "запрет". Пока не придет ноль - флаг не меняем, цифры не показываем. Как пришел ноль - флаг снова сбрасываем.

Как я понял ето должно быть связано с типом данных — boolean ?

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

anagstez пишет:

Как я понял ето должно быть связано с типом данных — boolean ?

можно и так

anagstez
Offline
Зарегистрирован: 28.12.2019

b707 пишет:

anagstez пишет:

Как я понял ето должно быть связано с типом данных — boolean ?

можно и так

вроде все заработало!))))

#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       8
byte numberSegments[10] = { // Всего цифр 10, поэтому в массиве 10 чисел.
//  0b01110111,
  0b00000000, 
  0b00010100, 
  0b10110011, 
  0b10110110, 
  0b11010100, 
  0b11100110, 
  0b11100111, 
  0b00110100, 
  0b11110111,
  0b11110110,
};

#include <IRremote.h>

int irPin = 10;
IRrecv irReciver(irPin); // указываем вывод, к которому подключён приёмник
decode_results results;

int number =0;

int d=50;   // задержка между отрисовкой каждого сегмента, в миллисекундах 

boolean running = false; // тут будет блок

void setup() {
  for (int i = 0; i < SEGMENT_COUNT; ++i)
  pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
  irReciver.enableIRIn(); // запускаем приём

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(5, OUTPUT);

// Анимация
  for  (byte i=1; i<=3; i++) {      
      digitalWrite(8, HIGH);
      delay(d);
      digitalWrite(8, LOW);
      delay(d);
      digitalWrite(2, HIGH);
      delay(d);
      digitalWrite(2, LOW);
      delay(d);
      digitalWrite(3, HIGH);
      delay(d);
      digitalWrite(3, LOW);
      delay(d);
      digitalWrite(4, HIGH);
      delay(d);
      digitalWrite(4, LOW);
      delay(d);
      digitalWrite(6, HIGH);
      delay(d);
      digitalWrite(6, LOW);
      delay(d);
      digitalWrite(7, HIGH);
      delay(d);
      digitalWrite(7, LOW);
      delay(d);
      digitalWrite(3, HIGH);
      delay(d);
      digitalWrite(3, LOW);
      delay(d);
      digitalWrite(9, HIGH);
      delay(d);
      digitalWrite(9, LOW);
      delay(d);
      digitalWrite(7, HIGH);
      delay(d);
      digitalWrite(7, LOW);
      delay(d);             
      }
}

// определяем значение нажатой клавиши
void decodeIR() {
  switch (results.value)
  {
    case 0xFF9867:
      number=0;
      break;
    case 0xFFA25D:
      number=1;
      break;
    case 0xFF629D:
      number=2;
      break;
    case 0xFFE21D:
      number=3;
      break;
    case 0xFF22DD:
      number=4;
      break;
    case 0xFF02FD:
      number=5;
      break;
    case 0xFFC23D:
      number=6;
      break;
    case 0xFFE01F:
      number=7;
      break;
    case 0xFFA857:
      number=8;
      break;
    case 0xFF906F:
      number=9;
      break;
  }
}

void loop(){

//если получен 0 моргать палкою
if (number<1) {
running = false; // получил ноль на блок
delay(200);
digitalWrite(9, HIGH);
delay(200);
digitalWrite(9, LOW);
}


if (irReciver.decode(&results)) { // если данные пришли
decodeIR(); // расшифровываем данные
irReciver.resume(); // принимаем следующую команду

//start
if (running == false){
int mask = numberSegments[number]; // получаем код из массива, в котором содержится полученная цифра
for (int i = 0; i < SEGMENT_COUNT; ++i) { // для каждого из 7 сегментов индикатора
boolean enableSegment = bitRead(mask, i); // определяем: должен ли он быть включён.
digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); // включаем/выключаем сегмент на основе полученного значения
running = true; // быть блоку 
}
}// end
}
}

Один вопрос, связан с пультом, у меня данные приходят только в момент нажатия на клавишу, (когда пульт направлен на приёмник) но если зажать кнопку ы направить то результата ноль, Данная проблема излечима?

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

anagstez пишет:

Один вопрос, связан с пультом, у меня данные приходят только в момент нажатия на клавишу, (когда пульт направлен на приёмник) но если зажать кнопку ы направить то результата ноль, Данная проблема излечима?

Если кратко, то нет.

Morroc
Offline
Зарегистрирован: 24.10.2016

anagstez пишет:

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

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

anagstez
Offline
Зарегистрирован: 28.12.2019

Morroc пишет:

anagstez пишет:

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

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

Доброго дня, если использовать скетч IRrecvDemo, то зажатая клавиша в консоли отображается следующим образом

FF9867
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

 

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

anagstez пишет:

если использовать скетч IRrecvDemo, то зажатая клавиша в консоли отображается следующим образом

FF9867
FFFFFFFF
....
FFFFFFFF
FFFFFFFF
FFFFFFFF

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

Это поведение зашито в прошивке пульта и без замены софта не лечится, о чем я вам и писал выше в ответе #8.

anagstez
Offline
Зарегистрирован: 28.12.2019

b707 пишет:

anagstez пишет:

если использовать скетч IRrecvDemo, то зажатая клавиша в консоли отображается следующим образом

FF9867
FFFFFFFF
....
FFFFFFFF
FFFFFFFF
FFFFFFFF

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

Это поведение зашито в прошивке пульта и без замены софта не лечится, о чем я вам и писал выше в ответе #8.

 

Решил проблему данной библиотекой https://github.com/tremaru/iarduino_IR

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

anagstez пишет:

Решил проблему данной библиотекой https://github.com/tremaru/iarduino_IR

какую проблему?

anagstez
Offline
Зарегистрирован: 28.12.2019

b707 пишет:

anagstez пишет:

Решил проблему данной библиотекой https://github.com/tremaru/iarduino_IR

какую проблему?

Пропусков срабатывания на клавишу пульта (если зажать клавишу)

было

FF9867
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

 

стало

FF9867
FF9867
FF9867
FF9867
FF9867
FF9867
FF9867
FF9867

 

 

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

anagstez пишет:

стало

FF9867
FF9867
FF9867
FF9867
FF9867
FF9867
FF9867
FF9867

смешно...