Javascript,运行0.5秒后停止(循环)

时间:2017-09-14 11:24:59

标签: javascript node.js

我正在运行安装了raspberry pi gpio模块的节点服务器。我试图让我的ESC启动并运行0.5秒,然后我需要它停止0.5秒,然后再循环开始。但是如果"开始" = 0(按钮关闭)我需要完全停止循环并将伺服脉冲宽度设置为1000(电机停止)

这是我的代码,它有点有效。但是没有停止

var start = new blynk.VirtualPin(4);
start.on('write', function t(start) {
  if (start == 1) {
    setInterval(function() {
      setInterval(function() {
        motor.servoWrite(1920);
      }, 500);
      setInterval(function() {
        motor.servoWrite(1000);
      }, 1000);
    }, 500);
  } else {
    motor.servoWrite(1000);
  }
  motor.servoWrite(1000);
});

有人能告诉我哪里出错了吗?

3 个答案:

答案 0 :(得分:1)

将您的间隔存储在变量

var myInterval = setInterval(function() { [... your code code] },delay);

然后通过

来阻止它
clearInterval(myInterval);

答案 1 :(得分:0)

import json
import time
import threading
from twisted.internet import reactor, threads
from twisted.protocols.basic import LineReceiver
from twisted.internet import protocol

MaximumMsgSize = 15500

trySend = True
connectionToServer = None

class ClientInterfaceFactory(protocol.Factory):

    def buildProtocol(self, addr):
        return WoosterInterfaceProtocol(self._msgProcessor, self._logger)

class ClientInterfaceProtocol(LineReceiver):

    def connectionMade(self):
        connectionToServer = self

    def _DecodeMessage(self, rawMsg):
        header, body = json.loads(rawMsg)   
        return (header, json.loads(body))

    def ProcessIncomingMsg(self, rawMsg, connObject):
        # Decode raw message.
        decodedMsg = self._DecodeMessage(rawMsg)

        self.ProccessTransmitJobToNode(decodedMsg, connObject)

    def _BuildMessage(self, id, msgBody = {}):
        msgs = []

        fullMsgBody = json.dumps(msgBody)
        msgBodyLength = len(fullMsgBody)

        totalParts = 1 if msgBodyLength <= MaximumMsgSize else \
            int(math.ceil(msgBodyLength / MaximumMsgSize))

        startPoint = 0
        msgBodyPos = 0

        for partNo in range(totalParts):
            msgBodyPos = (partNo + 1) * MaximumMsgSize

            header = {'ID' : id, 'MsgParts' : totalParts,
                'MsgPart' : partNo }
            msg = (header, fullMsgBody[startPoint:msgBodyPos])
            jsonMsg = json.dumps(msg)       

            msgs.append(jsonMsg)
            startPoint = msgBodyPos

        return (msgs, '')

    def ProccessTransmitJobToNode(self, msg, connection):
        rootDir = '../documentation/configs/Wooster'

        exportedFiles = ['consoleLog.txt', 'blob.dat']
        params = {
            'Status' : 'buildStatus',
            'TaskID' : 'taskID',
            'Name' : 'taskName',
            'Exports' : len(exportedFiles),
            }
        msg, statusStr = self._BuildMessage(101, params)
        connection.sendLine(msg[0])

        for filename in exportedFiles:
            with open (filename, "rb") as exportFileHandle:
                data = exportFileHandle.read().encode('base64')

            params = {
                ExportFileToMaster_Tag.TaskID : taskID,
                ExportFileToMaster_Tag.FileContents : data,
                ExportFileToMaster_Tag.Filename : filename
            }
            msgs, _ = self._BuildMessage(MsgID.ExportFileToMaster, params)          
            for m in msgs: 
                connection.sendLine(m)

    def lineReceived(self, data):
        threads.deferToThread(self.ProcessIncomingMsg, data, self)


def ConnectFailed(reason):
    print 'Connection failed..'
    reactor.callLater(20, reactor.callFromThread, ConnectToServer)

def ConnectToServer():
    print 'Connecting...'
    from twisted.internet.endpoints import TCP4ClientEndpoint
    endpoint = TCP4ClientEndpoint(reactor, 'localhost', 8181)

    deferItem = endpoint.connect(factory)
    deferItem.addErrback(ConnectFailed)

netThread = threading.Thread(target=reactor.run, kwargs={"installSignalHandlers": False})
netThread.start()

reactor.callFromThread(ConnectToServer)

factory = ClientInterfaceFactory()
protocol = ClientInterfaceProtocol()

while 1:
    time.sleep(0.01)

    if connectionToServer == None: continue

    if trySend == True:
        protocol.ProccessTransmitJobToNode(None, None)
        trySend = False

答案 2 :(得分:0)

我认为使用setInterval可能是错误的。 setInterval重复出现。你真的只想运行一次,等待,然后运行其他东西。尝试使用setTimeout,等待x ms然后执行某些操作。

var id = null;
start.on('write', function t(start) {
    if(start == 1){
        pulse();
    }
    else {
        clearTimeout(id);
        motor.servoWrite(1000);
    }   
});

function pulse() {
    servoOn();
    id = setTimeout(function(){
        servoOff();
        id = setTimeout(function(){
            pulse();
        }, 1000);
    }, 500);
}

function servoOn(){
    motor.servoWrite(1920); 
}

function servoOff(){
    motor.servoWrite(1000);
}
相关问题