В каком виде выдается инфа с IR через библиотеку IRRemote.h?
- Войдите на сайт для отправки комментариев
Втр, 09/02/2016 - 12:55
Есть датчик ИК, шлю команды с пульта. Я создал переменные для хранения кодов команнд от разных кнопок пульта. Сравнивал через 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); }
DezmontDeXa, 7..15 строки присмотритесь, вы в 16 битные переменные пытьаетесь положить 32-битные данные.
может тип переменных маловат, может long надо?
DezmontDeXa,
в случае таких непоняток всегда смотрите в текст .h файла библиотеки.
Вот, в IRRemote.h чёрным по белому написано:
unsigned long value; // Decoded value
А Вы как свои констаны описываете? Опишите также точно, как в библиотеке и не будет никаких проблем.
Изменил тип данных на Long и заработало. Спасибо большое)
Изменил тип данных на Long и заработало. Спасибо большое)
более грамотно менять на long unsigned - точно как в библиотеке. А то у Вас смешаны signed и unsigned величины в одной операции сравнения. В данном случае пофигу, но лучше не привыкать так делать.
а у меня вот эта строчка не работает, добавил лишь условие сравнения. остальные команды работают
if (results.value == 0xB54AD02F && m == 2) {g=g-15;}
&& m == 2 только дописал
По одной этой строчке невозможно определить, что у Вас там не работает. Само условие (синтаксис) написано верно.
скетч рабочий, проверял, просто решил добавить переменную М
Подскажите, почему при нажатии кнопки пульта, с мониторе вылазит 2FD58A7+FFFFFFFF ? От куда берется FFFFFFFF?
Это символ повтора команды (при удержании кнопки).
Спасибо за ответ. Но нажатие одно и кратковременное. Поэтому вопрос и возник.
Это для вас оно кратковременное, а для электрического ткоа в цепи - это вечность) Ну не совсем вечность, но ему хватило бы и долей секунды, что бы отправить пакет данных, а вы держите минимум 0,2 секунды. А значит, если бы не FFFFFFFFFFFFFFFFFFFFFF - то система получала бы несколько пакетов за одно такое "кратковременное" нажатие.
Тогда прошу подсказать, как сделать так, что бы проходил только код команды, без кода удерживания кнопки.
Плюйте на код повтора, если он Вам не нужен.
Никак. Что с пульта отправляется, то и приходит. На стороне ардуины можно только игнорировать лишнее.
Вот так!
где то я такое видел. в 28 или 29 строке припиши делай 50 или 100
нашел, после приема 300 еще надо. у меня в лупе стоит делай
Зачем делэй использовать если есть миллис )))
я с милисом еще пока не дружу, а вот после делая все заработало без ошибок в работе
В данном случае этот делей(миллис) нужно выносить в глобальные переменные и с его помощью настраивать скорострельность.