Здравствуйте. Поскольку нахожусь в самом начале изучения программирования, прошу помощи. Пытаюсь запрограммировать Искру для выполнения следующей программы: При отжатой кнопке 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);
функция setInterval() начинает работать сразу же при включении питания, поэтому ШИМ всегда меняется даже без нажатия на кнопку. Добавьте внутрь этой функции проверку положения кнопки: если кнопка нажата, функция должна выполняться, если не нажата - выполняйте A3.write(0); (отключение ШИМ) Надеюсь, я правильно понял вашу задачу)
у меня вот так получилось Код (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);
Не совсем. При первом нажатии кнопки - функция ШИМ должна выполняться, при повторном нажатии - отключаться. Добавляю внутрь функции 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); Результат прежний.
в одном и том же месте отключение ШИМ и включение. Нужно выбрать что-то одно) Код (Javascript): A3.write(0); analogWrite(A3, i/100, {freq: 500});
Можно в этом месте подробнее, что такое {freq: 500} в третьем параметре? Настройка частоты ШИМ? Что то не вижу этого в описании функции.
мне тоже интересно как это работает, потому что в файле wiring_analog.c для функции analogWrite определены всего два входящих параметра: