Форум программистов, компьютерный форум, киберфорум
Наши страницы

Arduino

Войти
Регистрация
Восстановить пароль
 
komalov
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 6
#1

Удержание светодиода при приеме кода залипания с ИК приемника - Arduino

07.12.2014, 15:31. Просмотров 1252. Ответов 6
Метки нет (Все метки)

Здравствуйте . Я подключил IR приёмник к ардуино и всё было хорошо,пока я не захотел сделать программу в которой если кнопка на пульте зажата то светодиод горит,когда она не зажата он гаснет.Ведь пуль при передачи сигнала если кнопка зажата сначала один раз передаёт код кнопки а потом стандартный код о её залипании.Помогите пожалуйста реализовать такую программу.
0
Миниатюры
Удержание светодиода при приеме кода залипания с ИК приемника  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2014, 15:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удержание светодиода при приеме кода залипания с ИК приемника (Arduino):

Ошибка при приеме данных через COM (Arduino-Xbee-PC) - Arduino
Добрый день! Передаю данные с ардуины (Mega2560) через Xbee (EndDevice) на компьютер. К компу подключен второй Xbee (Coordinator). Каждый...

Назначение элементов в схеме приемника кода - Микроконтроллеры
есть схема программы с семисегментыми индикаторами!!.необходимо назначение каждого элемента, а именно:резисторы, конденсаторы т.д.!...

Виснет USART при приеме - Микроконтроллеры
Добрый вечер всем. Подскажите как решить проблему с USART. Проверяю через proteus и его терминал следующий код: Вот это подключаемый...

Задание при приеме на работу - PHP
Здравствуйте, уважаемые форумчане! При устройстве на работу получила перечень заданий, с большинством из которых уже справилась. Осталось...

Удержание фокуса на TextBox при клике на другие элементы управления - C#
Как сделать так, что бы не снимался фокус с текстбокса, когда нажимаешь на кнопку?

SerialPort(COM) Разрыв пакета при приеме - C#
Вся соль в приеме данных... Настроил виртуальный порты - гоняю данные все работает идеально, пробую связать 2 машины - приходит не всЕ...

6
raxp
10180 / 6563 / 481
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
08.12.2014, 00:32 #2
...пульт пульту - рознь. Есть те, что передают постоянно один код при нажатии и удержании.

Если ваш сферический пульт при удержании передает другую посылку, то отлавливайте ее после приема нужного кода нажатия клавиши. К примеру, пришел код нажатия "1", устанавливаем логический флаг в единицу, далее приходит код удержания, если флаг единичный - проверяем наличие кода залипания в цикле через millis(), если по прошествии заданного интервала код залипания все еще идет - держим пин на светодиод в HIGH, если нет - гасим в LOW. Профит.
0
komalov
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 6
08.12.2014, 14:01  [ТС] #3
raxp,

Подкорректируйте пожалуйста мой код .Вот всё что я смог придумать :

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <IRremote.h>
 
int RECV_PIN = 3;//Контакт IR приёмника
int motor = 5;
unsigned long n; // переменная запоминающая предыдущий сигнал с пульта
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  pinMode(motor, OUTPUT);
  irrecv.enableIRIn(); // Включаем ресивер
 
}
void loop()
{
  if (irrecv.decode(&results))
  { if (results.value != 4294967295)//1641415931 - сигнал кнопки;4294967295-сигнал о залипании кнопки;
    { n = results.value;  if (results.value == 1641415931)
      {
        digitalWrite(motor, HIGH);
      }
      else {
        digitalWrite(motor, LOW);
      }
    }
    else {
      if (n == 1641415931) {
        digitalWrite(motor, HIGH);
      }
    }
 
    delay(50);
    irrecv.resume();
    delay(50);
  }
  else {
    digitalWrite(motor, LOW);  //Если сигнала небыло выключаю мотор;
  }
 
}
0
raxp
10180 / 6563 / 481
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
08.12.2014, 19:32 #4
И в теги за вас обернуть и в баньку сводить. Перечитайте шаги, которые вам рекомендовал, вы их не только перепутали, но и проигнорировали некоторые.
0
komalov
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 6
08.12.2014, 22:56  [ТС] #5
raxp, Просто тот код который я показал я написал раньше,и я е понял как через millis() реализовать проверку.Ведь сигнал с пульта идёт не постоянно а через короткий промежуток времени,поэтому при выполнении моего кода светодиод очень быстро мигает.
0
raxp
10180 / 6563 / 481
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
09.12.2014, 07:46 #6
Накапливайте за заданное время несколько посылок, если подряд одна и та же - считаем что данное состояние имеет место и только после этого выполняем действие. Как пользоваться millis есть на офсайте дуины.
0
komalov
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 6
09.12.2014, 21:03  [ТС] #7
raxp,
Я не понял как сделать это через millis(),поэтому я вычислил задержку между сигналами с помощью той же самой millis() и просто поставил её в своей программе.Работает идеально.Тут я контролирую уже два светодиода:
Код
#include <IRremote.h>

int RECV_PIN = 3;//Контакт IR приёмника
int L1 = 5;
int L2 = 4;
unsigned long n; // переменная запоминающая предыдущий сигнал с пульта
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  pinMode(L1, OUTPUT);
  pinMode(L2, OUTPUT);
  irrecv.enableIRIn(); // Включаем ресивер

}
void loop()
{
  if (irrecv.decode(&results))
  { if (results.value != 4294967295)//1641415931 - сигнал кнопки 1; 1641448571-сигнал кнопки 2;4294967295-сигнал о залипании кнопки;
    { n = results.value;
      switch (results.value) {
        case 1641415931 :
          digitalWrite(L1, HIGH);
          digitalWrite(L2, LOW);
          break;
        case 1641448571:
          digitalWrite(L1, LOW);
          digitalWrite(L2, HIGH);
          break;
        default:
          digitalWrite(L1, LOW);
          digitalWrite(L2, LOW);
      }

    }
    else {//если сигнал был 4294967295
      switch (n) {
        case 1641415931 :
          digitalWrite(L1, HIGH);
          digitalWrite(L2, LOW);
          break;
        case 1641448571:
          digitalWrite(L1, LOW);
          digitalWrite(L2, HIGH);
          break;
        default:
          digitalWrite(L1, LOW);
          digitalWrite(L2, LOW);
      }
    }


    irrecv.resume();
    delay(108);
  }

  else {
    digitalWrite(L1, LOW);
    digitalWrite(L2, LOW);  //Если сигнала небыло выключаю светодиод;
  }

}
0
09.12.2014, 21:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2014, 21:03
Привет! Вот еще темы с ответами:

Тестовое задание при приеме на работу - Программирование
Друг искал работу. В одной из контор предложили тестовое задание: ----- Разработать на VC векторный графический редактор, с...

Траблы с MSCOMM при приеме SMS - Visual Basic
Приветствую форумчан. Кто нибудь занимался приемом SMS с трубы подключенной через DATA-кабель к компу? Пробовал использовать...

Каверзные вопросы при приеме на работу - C#
В общем я думаю каждого, кто устраивался на работу на должность middle+ на собеседовании задают каверзные и порой очень интересные вопросы....

Отключение залипания клавиш при нажатии более 5 клавиш - Windows 7
Всем привет, у меня глупый вопрос. Как сделать, чтобы можно было зажимать хотябы 8 клавиш одновременно с адекватным считыванием с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru