ИК управление реле --- реле не реагирует

Grt
Offline
Зарегистрирован: 19.07.2019

Я взялся за идею сделать ИК управление реле и вот мой план действий:

1) Скачал IRremots и нашёл кнопку

2) Написал и загрузил  скетч

#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

int rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() 
{
  if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);

    if(results.value==0x2CE9&&rele==0)
    {
      digitalWrite(5,HIGH);rele=1;results.value;
    }

    if(results.value==0x2CE9&&rele==1)
    {
      digitalWrite(5,LOW);rele=0;results.value;
    }

  irrecv.resume();
  }

}

 

3) Подсоеденил фотоприёмник и реле, а реле не реагирует

Заранее спасибо

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

Реагирует, только Вы заметить не успеваете. Вы ж его включаете в строке 25 и немедленно, сразу же выключаете в строке 30.

Grt
Offline
Зарегистрирован: 19.07.2019

А как проверить это, чтобы точно уж убедится?

 

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

Вставьте перед строками 25 и 30 вывод в сериал чего-нибудь, только разного (например, "#25" b "#30") и убедитесь, что срабатывают обе печати. 

Grt
Offline
Зарегистрирован: 19.07.2019

Так нет, там  же он фиксирует своё состояние?

Grt
Offline
Зарегистрирован: 19.07.2019

Ой, в этом то и ошибка, мне нужно зафиксировать состояния переключения, а у меня там этого не прописано. Если после 25 и 30 строчек поставить delay(2CE9); - Сработает?

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

С какого перепугу? Чем Вам делэй-то поможет?

Поставьте else в начале строки №28. Нафига её проверять, если предыдущее условие уже сработало?

И ещё, не знаю зачем Вы написали хвосты "results.value;" в строках 25 и 30. Они не делают ничего от слова совсем. Убирайте.

Grt
Offline
Зарегистрирован: 19.07.2019
Теперь компилятор выдаёт ошибку
#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

int rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() 
{
  if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);

    if(results.value==0x2CE9&&rele==0)
    {
      digitalWrite(5,HIGH);rele=1;
    }
    
    else:
    {
      digitalWrite(5,LOW);rele=0;
    }

  irrecv.resume();
  }

}

 

Grt
Offline
Зарегистрирован: 19.07.2019

Всё, исправил ошибку - else: 

Нужно - else

Но реле попрежнему не щелкает

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

Не исправили, а новую внесли. Вы вообще, понимаете, что Вы пишете?

Я же Ва по-русски написал "Поставьте else в начале строки №28" , а Вы поставили его вместо строки 28.

И ещё, если "не щёлкает", то во-первых, вставьте печати о которых я Вам писал, а во-вторых, покажите мне, что печатает.

Grt
Offline
Зарегистрирован: 19.07.2019

Хорошо, сейчас попробую

Grt
Offline
Зарегистрирован: 19.07.2019

Так, во что у меня получилось:

#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

int rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() 
{
  if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);

    if(results.value==0x2CE9&&rele==0)
    {
      Serial.println("releON");
      digitalWrite(5,HIGH);rele=1;
    }

    else if(results.value==0x2CE9&&rele==1)
    {
      Serial.println("releOff");
      digitalWrite(5,LOW);rele=0;
    }

  irrecv.resume();
  }

}

 

Grt
Offline
Зарегистрирован: 19.07.2019

Ой, я сейчас попробовал заменить пульт и синхронизировать его кнопку:

 

#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

int rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() 
{
  if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);

    if(results.value==0x55AA14EB&&rele==0)
    {
      Serial.println("releON");
      digitalWrite(5,HIGH);rele=1;
    }

    else if(results.value==0x55AA14EB&&rele==1)
    {
      Serial.println("releOff");
      digitalWrite(5,LOW);rele=0;
    }

  irrecv.resume();
  }

}

 

В итоге сириал отвечает(+ я теперь слышу что реле щёлкает):

55AA14EB
releON
55AA14EB
releOff
55AA14EB
releON
55AA14EB
releOff
 
Grt
Offline
Зарегистрирован: 19.07.2019

Он щёлкает, но не могли бы дать совет, как сделать чтобы он фиксировался?

Нужно просто устранить дребезг?

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

А как он щелкает? Один раз нажмёшь кнопку и потом постоянно? Или Вы каждый раз кнопку нажимаете, чтобы сработало. Опишите подробно, я же не вижу ничего.

Grt
Offline
Зарегистрирован: 19.07.2019

Нажимаю каждый раз чтобы сработала

Grt
Offline
Зарегистрирован: 19.07.2019

Также когда нажимаю на кнопку, реле щёлкает и загорается светодиод и сразу тухнет вместе с реле

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

Т.е., одно нажатие выгляти как два? Правильно?

