Как подружить кнопку и ШИМ

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Sergei K, 4 июл 2016.

  1. Sergei K

    Sergei K Нерд

    Здравствуйте.
    Поскольку нахожусь в самом начале изучения программирования, прошу помощи.
    Пытаюсь запрограммировать Искру для выполнения следующей программы:
    При отжатой кнопке BTN1 ШИМ не генерируется. При нажатии ШИМ сигнал с пина А3 плавно нарастает, а потом убывает. При повторном нажатии должен отключаться. У меня же получается так: ШИМ всегда нарастает и убывает, а кнопку включения (например штатную BTN1) запрограммировать для целей включения - выключения не удается, только ШИМ начинает с самого начала нарастать при нажатии кнопки. На Еспруино прочитал, что для этой цели подходит функция setWatch, и для светодиода работает как надо. Подскажите, пожалуйста, где ошибка в написании программы:
    Скетч:
    var i=0;
    //var button = require('@amperka/button').connect(BTN1);
    //var pwm =A3;
    var fadeAmount=2;
    var next_state=0;
    function swap () {
    A3.write(next_state);
    next_state=!next_state;
    }
    function swap_on_down () {
    if (digitalRead(BTN1)==1) swap();
    }
    setWatch(swap_on_down, BTN1, {repeat : true, debounce : 50});

    setInterval( function() {
    analogWrite(A3, i/100, {freq: 500});
    i = i + fadeAmount;
    if (i===0 || i === 100) {
    fadeAmount = - fadeAmount;
    }
    }, 250);
     
  2. Morgan

    Morgan Гик

    функция setInterval() начинает работать сразу же при включении питания, поэтому ШИМ всегда меняется даже без нажатия на кнопку. Добавьте внутрь этой функции проверку положения кнопки: если кнопка нажата, функция должна выполняться, если не нажата - выполняйте A3.write(0); (отключение ШИМ)

    Надеюсь, я правильно понял вашу задачу)
     
  3. Morgan

    Morgan Гик

    у меня вот так получилось
    Код (Javascript):
    var myButton = require('@amperka/button').connect(BTN1);

    var i = 0;
    var fadeAmount = 2;
    // флаг выполнения ШИМ
    var doPWM = false;

    myButton.on('press', function() {
      doPWM = !doPWM;
    });

    setInterval( function() {
      if (doPWM) { // если надо выполнять ШИМ
        analogWrite(A3, i/100, {freq: 500});
        i += fadeAmount;
        if (i <= 0 || i >= 100) {
          fadeAmount = -fadeAmount;
        }
      } else { // если не надо выполнять ШИМ
        A3.write(0);
      }
    }, 250);
     
    Sergei K нравится это.
  4. Sergei K

    Sergei K Нерд

    Не совсем. При первом нажатии кнопки - функция ШИМ должна выполняться, при повторном нажатии - отключаться. Добавляю внутрь функции setInterval условие
    setInterval( function() {
    if (digitalRead(BTN1)===0)
    A3.write(0);
    analogWrite(A3, i/100, {freq: 500});
    i = i + fadeAmount;
    if (i===0 || i === 100) {
    fadeAmount = - fadeAmount;
    }
    }, 250);
    Результат прежний.
     
  5. Morgan

    Morgan Гик

    в одном и том же месте отключение ШИМ и включение. Нужно выбрать что-то одно)
    Код (Javascript):
    A3.write(0);
    analogWrite(A3, i/100, {freq: 500});
     
  6. Sergei K

    Sergei K Нерд

    Спасибо. Так работает.
     
    Morgan нравится это.
  7. ostrov

    ostrov Гуру

    Можно в этом месте подробнее, что такое {freq: 500} в третьем параметре? Настройка частоты ШИМ? Что то не вижу этого в описании функции.
     
  8. ИгорьК

    ИгорьК Гуру

    Частота ШИМ. freq - pulse frequency in Hz,
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    мне тоже интересно как это работает, потому что в файле wiring_analog.c для функции analogWrite определены всего два входящих параметра:
     
  10. ostrov

    ostrov Гуру

    Блин, сдается мне что это не Arduino IDE. )
     
    acos нравится это.
  11. sys

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

  12. ostrov

    ostrov Гуру