Добрый день.
Управляю через nano и ИК пульт парой реле. ИК-приемник TSOP1736 висит на проводах порядка 4м.
При сборке на макетной плате (короткие провода), все было отлично. Но в реале ардуина начала ловить некий ноль и после этого чуть ли не рандомно щелкать выходами. Т.е. принимаю что-то типа
2C80A857
FFFFFFFF
0
FFFFFFFF
После этого может включить любой из выходов или включить и выключить, или еще что-нибудь неадекватное. На макете прием FFFFFFFF тоже есть, никак на работу не влияет, а вот появление 0 ставит ардуино в тупик... Что может быть? Скорость порта менял. Библиотека IRremote.h, код простейший
#include <IRremote.h>
boolean lamp_flag=false;
boolean lamp_bra_flag=false;
boolean led_flag=false;
boolean btn_flag=false;
boolean btn;
long btn_Press_time=0;
long btn_Release_time=0;
#define hold_time 500 // время удержания кнопки для второй функиции
#define dbc 300 // время дребезга
#define wait 50 // время задержки между условиями для правильной отработки всего
#define pin_Relay_Lamp 2 // реле лампы основоного коридора
#define pin_btn 7 // кнопка
#define pin_Relay_Lamp_bra 3 // реле бра
#define pin_Led 4 // led
#define RECV_PIN 11
#define IR_gnd_pin 8
#define IR_vcc_pin 9
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
pinMode(pin_btn, INPUT_PULLUP); // кнопка Lamp
pinMode(pin_Relay_Lamp, OUTPUT); // реле Lamp
pinMode(pin_Relay_Lamp_bra, OUTPUT); // реле Lamp
digitalWrite(pin_Relay_Lamp, HIGH);
lamp_flag=true;
pinMode(pin_Led, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
pinMode(IR_gnd_pin, OUTPUT);
pinMode(IR_vcc_pin, OUTPUT);
digitalWrite(IR_gnd_pin, LOW);
digitalWrite(IR_vcc_pin, HIGH);
irrecv.enableIRIn();
Serial.begin(9600);
}
void loop()
{
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume();
}
if (results.value == 0x2C80A857 || results.value == 0x6D79949 || results.value == 0xFA918620)
{
digitalWrite(pin_Relay_Lamp,HIGH);
lamp_flag=true;
digitalWrite(pin_Led,LOW);
led_flag=false;
digitalWrite(pin_Relay_Lamp_bra, HIGH);
lamp_bra_flag=true;
}
Пробовал искать в инетах похожую проблему, да сложно задать гуглу правильный вопрос)
Кто знает, что за беда?
Добавлю, саму ардуину тоже менял
Вставка программного кода в тему/комментарий
И кстати, вставлять нужно полностью, а не огрызки.
Во-первых, на форуме есть правила вставки кода в пост. Во-вторых - использовать results.value после irrecv.resume() - идея не из лучших. В-третьих.. сначала решите то, что "во-вторых", а там посмотрим.
Во-первых, на форуме есть правила вставки кода в пост.
Извините, поторопился со вставкой кода, что-то и исправить теперь не могу. Есть такая возможность?
Во-вторых - использовать results.value после irrecv.resume() - идея не из лучших. В-третьих.. сначала решите то, что "во-вторых", а там посмотрим.
Здесь не очень понял, а как надо бы?
Есть такая возможность?
Есть. Вместо того, чтобы спрашивать "Есть такая возможность?" - просто вставить код.
Здесь не очень понял, а как надо бы?
Срначала использовать result (например, присвоить чему-нибудь или весь разбор сделать), а уж потом вызывать resume.
Есть. Вместо того, чтобы спрашивать "Есть такая возможность?" - просто вставить код.
Ну вот честно, не вижу кнопку, как редактировать исходное сообщение
Попробую поменять код. Но это вечером, потом отпишусь. Пока спасибо за быстрые ответы, не думал, что тут все так оперативно) Приятно)
Ну вот честно, не вижу кнопку, как редактировать исходное сообщение
Да при чём тут исходное?
Просто вставьте код, вмето того, чтобы писать, что Вы не видите кнопки - в новое сообщение вставьте.
И полностью, а не огрызок.
Ну вот честно, не вижу кнопку, как редактировать исходное сообщение
Да при чём тут исходное?
Просто вставьте код, вмето того, чтобы писать, что Вы не видите кнопки - в новое сообщение вставьте.
И полностью, а не огрызок.
Хотел исправить, чтобы было уже по всем правилам
Вот код целиком
Вся обработка (строки 61-115) должна находиться под if из строки 56. Сейчас Вы обрабатываете сигнал, которые вообще-то не пришёл. Вот, допустим, у Вас сообщение НЕ пришло. if в строке 56 не сработал. И что Вы обрабатываете в строках 61-115?
Так что, просто берите строки 58-59 и переносите их росле строки 115. Должно полегчать (заодно и с resume всё станет правильно).
Кстати, теперь понятно откуда было навязчивое требование правильной вставки кода? Как бы я всё это писал без номеров строк?
Теперь все понятно. И с кодом, и с вставкой. Буду пробовать. Спасибо!
Разобрался. В проекте же ещё кнопка была, тоже метров на 4 првода. Я копал по ИК, оказалось кнопка накидывает ардуине. Подтянул резистором к питанию и все нормализовалось.
И все таки проблема есть. Редко, но раза два за день, на пине 3, который отвечает за управление твердотельного реле, появляется переключение состояний (появляется 5В, если было 0 и наоборот). Реле управляет светильником 220В. Чаще всего это связано с скачками в сети 220В. Например, включил пылесос - переключилось реле. Бывает, я не знаю источника скачка, но переключение произошло. Бывает, я включаю пылесос несколько раз - переключения нету. Явной зависимости нет. Ардуино запитано через блок питания, на нем есть еще одно реле (электромагнитное), котрое так же управляет светильником 220В. На нем переключений нет.
Значит ваш "антидребезг" не работает должным образом.