Grt
Offline
Зарегистрирован: 19.07.2019

Да, забыл сказать, этот светодиод находиться на самом реле и он при одном нажатии загорается только один раз

Grt
Offline
Зарегистрирован: 19.07.2019

Посмотрите, я попробовал накидать скетч что бы избавиться от дребезга(правда компилятор выдаёт ошибку) :

#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

boolean LastValue = 0;
boolean CurrentValue = 0;
boolean ReleOn = false; 

int rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

boolean debounce( boolean last)
{
  boolean current = digitalRead(irrecv);
  if (current != last)
  {
    delay(5);
    current = digitalRead(irrecv);
    return current;
  }
}

void loop() 
{
  CarrentValue = debounce(LastValue);
  if (LastValue == LOW && CurrentValue == HIGH)
  {
    ReleOn = !ReleOn;
  }
  LastValue = CurrentValue;
  digitalWrite(rele, ReleOn);
  
  if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);

    if(results.value==0x55AA14EB&&rele==0)
    {
      Serial.println("releON");
      digitalWrite(5,HIGH);rele=1;
    }

    else if(results.value==0x55AA14EB&&rele==1)
    {
      Serial.println("releOff");
      digitalWrite(5,LOW);rele=0;
    }

  irrecv.resume();
  }

}

 

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

Grt пишет:

Да, забыл сказать, этот светодиод находиться на самом реле и он при одном нажатии загорается только один раз

А что ещё Вы забыли сказать? Давайте так не шутить.

И всё-таки, сколько же раз включается реле от одного нажатия?

В общем, так, приводите текущий скетч и выдачу в монитор (точно как в посте #12) только в выдачу добавьте вставки в тех местах, где Вы нажжимаете кнопки. Чтобы я понимал когда и что происходит.

Grt
Offline
Зарегистрирован: 19.07.2019

Открыл скетч, но не понял что означает выдача

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

Grt пишет:

не понял что означает выдача

То, что он выдаёт, типа вот этого

55AA14EB
releON
55AA14EB
releOff
55AA14EB
releON
55AA14EB
releOff
Grt
Offline
Зарегистрирован: 19.07.2019

А что Вы имеете ввиду под монитором? Если монитор порта, то туда скетч не загружается

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

Так, когда скетч работает, он в монитор порта что-то печатает?

Мне нужен свежий текст скетча и тект того, что печатает в монитор порта. В последнем (в тексте печати) нужно вставить пометки в какие моменты Вы нажимали кнопку, чтобы я понимал что печатаеся между нажатиями.

Grt
Offline
Зарегистрирован: 19.07.2019

КОД :

#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

int rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() 
{
  if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);

    if(results.value==0x55AA14EB&&rele==0)
    {
      Serial.println("releON");
      digitalWrite(5,HIGH);rele=1;
    }

    else if(results.value==0x55AA14EB&&rele==1)
    {
      Serial.println("releOff");
      digitalWrite(5,LOW);rele=0;
    }

  irrecv.resume();
  }

}

ПОРТ:

55AA14EB // Нажал на кнопку
releON      // Дальше всё автоматически, начиная с releON
55AA14EB
releOff
 
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Вообще-то не должно быть, т.к. resume вызывается, но чтобы уж окончательно развеять сомнения, давайте так.

После строки №35 вставьте строку

results.value=0;

Если ничекго не изменится, то скорее всего дребезг.

Проверьте. Если вдруг поможет, то и хорошо

Grt
Offline
Зарегистрирован: 19.07.2019

Да, кстати почему так? Сам только сейчас это подметил. 

Как она сама автоматически выключается за миллисекунды, при это я делаю одно нажатие на кнопку  и происходит одно мигание светодиода, а в тексте порта сигнал 55AA14EB подаётся 2 раза - включить( я нажимаю) и выключить (какая то неведомая сила)

Grt
Offline
Зарегистрирован: 19.07.2019

Я тут не перепутал случайно ничего?)

#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

int rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() 
{
  if(irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);

    if(results.value==0x55AA14EB&&rele==0)
    {
      Serial.println("releON");
      digitalWrite(5,HIGH);rele=1;
    }

    else if(results.value==0x55AA14EB&&rele==1)
    {
      Serial.println("releOff");
      digitalWrite(5,LOW);rele=0;
    }

  irrecv.resume();
  results.value=0;
  }

}

 

Grt
Offline
Зарегистрирован: 19.07.2019

Сначала обрадовался аж закричал - "УРА!!!!", но потом при повторном нажатии обратно мигает, стал тыкать, тыкать и увидел, что переодически получается фиксировать состояние, но намного больше миганий, нужно тыкнуть раз 10-20, и то не факт,  что  получится

Grt
Offline
Зарегистрирован: 19.07.2019

