Ардуина "дуреет" от сигналов с ИК

aiminkai
Offline
Зарегистрирован: 29.03.2018

Добрый день.

Управляю через 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; 
  }

Пробовал искать в инетах похожую проблему, да сложно задать гуглу правильный вопрос)

Кто знает, что за беда?

aiminkai
Offline
Зарегистрирован: 29.03.2018

Добавлю, саму ардуину тоже менял 

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

Вставка программного кода в тему/комментарий

И кстати, вставлять нужно полностью, а не огрызки.

sadman41
Offline
Зарегистрирован: 19.10.2016

Во-первых, на форуме есть правила вставки кода в пост. Во-вторых - использовать results.value после irrecv.resume() - идея не из лучших. В-третьих.. сначала решите то, что "во-вторых", а там посмотрим.

aiminkai
Offline
Зарегистрирован: 29.03.2018

sadman41 пишет:

Во-первых, на форуме есть правила вставки кода в пост.

Извините, поторопился со вставкой кода, что-то и исправить теперь не могу. Есть такая возможность?

sadman41 пишет:
 

Во-вторых - использовать results.value после irrecv.resume() - идея не из лучших. В-третьих.. сначала решите то, что "во-вторых", а там посмотрим.

Здесь не очень понял, а как надо бы?

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

aiminkai пишет:

Есть такая возможность?

Есть. Вместо того, чтобы спрашивать "Есть такая возможность?" - просто вставить код.

aiminkai пишет:

Здесь не очень понял, а как надо бы?

Срначала использовать result (например, присвоить чему-нибудь или весь разбор сделать), а уж потом вызывать resume.

 

aiminkai
Offline
Зарегистрирован: 29.03.2018

ЕвгенийП пишет:

Есть. Вместо того, чтобы спрашивать "Есть такая возможность?" - просто вставить код.

Ну вот честно, не вижу кнопку, как редактировать исходное сообщение

aiminkai
Offline
Зарегистрирован: 29.03.2018

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

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

aiminkai пишет:

Ну вот честно, не вижу кнопку, как редактировать исходное сообщение

Да при чём тут исходное?

Просто вставьте код, вмето того, чтобы писать, что Вы не видите кнопки - в новое сообщение вставьте.

И полностью, а не огрызок.

aiminkai
Offline
Зарегистрирован: 29.03.2018

ЕвгенийП пишет:

aiminkai пишет:

Ну вот честно, не вижу кнопку, как редактировать исходное сообщение

Да при чём тут исходное?

Просто вставьте код, вмето того, чтобы писать, что Вы не видите кнопки - в новое сообщение вставьте.

И полностью, а не огрызок.

Хотел исправить, чтобы было уже по всем правилам

Вот код целиком

#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(); // Receive the next value
   } 
//========================================= включение всего =================================================================================================================   
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; 
  }

if  (results.value == 0x2C806A95 || results.value == 0x89211467 || results.value == 0x9593FCC || results.value == 0x78480B02)
  {
  digitalWrite(pin_Relay_Lamp,LOW);
  lamp_flag=false;
  digitalWrite(pin_Relay_Lamp_bra, LOW); 
  lamp_bra_flag=false; 
  }
//========================================= включение люстры =================================================================================================================
 if (results.value == 0x2C8012ED || results.value == 0x634A88E7 || results.value == 0x9C59C84C || results.value == 0x9E1E9682 || results.value == 0x650F571D)
 {
  
  digitalWrite(pin_Relay_Lamp,HIGH);
  lamp_flag=true;
  digitalWrite(pin_Led,LOW);
  led_flag=false;
 }
 if (results.value == 0x2C80F20D || results.value == 0xAFD60AA0 || results.value == 0x519314C9)
  {
   
   digitalWrite(pin_Relay_Lamp,LOW);
  lamp_flag=false;
  }

