Не меняется переменная "а".

Room Astronaut
Offline
Зарегистрирован: 06.01.2018








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

#include "IRremote.h"
#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       7

IRrecv irrecv(A0); // указываем вывод, к которому подключен приемник

decode_results results;

byte numberSegments[10] = {
  0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
  0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
};

int a = 0;

void setup()  
{
  Serial.begin(9600); // выставляем скорость COM порта
  irrecv.enableIRIn(); // запускаем прием
}

void loop() 
{
  if ( irrecv.decode( &results )) // если данные пришли
  { 
    Serial.println( results.value, HEX ); // печатаем данные
    
      if (results.value == "926D12ED") { 
     a = 0;
   }
     if (results.value == "926D629D") { 
     a = 1;
   }
    if (results.value == "926D22DD") { 
     a = 2;
   }
     if (results.value == "926D40BF") { 
     a = 3;
   }
   if (results.value == "926DA25D") { 
     a = 4;
   }
   if (results.value == "926DE01F") { 
     a = 5;
   }
   if (results.value == "926D609F") { 
     a = 6;
   }
   if (results.value == "926DD22D") { 
     a = 7;
   }
   if (results.value == "926D52AD") { 
     a = 8;
   }
   if (results.value == "926DA05F") { 
     a = 9;
   }
   Serial.println( a );
   irrecv.resume();
  }

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А с чего ей меняться? Ни одно из условий в строках 28-55 никогда не бывает истинным, потому код под if никогда не исполняется.

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Извините, я новичёк, и не очень в этом разбираюсь. Можете подсказать как сделать чтоб при получении сигнала "926D629D" переменной "а" присваивалось значение "1"?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ответьте на два вопроса, чтобы я мог понять что именно Вам посоветовать

1. Какого типа переменная results.value?

2. Что означает (и зачем Вы написали) слово HEX в строке 26?

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Не совсем понимаю суть первого вопроса, но на второй могу ответить:

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Первый вопрос очень простой. Что такое results.value? Число? Строка? Символ? Структура? Что это?

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

В данном случае переменная results.value представляет собой шестнадцатиричный код, который отправляет ИК приёмник при получении соответствующего сигнала который генерируется при нажатии кнопки на пульте, например для единицы - 926D629D.

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, так не пойдёт. Просто откройте текст библиотеки и посмотрите как она описана. char, int, long, String или ещё как.

Если Вы не знаете с каким именно объектом Вы работаете, Вы не можете с ним работать.

Room Astronaut
Offline
Зарегистрирован: 06.01.2018


unsigned long          value;        // Decoded value [max 32-bits]

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ага! Так значит это длинное беззнаковое целое! То бишь число!

Так какого хрена Вы его со строками сравниваете?

Сравнивайте с числами. Просто запишите эти Ваши значение как числа, а не как строки. Попробуйте, скажите что получится.

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

То же самое

MaksVV
Offline
Зарегистрирован: 06.08.2015

видимо Евгений хочет сказать, что ваша results.value  не является строковой переменной, а вы сравниваете её со строковой константой (т.е. значение заключили в кавычки). Короче уберите кавычки и поставьте 0х  перед кодом кнопки пульта

вместо 

if (results.value == "926D12ED") 

нужно это 

if (results.value == 0x926D12ED) 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

эм опоздал чутка

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

К сожалению, эти изменения кода не дали положительного результата.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

26 строка что в сериал выводит ?

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Огромное всем спасибо, я забыл убрать кавычки, теперь всё работает!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Room Astronaut пишет:

К сожалению, эти изменения кода не дали положительного результата.

Знаете, Вы бы сначала показали какие "эти". Код выкладывайте.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Room Astronaut пишет:

Огромное всем спасибо, я забыл убрать кавычки, теперь всё работает!

Оххххх :)

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Извините, первый раз спрашиваю, в следующий раз учту.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

и сразу, чтоб не расслабляться, почитайте

http://easy-code.ru/lesson/switch-case-cpp

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

Спасибо, сейчас почитаю

Room Astronaut
Offline
Зарегистрирован: 06.01.2018

К стати, тут нужно закрывать темы?