当前位置: 首页 > 知识库问答 >
问题:

使用Python和Arduino通过串行改变灯泡延迟

籍利
2023-03-14

我在Windows 10 64位上使用Arduino Mega和python 3.7。我试图使用python和pySeries使灯泡闪烁。我希望灯泡保持亮x时间,并关闭y时间。我在python Tkinter程序中输入值:https://pastebin.com/zkRmcP60完整代码。在我输入值后,我通过此代码发送到Arduino:

import msgpack
import serial
arduionoData = serial.Serial('com3', 9600, timeout=1)
def sendlower(*args):

    try:
            global arduionoData
            arduionoData.write(b"1")
            while arduionoData.readline().decode() != "Send Next":
                pass
            first = int(firstdelay.get())
            arduionoData.write(msgpack.packb(first, use_bin_type=True))
    except ValueError:

        print("Only Positive Integers")

def senduppper(*args):
    try:

        global arduionoData
        arduionoData.write(b"2")
        while arduionoData.readline().decode() != "Send Next":
            pass
        second = int(seconddelay.get())
        arduionoData.write(msgpack.packb(second, use_bin_type=True))

    except ValueError:

        print("Only Positive Integers")

Tkinter程序执行上述功能访问Pastebin获取整个代码。

首先,我指定模式,或者它是否将是打开延迟或关闭延迟。使用此代码(忽略设置和其他代码,请在粘贴箱中查找。)

void readdelay(){
  mode = Serial.parseInt();
  if (mode == 1){
      delay(200);
      Serial.write("Send Next");
      delay1 = Serial.parseInt();
  }else if (mode == 2){
      delay(200);
      Serial.write("Send Next");
      delay2 = Serial.parseInt();  
  }
}
void loop() {
  if (Serial.available() > 0){
     readdelay();
  }
}

现在,如果我向程序中输入任何正数,它要么完全关闭(当我输入一个数字表示开启延迟时),要么打开(当我输入一个数字表示关闭延迟时)。我猜只要<代码>序列号。parseInt() 函数获取错误的输入类型,并将其解释为零。

共有1个答案

咸高谊
2023-03-14

留档说:

如果超时时未读取有效数字(请参阅Serial.setTimeout())

似乎parseInt失败了,因此延迟被设置为0,这就是为什么灯会完全打开或关闭。

另一种可能性是,arduino只接收第一个字符,这意味着灯光切换得太快,以至于你看不到它。(此处描述的问题)

尝试打印出arduino接收到的值。它应该告诉你正在发生什么,以及解决问题的方向。

 类似资料:
  • 我在Raspberry Pi(Python脚本)和Arduino nano/uno之间的串行通信方面遇到一些问题。我的两个设备都通过USB端口连接,当我直接从arduino IDE串行监视器发送命令时,arduino草图始终正确响应: 但是,当我运行python脚本,他发送相同的命令时,草图以随机方式响应。 覆盆子终端: Arduino串行监视器: Mi代码为: Arduino草图: Python

  • 我对通过python发送串行数据有问题。让我这样解释。我在arduino上有一个马达代码,它从串口接收数据,并在接收到的数据中移动。然而,在本例中,每当我发送8个列表中的数据时,它都不会读取第8个列表。通过玩弄时间。在python代码中睡眠我可以看到一些差异(我可以看到发送了4个列表,然后我将time.sleep增加到8,现在它发送了7个列表)我知道玩弄时间。但睡眠并不是解决办法。我还尝试清空输入

  • 我遇到了一个非常简单的问题。 我正在尝试制作一个Qt GUI应用程序,以从GUI控制我的Arduino(而不是从Arduino IDE的串行监视器控制它)。我能够使用QSerialPort Write()方法成功地向Arduino写入,但我无法从Arduino读取任何内容。从串行端口读取数据的唯一方法是在Qt代码的waitForBytesWrite()中的write()函数之后使用waitForR

  • 我正在尝试构建一个代码,以便在我的代码和我的Arduino Uno之间进行通信。我有一个温度传感器(tmp36)连接到COM3中的Arduino板,我想实时绘制温度值。我还有一个开始按钮,用来开始获取数据并将其绘制在图形中,还有一个停止按钮用来停止这样做。当我运行代码时,我收到一条消息:“无法将字符串转换为float:b'Anal'”,参考第19行:“data=np.append(data,flo

  • 我试图让Arduino在串口读取字符“s”时触发一个中继。该字符“s”由python根据从屏幕读取的图像发送。 我的问题是arduino似乎无法从串行端口读取数据,因为它从不执行if条件。我的猜测是这两者之间存在某种死锁(这就是为什么我将ardu.close()放在函数foo中) 这是我的arduino代码: 这是我的python代码:

  • 我想做的是从我用Arudino制作的转速表电路中读取连续的数据流,然后将其输入处理;我已经使用下面的代码成功完成了: 我不确定如何处理数据,以便每当检测到某个值时,处理中都会发生事件。 编辑:有人建议关闭,所以我的问题是调用是一个阻塞调用,这意味着中的指令指针将保持在。指针将调用和,但永远不会到达启动串行端口的线路 建议的解决方案是将这些行移动到的顶部,并将作为的最后一行。我尝试了这个(我下面的代