"Дребезг" кнопок ИК пульта
- Войдите на сайт для отправки комментариев
Ср, 05/06/2013 - 22:34
Всем привет! Помогите новичку. Делаю мигалку на трёх светодиодах. В мигалке 2 режима мигания, которые переключаются с пульта. Написал скетч, всё вроде работает, но при нажатии кнопок на пульте, режимы не всегда сразу переключаются. Мне кажется это что-то типа "дребезга", но как исправить не знаю. Что нужно в скетче дописать?
#include <IRremote.h> // библиотека ИК int RECV_PIN = 2; //вход ИК приёмника IRrecv irrecv(RECV_PIN); decode_results results; int a=0; void setup() { pinMode(2, INPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); attachInterrupt(0,function,CHANGE); //прерывание irrecv.enableIRIn(); } void loop() { //режим 1 irrecv.resume(); if (a==1) { digitalWrite(11, HIGH); delay(10); digitalWrite(11, LOW); delay(100); digitalWrite(12, HIGH); delay(10); digitalWrite(12, LOW); delay(100); digitalWrite(13, HIGH); delay(10); digitalWrite(13, LOW); delay(100); } //режим 2 if (a==0){ digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); // подождем секунду delay(100); // погасим светодиод, убрав напряжение с ножки digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); // подождем секунду delay(100); } } //функция прерывания void function() { irrecv.decode(&results); if (results.value == 0x3407DE1F) {a=1;} if (results.value == 0xCAD80373) {a=0;} }
при управлении с ИК пульта не может быть дребезга...
А почему тогда не всегда переключается с первго раза?
И как устранить проблему?????
Факторов много, один из первых - частота приемника и передатчика должны совпадать. Если нет - то ослабление сигнала может сильно испортить обмен.
UPD: следующее - это корректный скетч, а у Вас он еще и использует прерывания, вполне возможно, что некорректно.
Без использования прерываний проблем никаких не возхникает. А вот с что делать с прерываниями?
Сожалею, но не понял, зачем Вам обработка прерываний, плюс декодирование достаточно тяжелое и времязатратное действие, что может привести к разным, порой сложнообъяснимым глюкам
А может можно обойтись без прерываний?
А может можно обойтись без прерываний?
Зайдите с другого конца - а зачем тут вы тут вообще используете прерывание? IR-ремоте - все что нужно для захвата импульсов - делает сама. Ваше дело - только регулярно вызвать ее в loop() и спрашивать "ну что, есть декодированные данные?"
Посмотрите примеры идущие с библиотекой, есть там какие-то обработчкики прерываний?
Помоему нет(
Так кто-нибудь знает как написать корректный скетч?
Я себе IR-кнопку простую делал - от этого и скачи, хочешь включай/выключай, мигай.
Нафига там у тебя какие-то ожидания и прерывания - не понятно.
В void LED() {} пиши нужные тебе функции - будет работать по событиям приёма нового сигнала.
Да, и... повторное нажатие кнопок отрублено специально, хочешь - выпили.
Но всё равно при нажатии кнопок, срабатывает не всегда сразу(
А, через сколько срабатывает простое переключение?
24
if
(ir == 50168445) {
if
(digitalRead(14) != HIGH) {digitalWrite(14, HIGH);}}
25
if
(ir == 50156205) {
if
(digitalRead(14) != LOW) {digitalWrite(14, LOW);}}
через минуту, час, сутки?
Будет переключаться ровно через столько, сколько требуется МК на отработку предыдущей задачи и приём новой команды.
Это в случае, если нет проблем на уровне железа - макетка на соплях, фильтрующих конденсаторов на IR-приёмнике нет, и вообще частоты пульта и приёмника не совпадают.
Выведите индикацию переменной "ir" в сериал порт или на LCD - будете понимать, что происходит в реальном времени.