Что подскажите делать в такой ситуации?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может так,

#include "IRremote.h"

IRrecv irrecv(2);
decode_results results;

bool f_push=0;
bool rele=0;

void setup() 
{
  pinMode(5,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() 
{
  if(irrecv.decode(&results))
  {
    if(results.value==0x55AA14EB)f_push=1;
    else f_push=0;

    if(f_push != rele)
    {
      rele = !rele;
      if(rele){
        digitalWrite(5, !digitalRead(5));
      }
    }

  irrecv.resume();
  results.value=0;
  }

}

но без антидребезга работать будет не стабильно

Grt
Offline
Зарегистрирован: 19.07.2019

А как сделать анти дребезг? С функцией debounce() ?

Grt
Offline
Зарегистрирован: 19.07.2019

vosara пишет:

Может так,

Попобовал, вначале получилось, но потом перестала вообще принимать сигналы 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Ябы на Вашем месте сначала логику отработал на кнопке примерно так

#define but1 2

//IRrecv irrecv(2);
//decode_results results;

bool f_push=0;
bool rele=0;

void setup() 
{
  pinMode(5,OUTPUT);
   pinMode(but1, INPUT);
  Serial.begin(9600);
//  irrecv.enableIRIn();

}

void loop() 
{
    if(digitalRead(but1))f_push=1;
    else f_push=0;

    if(f_push != rele)
    {
      rele = !rele;
      if(rele){
        digitalWrite(5, !digitalRead(5));
      }
  }

}

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

Grt
Offline
Зарегистрирован: 19.07.2019

Я немного не понял Вас, а что значит отработать логику на кнопке?

Что тут подразумевается под кнопкой? 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

К стати - на копке также отработать и антидребезг

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Ну вот выше я привел тот же самый код но вместо пульта поставил кнопку (какбы имитация пульта) на #define but1 2 и при нажатии этой кнопки - имитировалось нажатие на пульте

Grt
Offline
Зарегистрирован: 19.07.2019

А bool это сокращение boolean?

Пробовал в Web найти, но там ничего не написано

NikShel
Offline
Зарегистрирован: 21.01.2018

Читаю и удивляюсь.

ГРТ, у Вас на пульте только одна кнопка работает?

Вот рабочий скетч на три реле с возможностью дальнейшего развития! Выключение всех релюшек происходит специальной кнопкой!! Повторные нажатия на кнопку с номером канала - включают/отключают соответствующую релюху.

В теме есть скетч по-проще, выбирайте

 

 

Grt
Offline
Зарегистрирован: 19.07.2019

Как Вы и сказали и начал отрабатывать логику с самого начала. Я решил поделить логику на "Код и сборка(без подсказок)" и "Алгоритм действий", и также поделил на следующие темы: 

1) Кнопка(стандартная схема с кнопкой, светодиодом и стягивающим резистором)

2) Кнопка + антидребизг

3) ИК управление(кнопкой)

4) ИК управление(кнопкой)+антидребизг

 

Я принился за первую тему(алгоритм я решил писать в начале как многострочный коментарий):

/* АЛГОРИТМ - КНОПКА
 * 1) Считываем текущее состояние кнопки 
 * 2) Если она нажата, то светодиод горит
 * 3) Если она не нажата, то светодиод не горит
 */

 const int LED = 12; 
 const int BUTTON = 2;

 void setup()
 {
  pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);
 }

void loop()
{
  if(digitalRead(BUTTON)==LOW)
  {
    digitalWrite(LED,LOW);
  }
  else 
  {
    digitalWrite(LED,HIGH);
  }
}

В итоге код написал правильно, схему собрал правильно( я её сверил ), но тут то и обнаружилась проблема светодиод,после нажатия кнопки, работает с ОГРОМНЫМ опозданием, а дело в том, что такие же проблемы наблюдались и с прошлой Ардуино Уно, а эту я купил сегодня специально для того, чтобы быть уверенным, что все детали исправны(я ещё купил и второй фотоприёмник)

Покупал я в магазине специализирующемся на радио-деталях и как Вы думаете, мне продали "брак" или проблема в чём-то другом?

Grt
Offline
Зарегистрирован: 19.07.2019

NikShel пишет:

Вот рабочий скетч на три реле с возможностью дальнейшего развития! 

 

А где здесь вставлять пин реле и сигнал кнопки от пульта?

#include "IRLremote.h"
#define pinIR 2 // only D2
CHashIR IRLremote;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Startup"));
  if (!IRLremote.begin(pinIR))
    Serial.println(F("You did not choose a valid pin."));
}

