В каком виде выдается инфа с IR через библиотеку IRRemote.h?

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

Есть датчик ИК, шлю команды с пульта. Я создал переменные для хранения кодов команнд от разных кнопок пульта. Сравнивал через Switch..Case  не работает, даже если указать не переменную, а именно значение. После пробовал через IF. Если указывать значение в 16чной, то все ок. Но с переменной он сравнивать не хочет. Пробовал двать данные в переменные в двоичной, десятичной, 16чной. По боку.

Объясните, что я делаю не так. В идеале придти к решению на Switch'e. А то IF очень не красиво выглядит.

#include "IRremote.h"
#include "LiquidCrystal.h"

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

const int bt1 = 0xFF30CF;
const int bt2 = 0xFF18E7;
const int bt3 = 0xFF7A85;
const int bt4 = 111111110001000011101111;
const int bt5 = 16726215;
const int bt6 = 16734885;
const int bt7 = 16728765;
const int bt8 = 16730805;
const int bt9 = 16732845;


LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

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

  lcd.begin(16, 2); //Запускаем дисплей
  lcd.setCursor(0,1); //Устанавливаем курсор дисплея на 0 символ второй строки
  lcd.write("COMMAND: "); //пишем слово
}
 
void loop() {
  if (irrecv.decode(&results)) // Если данные пришли 
       {
           Serial.println(results.value, HEX); // Отправляем полученную данную в консоль
           
           if (results.value == bt3) //НЕ РАБОТАЕТ
               {
                   lcd.setCursor(9,1); 
                   lcd.print("BT3");
               } 

           if (results.value == 0xFF18E7) //РАБОТАЕТ код как в переменной bt2
               {
                   lcd.setCursor(9,1); 
                   lcd.print("BT2");
               } 


           irrecv.resume(); // Принимаем следующую команду
       }


    delay(100);
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

DezmontDeXa, 7..15 строки присмотритесь, вы в 16 битные переменные  пытьаетесь положить 32-битные данные.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

может тип переменных маловат, может long надо?

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

DezmontDeXa,

в случае таких непоняток всегда смотрите в текст .h файла библиотеки.

Вот, в IRRemote.h чёрным по белому написано:

unsigned long value; // Decoded value

А Вы как свои констаны описываете? Опишите также точно, как в библиотеке и не будет никаких проблем.

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

Изменил тип данных на Long и заработало. Спасибо большое)

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

DezmontDeXa пишет:

Изменил тип данных на Long и заработало. Спасибо большое)

более грамотно менять на long unsigned - точно как в библиотеке. А то у Вас смешаны signed и unsigned величины в одной операции сравнения. В данном случае пофигу, но лучше не привыкать так делать.

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

if (results.value == 0xB54AD02F && m == 2) {g=g-15;}

&& m == 2 только дописал

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

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

satelit 2
Offline
Зарегистрирован: 04.12.2016

скетч рабочий, проверял, просто решил добавить переменную М

#include <IRremote.h> // это скачанная библиотека
int r=0;//
int g=0;//
int b=0;//
int m=1;//значение меню.
int RECV_PIN = 11; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin (9600);
  Serial.println("Hello");
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(6, OUTPUT);
  irrecv.enableIRIn(); // включить приемник
  //pinMode(9, OUTPUT);
  
} 
void loop() {
analogWrite(9,r); 
analogWrite(10,g);
analogWrite(6,b);
if (irrecv.decode(&results)) {
delay(300); 

if (results.value == 0xB54A30CF)// если нажали кнопку меню
   {m=m+1;//увеличиваем переменнюу меню
    
  if(m>3){m=1;}
     Serial.print("menu");
     Serial.println(m);

if (results.value == 0xB54A50AF && m == 1) {r=r+15;}                             
if (results.value == 0xB54AD02F ) {r=r-15;}
if (results.value == 0xB54A50AF ) {g=g+15;} 
if (results.value == 0xB54AD02F ) {g=g-15;}
if (results.value == 0xB54A50AF ) {b=b+15;} 
if (results.value == 0xB54AD02F ) {b=b-15;}
}


if (results.value == 0xB54A48B7) {r=10; g=50; b=250; } //БЕЛЫЙ
//if (results.value == 0x61069867) {r=0; g=0; b=250; }//синий
//if (results.value == 0x61069867) {r=0; g=0; b=250; }//красный
//if (results.value == 0x61069867) {r=0; g=0; b=250; }//зеленый

if (r>255) {r=255;}
if (r<0) {r=0;}
if (g>255) {g=255;}
if (g<0) {g=0;}
if (b>255) {b=255;}
if (b<0) {b=0;}



Serial.println(r);
Serial.println(g);
Serial.println(b);
delay(50); //

irrecv.resume(); // 

}


}

 

vovikon
Offline
Зарегистрирован: 15.02.2017
#include <IRremote.h>
#include <IRremoteInt.h>

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

void setup(void) 
{

Serial.begin(9600);

 irrecv.enableIRIn(); // Запускаем прием
}

void loop(void) {

if (irrecv.decode(&results)) 
  {
    
   Serial.println(results.value, HEX);
    
   if(results.value==0x2FD58A7)
    {
      Serial.print("+");
      
      }
   
   else if(results.value==0x2FD7887)
    {
      Serial.print("-");
      
    }
    irrecv.resume();
    delay(100);  
  }
}

Подскажите, почему при нажатии кнопки пульта, с мониторе вылазит 2FD58A7+FFFFFFFF ? От куда берется FFFFFFFF?

 
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Это символ повтора команды (при удержании кнопки).

vovikon
Offline
Зарегистрирован: 15.02.2017

Спасибо за ответ. Но нажатие одно и кратковременное. Поэтому вопрос и возник.

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

Это для вас оно кратковременное, а для электрического ткоа в цепи - это вечность) Ну не совсем вечность, но ему хватило бы и долей секунды, что бы отправить пакет данных, а вы держите минимум 0,2 секунды. А значит, если бы не FFFFFFFFFFFFFFFFFFFFFF - то система получала бы несколько пакетов за одно такое "кратковременное" нажатие.

vovikon
Offline
Зарегистрирован: 15.02.2017

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

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

Плюйте на код повтора, если он Вам не нужен.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

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

Никак. Что с пульта отправляется, то и приходит. На стороне ардуины можно только игнорировать лишнее.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вот так!

#include "IRremote.h"
IRrecv irrecv(11);          // Указываем пин, к которому подключен приемник
decode_results results;
long keyCode;
unsigned long last = millis();
 
void setup()
{
  Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
}
 
void loop() {

  /*
  if (irrecv.decode(&results)) // Если данные пришли 
  {
    Serial.println(results.value, HEX); // Отправляем полученную данную в консоль
    irrecv.resume(); // Принимаем следующую команду
  } */

  if (irrecv.decode(&results)) {
  if (millis() - last > 250) {
  keyCode = results.value;
  Serial.println(keyCode, HEX);
  }
  last = millis();
  irrecv.resume();
}
}                        

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

где то я такое видел. в 28 или 29 строке припиши делай 50 или 100

satelit 2
Offline
Зарегистрирован: 04.12.2016

нашел, после приема 300 еще надо. у меня в лупе стоит делай

void loop()   
{
  if (irrecv.decode(&results)) {//ЕСЛИ ПРИШЕЛ КОД
  delay(300); 
  if (results.value == 0xB54AD02F )// если пришел код противника1
   {z=z-1;
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Зачем делэй использовать если есть миллис )))

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

В данном случае этот делей(миллис) нужно выносить в глобальные переменные и с его помощью настраивать скорострельность.