//========================================= включение бра =================================================================================================================
 if (results.value == 0x2C80AA55 || results.value == 0xAC6DDC64 || results.value == 0x54FB4305 || results.value == 0x9593FCC || results.value == 0x89211467)
 {
  digitalWrite(pin_Relay_Lamp_bra, HIGH); 
  lamp_bra_flag=true; 
  digitalWrite(pin_Led,LOW);
  led_flag=false;
 }
 if (results.value == 0x5ACBE564 || results.value == 0xA69D3A05 || results.value == 0x2C80827D)
  {digitalWrite(pin_Relay_Lamp_bra,0); 
  lamp_bra_flag=false;   
  }  

//========================================= включение led =====================================================================================================================
 if (results.value == 0x40F1FA2B || results.value == 0x40F1FA2B || results.value == 0xC077253E || results.value == 0xE0B32FD9 || results.value == 0x2C806897)
 {
  digitalWrite(pin_Led, HIGH); 
  }
 if (results.value == 0xDDAD9E88 || results.value == 0x2C80B04F || results.value == 0x23BB80E1 || results.value == 0xF5088BC4)
  {
    digitalWrite(pin_Led,0); 
   }    
//==================================== обработка кнопки Lamp ============================================================================================================================= 
   
  btn = !digitalRead(pin_btn); // считать текущее положение кнопки
  
  if (btn == 1 && btn_flag == 0 && millis() - btn_Press_time > dbc) // кнопка нажата, выставляю флаг
  {       
    btn_flag=1;
    btn_Press_time=millis();
    delay(wait);
  }

  if (btn==0 && btn_flag == 1)                      // кнопка отжата, начинаем обработку
  {
       Serial.println("0");
      btn_flag=0;
      btn_Release_time=millis();
      delay(wait);
      
    if (btn_Release_time - btn_Press_time < hold_time)
        {                                                     // если кратковременное нажатие
         lamp_bra_flag=!lamp_bra_flag;
         digitalWrite(pin_Relay_Lamp_bra,lamp_bra_flag);    // переключаю бра                  
         delay(wait);
       
        }
     else {if (btn_Release_time - btn_Press_time > hold_time)
        {                                                     // если удерживали больше hold_time
         lamp_flag=!lamp_flag;
         digitalWrite(pin_Relay_Lamp,lamp_flag);                        // переключаю лампу осн. коридора
         delay(wait);
         } 
       }
     } 
//======================= включение/выключение LED подсветки по флагам релюшек ================================================     
if (lamp_bra_flag==false && lamp_flag==false && led_flag==false)
  {
    digitalWrite(pin_Led, HIGH);
     led_flag=true;
  }
if ((lamp_bra_flag==true || lamp_flag==true) && led_flag==true)
{
    digitalWrite(pin_Led, LOW);
     led_flag=false;
  }
  
//==================================================== конец =======================================================================

}





 

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

Вся обработка (строки 61-115) должна находиться под if из строки 56. Сейчас Вы обрабатываете сигнал, которые вообще-то не пришёл. Вот, допустим, у Вас сообщение НЕ пришло. if в строке 56 не сработал. И что Вы обрабатываете в строках 61-115?

Так что, просто берите строки 58-59 и переносите их росле строки 115. Должно полегчать (заодно и с resume всё станет правильно).

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

aiminkai
Offline
Зарегистрирован: 29.03.2018

Теперь все понятно. И с кодом, и с вставкой. Буду пробовать. Спасибо!

aiminkai
Offline
Зарегистрирован: 29.03.2018

Разобрался. В проекте же ещё кнопка была, тоже метров на 4 првода. Я копал по ИК, оказалось кнопка накидывает ардуине. Подтянул резистором к питанию и все нормализовалось.

aiminkai
Offline
Зарегистрирован: 29.03.2018

И все таки проблема есть. Редко, но раза два за день, на пине 3, который отвечает за управление твердотельного реле, появляется переключение состояний (появляется 5В, если было 0 и наоборот). Реле управляет светильником 220В. Чаще всего это связано с скачками в сети 220В. Например, включил пылесос - переключилось реле. Бывает, я не знаю источника скачка, но переключение произошло. Бывает, я включаю пылесос несколько раз - переключения нету. Явной зависимости нет. Ардуино запитано через блок питания, на нем есть еще одно реле (электромагнитное), котрое так же управляет светильником 220В. На нем переключений нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Значит ваш "антидребезг" не работает должным образом.