void loop() {
 //    Serial.println("0x");
  if (IRLremote.available()) {
    auto data = IRLremote.read();
    if (data.command != 292984781) {
      Serial.print("0x");
      Serial.println(data.command, HEX);
    }
  }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Grt пишет:

 

/* АЛГОРИТМ - КНОПКА
 * 1) Считываем текущее состояние кнопки 
 * 2) Если она нажата, то светодиод горит
 * 3) Если она не нажата, то светодиод не горит
 */

 const int LED = 12; 
 const int BUTTON = 2;

 void setup()
 {
  pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);
 }

void loop()
{
  if(digitalRead(BUTTON)==LOW)
  {
    digitalWrite(LED,LOW);
  }
  else 
  {
    digitalWrite(LED,HIGH);
  }
}

В итоге код написал правильно,

Ну, строго говоря, правильный код должен выглядеть примерно так:

void loop() {
    digitalWrite(LED, digitalRead(BUTTON));
}

Цитата:

 но тут то и обнаружилась проблема светодиод,после нажатия кнопки, работает с ОГРОМНЫМ опозданием, а дело в том, что такие же проблемы наблюдались и с прошлой Ардуино Уно, а эту я купил сегодня специально для того, чтобы быть уверенным, что все детали исправны

ОГРОМНОЕ - это не технический термин. Совершенно непонятно, что именно Вы под ним подразумеваете. Одну мкс? Одну мс? Один час? Один год?

Цитата:

(я ещё купил и второй фотоприёмник)

Покупал я в магазине специализирующемся на радио-деталях и как Вы думаете, мне продали "брак" или проблема в чём-то другом?

Фотоприемники бывают разной конструкции, при этом время срабатывания у них может различаться на порядки. Да и в схеме можно накосячить, поэтому без конкретных данных сделать какое-либо заключение не представляется возможным.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Grt пишет:

Как Вы и сказали и начал отрабатывать логику с самого начала. Я решил поделить логику на "Код и сборка(без подсказок)" и "Алгоритм действий", и также поделил на следующие темы: 

1) Кнопка(стандартная схема с кнопкой, светодиодом и стягивающим резистором)

2) Кнопка + антидребизг

3) ИК управление(кнопкой)

4) ИК управление(кнопкой)+антидребизг

 

Я принился за первую тему(алгоритм я решил писать в начале как многострочный коментарий):

/* АЛГОРИТМ - КНОПКА
 * 1) Считываем текущее состояние кнопки 
 * 2) Если она нажата, то светодиод горит
 * 3) Если она не нажата, то светодиод не горит
 */

 const int LED = 12; 
 const int BUTTON = 2;

 void setup()
 {
  pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);
 }

void loop()
{
  if(digitalRead(BUTTON)==LOW)
  {
    digitalWrite(LED,LOW);
  }
  else 
  {
    digitalWrite(LED,HIGH);
  }
}

Как по мне то решение Вы приняли Очень даже правельное (если хотите научиться а не спрашивать про про все подряд. Да  еще и увидите что это очень ИНТЕРЕСНО) По поводу кода, задержек быть не должно. Проверте схему, поменяйте пины. И еще желательно освоить "Протеус" _ это эмулятор ардуино и в нем отлаживать все свои проэкты, очень удобно.

NikShel
Offline
Зарегистрирован: 21.01.2018

Grt пишет:

NikShel пишет:

Вот рабочий скетч на три реле с возможностью дальнейшего развития! 

А где здесь вставлять пин реле и сигнал кнопки от пульта?

#include "IRLremote.h"
#define pinIR 2 // only D2
CHashIR IRLremote;

цитируемый Вами скетч предназначен для проверки кнопок Вашего пульта! IR-датчик подключается к пину 2 !

Я выложил Вам ссылку на другой пост, №5 в указанной теме. Открыть текст скетча сможите? :)

072 byte C1 = 4; //пин канала №1
073 byte C2 = 5; //пин канала №2
074 byte C3 = 6; //пин канала №3
пины для релюх 
NikShel
Offline
Зарегистрирован: 21.01.2018

Тему предлогаю перенести в Песочницу!

Grt
Offline
Зарегистрирован: 19.07.2019

[quote=andriano]

 

ОГРОМНОЕ - это не технический термин. Совершенно непонятно, что именно Вы под ним подразумеваете. Одну мкс? Одну мс? Один час? Один год?

[quote]

Задержка в диапозоне 1-3 минуты

Grt
Offline
Зарегистрирован: 19.07.2019

NikShel, спасибо за скетч! Но к сожалению пока не смогу его проверить из-за проблем с Ардуино

Grt
Offline
Зарегистрирован: 19.07.2019

vosara, спасибо! Я постараюсь скинуть фото схемы

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Загрузите стандартный БЛИНК и посмотрите частоту мигания диода - должно быть 1 раз в секунду

Grt
Offline
Зарегистрирован: 19.07.2019

Хорошо, сейчас попробую