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

时间:2019-01-02 22:07:10

标签: python-3.x arduino pyserial

我正在Windows 10 64位上使用Arduino Mega和python 3.7。我正在尝试使用python和pyserial使灯泡闪烁。我希望灯泡保持打开状态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();
  }
}

现在,如果我向程序中发送任何正数,则它会完全关闭(当我发送一个用于打开延迟的数字时)或完全打开灯(当我发送一个用于关闭延迟的数字时) 。我的猜测是,每当Serial.parseInt();函数获得错误的输入类型时,它都会将其解释为零。

1 个答案:

答案 0 :(得分:0)

documentation说:

  

如果发生超时(请参见Serial.setTimeout())>时未读取有效数字,则返回0;

似乎parseInt失败,因此将延迟设置为0,这就是为什么光完全打开或关闭的原因。

另一种可能是,arduino仅接收第一个字符,这意味着灯光切换得太快了,您看不到它。 (问题描述为here

尝试打印出arduino获得的价值。它应该告诉您正在发生的事情以及解决该问题的方向。