помагите! как сделать комбинацию кнопок на Ик-пульте?

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем maxS2004, 5 янв 2018.

  1. maxS2004

    maxS2004 Нерд

    помагите! как сделать комбинацию кнопок на Ик-пульте?
     
  2. DIYMan

    DIYMan Гуру

    Пальцами, очевидно - зажимаете две или три кнопки одновременно, получаете зажатую комбинацию кнопок. Вы этого хотели?
     
  3. maxS2004

    maxS2004 Нерд

    Я хочу сделать типа пароля на ик пульте.что бы при последовательности нажатий загорался светодиод.
     
  4. DIYMan

    DIYMan Гуру

    Так делайте, в чём проблема? К библиотеке IRremote есть примеры - смотрите, изучайте, дописывайте под ваши нужды.
     
  5. maxS2004

    maxS2004 Нерд

    iremote -это на Arduino.А я хочу на iskra js
     
  6. DIYMan

    DIYMan Гуру

    Ок, к Iskre JS разве нет примеров работы c ИК-сенсором? http://wiki.amperka.ru/робототехника:ir-servo-robot

    Что мешает взять код, и на его основе сделать?
     
    sys нравится это.
  7. sys

    sys Оракул

    создайте массив с элементами правильной комбинации, затем по нажатии сравнивайте нажатия поэлементно, не забывая про счетчики и сбросы...
     
  8. maxS2004

    maxS2004 Нерд

    А можно код ?
     
  9. sys

    sys Оракул

    А Вам палец в рот не клади... :)
     
  10. maxS2004

    maxS2004 Нерд

    пожалуйста я не бум бум
     
  11. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    добрый вечер йа только начинающий в этом деле но для Дуни сделал бы таг
    Код (C++):

    //создал бы массив с нужной комбинацией нажатия. нажатия последовательные, одновременные не получались на моем пульте
    int CODE[] = {3,0,9,7
    };
    int ENTERED_combination[4] ; // массив куда будут попадать ввденные данные
     
    //затем создал бы цикл где все проверялось бы
    Код (C++):
    while (OPENING_waiting ==1)
    {

    if (irrecv.decode(&results)) // если что то пришло на приемниг

    { Input_signal();
    ENTERED_combination[i] =(полученные данные) ;
    translateIR(); // функция для перевода НЕХ в "нормальные" значения, но можно и в НЕХ оставить
    i++; // прибавляем 1 что бы записать следующее значение в след ячейку
    irrecv.resume();

    delay(100);
    } /

    if (i==4 ) //если набрали 4 сигнала, или сколько там будет нужно
    {
    int a =0;

    //то проверяем совпадают ли данные в масивах . можно было и чрез for но лень было писать

    if ( CODE[0] == ENTERED_combination[0] && CODE[1] == ENTERED_combination[1] && CODE[2] == ENTERED_combination[2] && CODE[3] == ENTERED_combination[3])
    {
    Serial.println("ZASHIBIS"); //если данные в каждой ячейке совпали то делаем что либо и обнуляем все данные в массиве куда попадают принятые данные
    i=0;
    ENTERED_combination[0] = 0;
    ENTERED_combination[1] = 0;
    ENTERED_combination[2] = 0;
    ENTERED_combination[3] = 0;
    //если данные не совпали то пишем ошибка обнуляем все принятые данные и начинаем сначала
    else if ( CODE[0] != ENTERED_combination[0] || CODE[1] != ENTERED_combination[1] || CODE[2] != ENTERED_combination[2] || CODE[3] != ENTERED_combination[3])

    Serial.println("ERROR");
    i=0; //обнуляем идентификатор ячейки массива

    ENTERED_combination[0] = 0;
    ENTERED_combination[1] = 0;
    ENTERED_combination[2] = 0;
    ENTERED_combination[3] =0;
    Кот чисто теоретический не компилировлся. написан только для примера
     
    Последнее редактирование: 7 янв 2018
  12. YuraNedrug

    YuraNedrug Нерд

    Ну давайте вместе подумаем. У меня что-то получилось, да не то.
    Код (Javascript):
    var receiver = require('@amperka/ir-receiver')
      .connect(P3);
    var projector = require('@amperka/led').connect(P2);
    var press = []; //массив, который заполняется при нажатии на кнопки пульта
    var pass = [378077439, 378126399]; //последовательность кнопок, при которой должна загораться лампочка
    receiver.on('receive', function(code) {
      press.push (code);{ //заполнение массива press
        if (press.length > 2) {
          press.shift(); //проверка длинны массива press и удаление кода кнопки с конца, если кодов в массиве больше 2
          for (var i = 0; i < press.length; i++) {
            if (press [i] == pass [i]) {
              projector.turnOn(); //сравнение двух массивов и зажигание лампочки
            }
          }
        }
      }
    });
    Тут я как-то не правильно сравниваю массивы. Потому как лампочка загорается при условии, что в массиве press имеется два кода и один из них из массива pass. А нужно, чтобы совпадали два и в нужной последовательности. Какие идеи?
     
  13. YuraNedrug

    YuraNedrug Нерд

    В общем, в ходе ковыряния сделал следующие выводы, возможно ошибочные.
    1. Обнулять массив с нажатиями кнопок не обязательно. Я сделал так, что массив всегда хранит конкретное число значений, а все, что больше, удаляется с конца.
    2. Проверку равенства двух массивов лучше вынести в отдельную функцию, где присваивать флаги false и true.
    3. Надо что-то делать с залипанием кнопок. Чуть задержал палец на нажатой кнопке, в массив сразу прилетает два, а то и три одинаковых кода. Для этого в библиотеке для ИК приемника есть обработчик repeat, но мне уже было лень разбираться.
    В целом получилось у меня вот так, вроде работает
    Код (Javascript):
    var receiver = require('@amperka/ir-receiver')
      .connect(P3);
    var projector = require('@amperka/led').connect(P2);
    var press = [];
    var pass = [378077439, 378126399, 378110079];
    function check(a, b) {
      var i = a.length;
      if (i != b.length) return false;
      while (i--) {
        if (a[i] !== b[i]) return false;
      }
      return true;
    }
    receiver.on('receive', function(code) {
      press.push (code);
        if (press.length > 3) {
          press.shift();
          if (check (press, pass) === true) {
            projector.toggle();
          }
        }
    });
    Любые замечания, предложения и критика приветствуются.
     
  14. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    знаком только со своим пкитайским приемником. там проще если долго держишь нажатой кнопку или нажал несколько кнопок то приходит F#0000. всегда одно и тоже и это значение легко игнорируется в коде.
    едиственно предположение, сделать для определенной комбинации свой массив
    типа
    Код (C++):

    var pass_1[9] = {3,7,8,0,7,7,4,3,9}
    var pass_2[9] = {4,3,6,4,5,7,5,6,7}
    var pass_3[9] = {3,4,5,3,4,3,4,6,7}
    и потом делать сравнение и проверку по заполнению массива
    а после уже какое либо действие и последующий сброс. так проще по крайней мере для меня.
    рад был бы помочь но сам в процессе изучения С++, тут совет гуру нужен)
    я с залипанием боролся тупо delay(100), как только что то пришло и расшифровалось на приемнике. может и вам сделать какую нибудь задержку?
     
    YuraNedrug нравится это.
  15. maxS2004

    maxS2004 Нерд

    Кто поможет.как подключить динамик на 8 ом к iskra js ?