#javascript #loops #websocket #raspberry-pi
#javascript #циклы #websocket #raspberry-pi
Вопрос:
Итак, мой вариант использования заключается в том, что я хочу управлять шаговым двигателем через Raspberry Pi. Этот элемент управления должен работать через веб-сокет с Socket.io и также пока работает довольно хорошо.
Теперь я хочу запустить свой двигатель с помощью одного вызова веб-сокета, а также остановить его одним-единственным вызовом.
Мой код на данный момент таков:
var looping;
socket.on('start looping', function() {
console.log("Start looping");
var pin = 40;
rpio.open(pin, rpio.OUTPUT, rpio.LOW);
looping = setInterval(function(){
for(var i = 1; i < 100; i ){
rpio.write(pin, rpio.HIGH);
rpio.sleep(0.001);
rpio.write(pin, rpio.LOW);
}
},1);
});
socket.on('stop looping', function() {
console.log("Stop looping");
clearInterval(looping);
});
Как вы видите, я использую setInterval
с интервалом в 1 мс, и внутри моего цикла я включаю и выключаю свой вывод с интервалом в 0,001 секунды.
Эти два интервала действительно беспокоят меня, и я хотел бы использовать один интервал, чтобы я мог более точно управлять своим двигателем.
Возможно, я делаю это неправильно. Не могли бы вы, пожалуйста, дать мне какую-нибудь помощь или совет, как я могу решить это более элегантно?
Заранее спасибо!
РЕДАКТИРОВАТЬ: Хорошо… Я немного переформатирую свой вопрос: прежде чем я попытался выполнить свой запуск и остановку следующим образом:
var running = true
socket.on('start looping', function() {
console.log("Start looping");
var pin = 40;
rpio.open(pin, rpio.OUTPUT, rpio.LOW);
while(running){
rpio.write(pin, rpio.HIGH);
rpio.sleep(0.001);
rpio.write(pin, rpio.LOW);
}
socket.on('stop looping', function() {
console.log("Stop looping");
running = false
});
Но поскольку while
цикл препятствовал обработке другого вызова сокета, мне пришлось использовать setInterval
. Возможно, это поможет немного лучше понять мой вариант использования и проблему.
Комментарии:
1. Обратите внимание, что setInterval не собирается ждать асинхронного кода внутри него. Также он имеет минимальную задержку в зависимости от среды. Например, в браузерах я думаю, что это около 4 мс, независимо от того, передается ли ему меньшее значение, или нет значения, или ноль
2. @charlietfl таким образом, вы говорите, что мой
setInterval
выполняется каждые 1 мс, независимо от того, сколько времени требуется для завершения моего цикла for внутри? Это делает мой подход еще хуже в том смысле, что у меня нет точного контроля над моим сигналом в гц, и я ищу лучший способ решить эту проблему.