В предыдущем уроке я уже рассказал как можно подключить IR приемник к Arduino и включать и выключать светодиод с помощью пульта дистанционного управления (ДУ).
После чего мне поступили вопросы :
1. «А возможно ли организовать чтобы, например, включался светодиод но только на время удержания кнопки, и гас сразу после ее освобождения?»,
2. «Подскажите пожалуйста, а возможно ли организовать чтобы, например, включался светодиод но только на время удержания кнопки, и гас сразу после ее освобождения? нигде не получилось найти инфу»
Данный вопрос в принципе простой и я делал машину на пульте управления и Arduino по данному принципу. Поделился ссылкой на материал. Но почему то есть трудности по реализации данного управления. Давайте наденем домашние тапочки и пойдем разбираться.
И так рассмотрим пример из предыдущего урока "Управление Arduino с помощью пульта ДУ (IR). Библиотека IRremote", когда мы получаем коды с кнопок.
#include
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
// In case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
Serial.println("Enabling IRin");
irrecv.enableIRIn(); // Start the receiver
Serial.println("Enabled IRin");
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}
delay(100);
}
При нажатии кнопок пульта ДУ мы получаем вот такой результат.
FF18E7
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFA857
FF02FD
FF5AA5
FFFFFFFF
FFFFFFFF
FFFFFFFF
FF10EF
FF5AA5
Как видим у нас при длительном нажатии выводит вот такой код: «FFFFFFFF». Который не относиться ни к одной кнопки. Этот код выводиться с определенной периодичностью, когда кнопка нажата и мы ее не отпускаем. Отпустив кнопку мы увидим, что данный код больше не выводиться в сериал порт. Используя данный принцип можно написать код под наши нужды. Вот пример условия который нам нужно добавить в код.
if (results.value == 0xFFFFFFFF) // кнопка зажата
{
flag = flag; // собновляем состояние светодиода
}
Сперва думал сильно не изменять код и сделать на основе урока 5. Но код получается громоздкий и не читабельный. Немного все сократил и получился небольшой код. И более читабельный. Но при этом сложнее для понимания.
//FF10EF — стрелочка вправо
//FF5AA5 — стрелочка влево
#include "IRremote.h"
IRrecv irrecv(11); // указываем вывод, к которому подключен приемник
decode_results results;
int flag = 0; // состояние светодиода 0-выкл. 1- вкл.
long prestroMillis = 0; // для отчета времени первоночальное значение
void setup() {
irrecv.enableIRIn(); // запускаем прием
}
void loop() {
unsigned long curstroMillis = millis(); // устанавливаем время в сейчас
if ((curstroMillis - prestroMillis) > 200) // проверяем интервал
{
if (irrecv.decode(&results)) { // если получаем данные с пульта ДУ
if (results.value == 0xFF10EF)
flag = 1; // вкл. светодиод
if (results.value == 0xFFFFFFFF) // кнопка зажата
{
flag = flag; // собновляем состояние светодиода
}
irrecv.resume(); // принимаем следующую команду
}
prestroMillis = curstroMillis; // обнуляем счетчик для нового цикла
}
else // данные не поступают с пульта ДУ
flag = 0; // выключаем светодиод
digitalWrite( 13, flag );
}
Возникли вопросы. Пишите в комментарии.
Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.
Спасибо за внимание!
Понравилась статья? Поделитесь ею с друзьями:
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.