// настраиваем SPI для работы со светодиодной гирляндой SPI2.setup({baud:3200000, mosi:B15, sck:B13, miso:B14}); // подключаем ультразвуковой дальномер var sonic = require('@amperka/ultrasonic').connect({ trigPin: P8, echoPin: P9 }); // подключаем динамик var speaker = require('@amperka/buzzer').connect(P1).frequency(440); var numberLed = 20; var halfNumberLed = numberLed / 2; var ledStrip = require('@amperka/led-strip').connect(SPI2, numberLed, 'RBG'); // задаём минимальное и максимально расстояние индикации var distance = {max: 50, min: 10}; // задаём используемые цвета var r = new Array(1, 0, 0); // красный цвет var g = new Array(0, 0, 1); // зеленый цвет var y = new Array(1, 0, 1); // желтый цвет var colors = new Array(r, r, y, y, y, g, g, g, g, g); // устанавливаем шаг изменения гирлянды var step = (distance.max - distance.min) / halfNumberLed; // создаём функцию управления гирляндой var light = function(cm) { // если расстояние больше максимального - прекращаем индикацию if (cm > distance.max) { ledStrip.clear(); } else { // для двух половин гирлянды задаем цвета в зависимости от расстояния for (var i = numberLed - 1, j = 0; j < halfNumberLed; --i, ++j) { if (cm <= distance.min) { ledStrip.putColor(i, {red: 1, green: 0, blue: 0}); ledStrip.putColor(j, {red: 1, green: 0, blue: 0}); } else if(cm - distance.min < j * step) { ledStrip.putColor(i, colors[j]); ledStrip.putColor(j, colors[j]); } } // все изменения цвета в гирлянде необходимо применить ledStrip.apply(); } }; // функция управления звуковой индикацией var sound = function(cm) { // задаем новый интервал звучания в зависимости от расстояния if (cm <= distance.min) { speaker.turnOn(); } else if (cm > distance.max) { speaker.turnOff(); } else { // вычисляем период звучания сигнала в зависимости от текущего расстояния var period = Math.round((cm - distance.min) / step + 1) / 10; speaker.beep(period, period); } }; // запрашиваем расстояние в сантиметрах каждые 100 мс setInterval(function() { sonic.ping(function(err, value) { // если измерения не вызвали ошибку, управляем индикацией if (!err) { light(value); sound(value); } }, 'cm'); }, 100);