РЕШЕНО Задание 18, ИК-выключатель света

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем blackbars1408, 6 янв 2017.

  1. blackbars1408

    blackbars1408 Нерд

    Может я просто где-то недогоняю, но у меня вопрос: как сделать это задание?
    Пока вот что получилось:
    Код (Javascript):

    var ir = require('@amperka/ir-receiver')
      .connect(P7);

    var light = require('@amperka/led')
      .connect(P1);

    var powerCode = 0xffa857;
    var unpowerCode = 0xff807f;

    ir.on('receive', function(code, repeat) {
      if (repeat) {
        return;
      }
     
      if (code === powerCode) {
        light.turnOn();
      }
     
      if (code === unpowerCode) {
        light.turnOff();
      }
    });
     
  2. Jedi

    Jedi Гик

    Код рабочий. Используйте другой пульт. Хотя бы из комплекта Йодо.
     
  3. Добрый день!

    Попробуйте подключить ИК-приёмник к пину P8-P13.
     
  4. NICK48

    NICK48 Нуб

    blackbars1408 Воспользовался твоим кодом , добавил его в "театральное освещение" все работает отлично !!!



    var ir = require('@amperka/ir-receiver')
    .connect(P7);

    var light = require('@amperka/led')
    .connect(P1);

    var powerCode = 0x1689d02f;
    var unpowerCode = 0x1689d827;
    var light = require('@amperka/led')
    .connect(P1)
    .turnOn()
    .brightness(0);
    var button = require('@amperka/button')
    .connect(P3);
    var anim = require('@amperka/animation')
    .create()
    .reverse();

    anim.on('update', function(val) {
    light.brightness(val);
    });
    button.on('press', function() {
    anim.reverse().play();
    });

    ir.on('receive', function(code, repeat) {
    if (repeat) {
    anim.reverse().play() ;
    }

    if (code === powerCode) {
    light.turnOn();
    }

    if (code === unpowerCode) {
    light.turnOff();
    }
    });
     
  5. Error407

    Error407 Нуб

    Доброго времени суток!
    Столкнулся с проблемой в этом же задании.
    Не понимаю как сделать так, чтобы при первом включении нажатие одной кнопки определялось на включение, а второй на выключение автоматически.
    Пытался задать условие, что код включения не равен коду выключения, но оно вообще не работает. Думаю, что можно как-то задать приоритет выполнения функций, чтобы сначала прописывалась одна, на включение, а потом уже вторая на выключение, но пока не хватает знаний.

    Код (Javascript):
    var ir = require('@amperka/ir-receiver')
      .connect(P7);

    var light = require('@amperka/led')
      .connect(P1);

    var powerCodeOn = null;
    var powerCodeOff = null;
    powerCodeOn = !powerCodeOff;

    ir.on('receive', function(code,repeat) {
      if(repeat) {
        return;
      }
     
      if(powerCodeOn === null) {
        powerCodeOn = code;
      }
     
      if(code === powerCodeOn) {
        light.turnOn();
      }
    });


    ir.on('receive', function(code,repeat) {
      if(repeat) {
        return;
      }
     
      if(powerCodeOff === null) {
        powerCodeOff = code;
      }
     
      if(code === powerCodeOff) {
        light.turnOff();
      }
    });
     

    Если ошибка именно в коде, то прошу подсказать в чем проблема.
    Если нужно учить "мат. часть", то уже пошёл...
     
  6. sys

    sys Злобный Буратино Модератор

    Вы два раза используете отслеживание событий ir.on('receive'...), что есть не правильно. Если Вам вообще все равно какой одной кнопкой включать лишь бы потом выключалось только той же, что и включалось, то:
    Код (Javascript):
    var ir = require('@amperka/ir-receiver')
      .connect(P7);

    var light = require('@amperka/led')
      .connect(P1);

    var powerTrig = false;
    var powerCode;
    ir.on('receive', function(code,repeat) {
      if(repeat) {
        return;
      }
      if(!powerTrig) {  //проверка на включение, false - выключен, true - включен
        // попадаем сюда, если  powerTrig = false

        light.turnOn();
        powerCode = code;
        powerTrig = !powerTrig;           // powerTrig = !false = true

      }else if(code === powerCode) {
         // попадаем сюда, если powerTrig = true и код соответствует коду включения

         light.turnOff();
         powerTrig = !powerTrig;

      }
    });
     
    Последнее редактирование: 3 окт 2017
  7. Error407

    Error407 Нуб

    Спасибо за ваш ответ, но дело в том, что я хочу получить следующий результат: жму произвольную кнопку, ее код забивается в память и свет включается. Жму другую произвольную кнопку, ее код также забивается в память и свет выключается. Теперь до перезагрузки системы первая кнопка будет включать, а вторая выключать.

    Из-за этого и было второе отслеживание события ir.on(), пытался отследить вторую произвольную кнопку. Ну, и бардак получился, конечно же)
     
  8. sys

    sys Злобный Буратино Модератор

    о как... ну тогда
    Код (Javascript):
    var ir = require('@amperka/ir-receiver')
      .connect(P7);

    var light = require('@amperka/led')
      .connect(P1);

    var powerTrig = false,
    powerCodeOn = '',
    powerCodeOff = '';

    ir.on('receive', function(code,repeat) {
      if(repeat) {
        return;
      }
      if(!powerTrig) {

          if(powerCodeOn === '') {
             powerCodeOn = code;
             light.turnOn();
             powerTrig = !powerTrig;
          }else if(code === powerCodeOn){
             light.turnOn();
             powerTrig = !powerTrig;  
          }

      }else{

          if(powerCodeOff === '') {
             powerCodeOff = code;
             light.turnOff();
             powerTrig = !powerTrig;
          }else if(code === powerCodeOff){
             light.turnOff();
             powerTrig = !powerTrig;
          }

      }
    });
    как-то так...
     
    Последнее редактирование: 3 окт 2017
    Error407 нравится это.
  9. Error407

    Error407 Нуб

    Отлично, спасибо - все работает!
    Только у меня вопрос по логике кода. Как я понимаю, переменную
    var powerTrig = false мы ввели, чтобы разделить воспринимаемые сигналы на две ветки: кнопка .turnOn() и кнопка .turnOff(), но не могу понять для чего в конце каждого условия ставили
    powerTrig = !powerTrig?
     
  10. sys

    sys Злобный Буратино Модератор

    На здоровье!
    Триггер powerTrig нужен, чтобы не отслеживать сигнал включения при включенном состоянии и наоборот - не отслеживать выключение при выключенном состоянии. Это дает возможность назначать для включения и выключения одну и ту же кнопку.
    А powerTrig = !powerTrig переключает состояния. Можно было бы использовать вместо этого напрямую powerTrig = true и powerTrig = false, но я привык отрицаниями/перевёртышами.
    Код (Javascript):

    состояние = выкл
    если(состояние === выкл){
       ...
       вкл
       состояние = вкл       // !выкл  (не выкл)
    } иначе {
       ...
       выкл
       состояние = выкл    // !вкл  (не вкл)
    }
    Можно и по-другому обыграть алгоритм с условиями, но имхо так логичней и организованней...
     
    Error407 нравится это.
  11. Error407

    Error407 Нуб

    Смысл я понял. Попробую теперь усвоить на практике.
    Еще раз спасибо!
     
  12. Vizzerdrix

    Vizzerdrix Нуб

    Очень элегантное решение!
     
  13. Besylka

    Besylka Нуб


    В условия f(powerCodeOff === '') разве не требуется добавить && code !== powerCodeOn для того чтобы это обязательно была другая кнопка?
     
  14. sys

    sys Злобный Буратино Модератор

    Код позволяет использовать одну и туже кнопку на вкл/вкл. Прочитайте следующие посты, там даются некоторые разъяснения по коду.