ИК управление реле --- реле не реагирует
- Войдите на сайт для отправки комментариев
Пт, 19/07/2019 - 15:19
Я взялся за идею сделать ИК управление реле и вот мой план действий:
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 и немедленно, сразу же выключаете в строке 30.
А как проверить это, чтобы точно уж убедится?
Вставьте перед строками 25 и 30 вывод в сериал чего-нибудь, только разного (например, "#25" b "#30") и убедитесь, что срабатывают обе печати.
Так нет, там же он фиксирует своё состояние?
Ой, в этом то и ошибка, мне нужно зафиксировать состояния переключения, а у меня там этого не прописано. Если после 25 и 30 строчек поставить delay(2CE9); - Сработает?
С какого перепугу? Чем Вам делэй-то поможет?
Поставьте else в начале строки №28. Нафига её проверять, если предыдущее условие уже сработало?
И ещё, не знаю зачем Вы написали хвосты "results.value;" в строках 25 и 30. Они не делают ничего от слова совсем. Убирайте.
Теперь компилятор выдаёт ошибку #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(); } }Всё, исправил ошибку - else:
Нужно - else
Но реле попрежнему не щелкает
Не исправили, а новую внесли. Вы вообще, понимаете, что Вы пишете?
Я же Ва по-русски написал "Поставьте else в начале строки №28" , а Вы поставили его вместо строки 28.
И ещё, если "не щёлкает", то во-первых, вставьте печати о которых я Вам писал, а во-вторых, покажите мне, что печатает.
Хорошо, сейчас попробую
Так, во что у меня получилось:
#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(); } }Ой, я сейчас попробовал заменить пульт и синхронизировать его кнопку:
#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(); } }В итоге сириал отвечает(+ я теперь слышу что реле щёлкает):
Он щёлкает, но не могли бы дать совет, как сделать чтобы он фиксировался?
Нужно просто устранить дребезг?
А как он щелкает? Один раз нажмёшь кнопку и потом постоянно? Или Вы каждый раз кнопку нажимаете, чтобы сработало. Опишите подробно, я же не вижу ничего.
Нажимаю каждый раз чтобы сработала
Также когда нажимаю на кнопку, реле щёлкает и загорается светодиод и сразу тухнет вместе с реле
Т.е., одно нажатие выгляти как два? Правильно?
Да, забыл сказать, этот светодиод находиться на самом реле и он при одном нажатии загорается только один раз
Посмотрите, я попробовал накидать скетч что бы избавиться от дребезга(правда компилятор выдаёт ошибку) :
#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(); } }Да, забыл сказать, этот светодиод находиться на самом реле и он при одном нажатии загорается только один раз
А что ещё Вы забыли сказать? Давайте так не шутить.
И всё-таки, сколько же раз включается реле от одного нажатия?
В общем, так, приводите текущий скетч и выдачу в монитор (точно как в посте #12) только в выдачу добавьте вставки в тех местах, где Вы нажжимаете кнопки. Чтобы я понимал когда и что происходит.
Открыл скетч, но не понял что означает выдача
не понял что означает выдача
То, что он выдаёт, типа вот этого
А что Вы имеете ввиду под монитором? Если монитор порта, то туда скетч не загружается
Так, когда скетч работает, он в монитор порта что-то печатает?
Мне нужен свежий текст скетча и тект того, что печатает в монитор порта. В последнем (в тексте печати) нужно вставить пометки в какие моменты Вы нажимали кнопку, чтобы я понимал что печатаеся между нажатиями.
КОД :
#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(); } }ПОРТ:
Вообще-то не должно быть, т.к. resume вызывается, но чтобы уж окончательно развеять сомнения, давайте так.
После строки №35 вставьте строку
results.value=0;
Если ничекго не изменится, то скорее всего дребезг.
Проверьте. Если вдруг поможет, то и хорошо
Да, кстати почему так? Сам только сейчас это подметил.
Как она сама автоматически выключается за миллисекунды, при это я делаю одно нажатие на кнопку и происходит одно мигание светодиода, а в тексте порта сигнал 55AA14EB подаётся 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==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; } }Сначала обрадовался аж закричал - "УРА!!!!", но потом при повторном нажатии обратно мигает, стал тыкать, тыкать и увидел, что переодически получается фиксировать состояние, но намного больше миганий, нужно тыкнуть раз 10-20, и то не факт, что получится
Что подскажите делать в такой ситуации?
Может так,
#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; } }но без антидребезга работать будет не стабильно
А как сделать анти дребезг? С функцией debounce() ?
Может так,
Попобовал, вначале получилось, но потом перестала вообще принимать сигналы
Ябы на Вашем месте сначала логику отработал на кнопке примерно так
#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)); } } }а когда все получится и к логике не будет вопросов, подключал пульт и тогда былобы ясно где проблема
Я немного не понял Вас, а что значит отработать логику на кнопке?
Что тут подразумевается под кнопкой?
К стати - на копке также отработать и антидребезг
Ну вот выше я привел тот же самый код но вместо пульта поставил кнопку (какбы имитация пульта) на #define but1 2 и при нажатии этой кнопки - имитировалось нажатие на пульте
А bool это сокращение boolean?
Пробовал в Web найти, но там ничего не написано
Читаю и удивляюсь.
ГРТ, у Вас на пульте только одна кнопка работает?
Вот рабочий скетч на три реле с возможностью дальнейшего развития! Выключение всех релюшек происходит специальной кнопкой!! Повторные нажатия на кнопку с номером канала - включают/отключают соответствующую релюху.
В теме есть скетч по-проще, выбирайте
Как Вы и сказали и начал отрабатывать логику с самого начала. Я решил поделить логику на "Код и сборка(без подсказок)" и "Алгоритм действий", и также поделил на следующие темы:
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); } }В итоге код написал правильно, схему собрал правильно( я её сверил ), но тут то и обнаружилась проблема светодиод,после нажатия кнопки, работает с ОГРОМНЫМ опозданием, а дело в том, что такие же проблемы наблюдались и с прошлой Ардуино Уно, а эту я купил сегодня специально для того, чтобы быть уверенным, что все детали исправны(я ещё купил и второй фотоприёмник)
Покупал я в магазине специализирующемся на радио-деталях и как Вы думаете, мне продали "брак" или проблема в чём-то другом?
Вот рабочий скетч на три реле с возможностью дальнейшего развития!
А где здесь вставлять пин реле и сигнал кнопки от пульта?
#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); } } }/* АЛГОРИТМ - КНОПКА * 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)); }но тут то и обнаружилась проблема светодиод,после нажатия кнопки, работает с ОГРОМНЫМ опозданием, а дело в том, что такие же проблемы наблюдались и с прошлой Ардуино Уно, а эту я купил сегодня специально для того, чтобы быть уверенным, что все детали исправны
ОГРОМНОЕ - это не технический термин. Совершенно непонятно, что именно Вы под ним подразумеваете. Одну мкс? Одну мс? Один час? Один год?
(я ещё купил и второй фотоприёмник)
Покупал я в магазине специализирующемся на радио-деталях и как Вы думаете, мне продали "брак" или проблема в чём-то другом?
Фотоприемники бывают разной конструкции, при этом время срабатывания у них может различаться на порядки. Да и в схеме можно накосячить, поэтому без конкретных данных сделать какое-либо заключение не представляется возможным.
Как Вы и сказали и начал отрабатывать логику с самого начала. Я решил поделить логику на "Код и сборка(без подсказок)" и "Алгоритм действий", и также поделил на следующие темы:
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); } }Как по мне то решение Вы приняли Очень даже правельное (если хотите научиться а не спрашивать про про все подряд. Да еще и увидите что это очень ИНТЕРЕСНО) По поводу кода, задержек быть не должно. Проверте схему, поменяйте пины. И еще желательно освоить "Протеус" _ это эмулятор ардуино и в нем отлаживать все свои проэкты, очень удобно.
Вот рабочий скетч на три реле с возможностью дальнейшего развития!
А где здесь вставлять пин реле и сигнал кнопки от пульта?
цитируемый Вами скетч предназначен для проверки кнопок Вашего пульта! IR-датчик подключается к пину 2 !
Я выложил Вам ссылку на другой пост, №5 в указанной теме. Открыть текст скетча сможите? :)
072byteC1 = 4;//пин канала №1073byteC2 = 5;//пин канала №2074byteC3 = 6;//пин канала №3Тему предлогаю перенести в Песочницу!
[quote=andriano]
ОГРОМНОЕ - это не технический термин. Совершенно непонятно, что именно Вы под ним подразумеваете. Одну мкс? Одну мс? Один час? Один год?
[quote]
Задержка в диапозоне 1-3 минуты
NikShel, спасибо за скетч! Но к сожалению пока не смогу его проверить из-за проблем с Ардуино
vosara, спасибо! Я постараюсь скинуть фото схемы
Загрузите стандартный БЛИНК и посмотрите частоту мигания диода - должно быть 1 раз в секунду
Хорошо, сейчас попробую