Управление с помощью ИК-пульта

Tortik22
Offline
Зарегистрирован: 08.04.2013

Добрый день всем форумчанам! 

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

Использую ИК-приемник VS1838b и пульты такого типа:

Управляем светодидами. При нажатии на определенную кнопку, меняеться значение переменной. Вроде все просто:

 

int i=0;
int k=0; // выбор двухзначных регистров
int a=0;
int stope=0;// мигающий


//Пин SH_CP
int SH_CP = 4;
//Пин ST_CP
int ST_CP = 3;
//Пин DS
int DS = 2;
 
#include <IRremote.h> // eto skachannaya biblioteka
int RECV_PIN = 12; //vkhod IK priyemnika
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  
  irrecv.enableIRIn(); // Start the receiver
   // Настраиваем выходы SH_CP, ST_CP, DS
   pinMode(SH_CP, OUTPUT);
   pinMode(ST_CP, OUTPUT);
   pinMode(DS, OUTPUT);
   
   pinMode(5, OUTPUT);  // светодиод 0
   pinMode(6, OUTPUT);  // светодиод 1
   pinMode(7, OUTPUT);  // светодиод 2
   pinMode(8, OUTPUT);  // светодиод 3

} 
void loop() {
  
if (irrecv.decode(&results)) {
delay(150); // zaderzhka pered vypolneniyem opredeleniya knopok , chtoby izbezhat? bystroye dvoynoye nazhatiye


if (results.value == 0xFF9867) {k=1;delay(900);}

if (results.value == 0xFF30CF && k==0) {a=0;i=0;stope=0;}  // knopka 1
if (results.value == 0xFF30CF && k==1) {a=10;i=0; stope=0;}

if (results.value == 0xFF18E7 && k!=1) {a=1;i=0; stope=0;}  // knopka 2
if (results.value == 0xFF18E7 && k==1) {a=11;i=0; stope=0;}

if (results.value == 0xFF7A85 && k!=1) {a=2;i=0;stope=0;}  // knopka 3
if (results.value == 0xFF7A85 && k==1) {a=12;i=0;stope=0;}

if (results.value == 0xFF10EF && k!=1) {a=3;i=0;stope=0;}  // knopka 4
if (results.value == 0xFF10EF && k==1) {a=13;i=0;stope=0;}

if (results.value == 0xFF38C7 && k!=1) {a=4;i=0;stope=0;}  // knopka 5
if (results.value == 0xFF38C7 && k==1) {a=14;i=0;stope=0;}

if (results.value == 0xFF5AA5 && k!=1) {a=5;i=0;stope=0;}  // knopka 6
if (results.value == 0xFF5AA5 && k==1) {a=15;i=0;stope=0;}

if (results.value == 0xFF42BD) {a=6;i=0;stope=0;}  // knopka 7
if (results.value == 0xFF4AB5) {a=7;i=0;stope=0;}  // knopka 8
if (results.value == 0xFF52AD) {a=8;i=0;stope=0;}  // knopka 9

if (results.value == 0xFF6897 && k==1) {a=9;i=0;stope=0;}  // knopka 0

if (results.value == 0xFFE01F) {a=a-1;i=0; stope=0;}    // назад
if(a<0){a=15;}
  
if (results.value == 0xFF906F) {a=a+1;i=0; stope=0;}      // вперед
if(a==16){a=0;}  
  
if (results.value == 0xFFA857) {stope=1; i=0;}              // мигающий
  

irrecv.resume();
}            

Тут  алгоритмы мигания и тд, а вот окончание цикла void loop

if(i>10){k=0;}
  //if(i==8 && k==0 && a==10){i=0;a=0;} //начало работы первого светофора.
  
  registerWrite(a, HIGH);
  delay(500); 
  }

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

ИК-приемник подключал и через конденсаторы и на прямую. 

Может кто работал с данными пультами и приемниками, знает нюансы. Буду очень признателен помощи.

keefa
Offline
Зарегистрирован: 19.06.2015

Первое что бросается в глаза, так это у тебя каждый цикл программа тормозит на ПОЛ СЕКУНДЫ!!! избавься от delay(500); либо уменьши до 50-ти.

Tortik22
Offline
Зарегистрирован: 08.04.2013

Ок, попробую.

А с пультами или с приемником такими не работали?

keefa
Offline
Зарегистрирован: 19.06.2015

Tortik22 пишет:

Ок, попробую.

А с пультами или с приемником такими не работали?

Точно с такими, нет.

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Я пробовал этот пульт. Пульт галимый. Уверенная расшифровка сигнала не более 1,5м. На том же фотоприемнике и с такой же программой пульт от телевизора работает на 5-6м.  

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

Okmor пишет:

Я пробовал этот пульт. Пульт галимый. Уверенная расшифровка сигнала не более 1,5м. На том же фотоприемнике и с такой же программой пульт от телевизора работает на 5-6м.  

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

рекомендую пойти на радио-рынок и купить за пару копеек пяток пультов от старых японских телевизоров.

Tortik22
Offline
Зарегистрирован: 08.04.2013

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

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Нет. Не знаю.

Предлагаю разобрать пульт и посмотреть внутренности, возможно не все детали распаяны.

Tortik22
Offline
Зарегистрирован: 08.04.2013

я по 5 пультов покупал. Работало рамдомно. Доработаю скетч, как советовали, потом отпишусь.

 

skoctehs
Offline
Зарегистрирован: 27.02.2016

http://arduino.ru/forum/programmirovanie/sketch-dlya-pokupnogo-ik-pulta

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

 

 

Я тоже столкнулся с тем , что библиотека  IRemote = не стабильно работает.

Лог таймингов пульта стабилен.