pyFirmata 的 write() 函数



我正在沿着书籍" python编程为arduino"(pratik desai撰写)(烦人的聪明人)。

我被困在锻炼中,学生正在学习实施一个滑块,该滑块会改变连接到PIN的LED强度。我标记了代码无法正常工作的位置。

代码是:

import tkinter
from pyfirmata import ArduinoMega
from time import sleep
port = '/dev/ttyACM0'
board = ArduinoMega(port)
sleep(5)
lenPin = board.get_pin('d:11:o')
top = tkinter.Tk()
top.title('Specify time using Entry')
top.minsize(300, 30)
timePeriodEntry = tkinter.Entry(top, bd=5, width=25)
brightnessScale = tkinter.Scale(top, from_=0, to=100, 
orient=tkinter.HORIZONTAL)
brightnessScale.grid(column=2, row=2)
tkinter.Label(top, text='Time (seconds)').grid(column=1, row=1)
tkinter.Label(top, text='Brightness (%)').grid(column=1, row=2)
def onStartPress():
    time_period = timePeriodEntry.get()
    time_period = float(time_period)
    ledBrightness = brightnessScale.get()
    ledBrightness = float(ledBrightness)
    startButton.config(state=tkinter.DISABLED)
    lenPin.write(ledBrightness / 100.0) # this part of code ain't working
    sleep(time_period)
    lenPin.write(0)
    startButton.config(state=tkinter.ACTIVE)

timePeriodEntry.grid(column=2, row=1)
timePeriodEntry.focus_set()
startButton = tkinter.Button(top, text='Lit Up', command=onStartPress)
startButton.grid(column=1, row=3)
exitButton = tkinter.Button(top, text='Exit', command=top.quit)
exitButton.grid(column=2, row=3)
top.mainloop()

根据书,此代码应该起作用。我进行了一些基本检查,例如打印变量ledBrightness,以查看它是否获得正确的值并获得正确的值。问题是当我运行程序时,它不起作用。LED根本不会出现。它仅在我将变量替换为1(true)时起作用,该变量打开LED ON OR或0(false),该变量将其重新打开,但是没有任何调整强度的选项。

我在这里做错了什么?如果write()函数只能接受1或0,这本书说您可以自定义输入?

来自文档:

value

从引脚输出电压

参数 value - 如果引脚处于输出模式,则将值用作布尔值,或者如果PIN处于PWM模式,则期望Float从0到1。如果引脚在伺服中,则值应为程度。

get_pin pin_def

返回引脚定义给出的激活引脚。可能会提出InvalidPinDefErrorPinAlreadyTakenError

参数 PIN_DEF - PIN定义如下所述,但没有Arduino名称。因此,例如a:1:i

" a"模拟引脚编号" i",用于输入" D"数字引脚编号" O",用于pWM(脉冲宽度调制)

全部由:分开。

您需要将PIN定义为PWM未输出。

lenPin = board.get_pin('d:11:p')

然后 lenPin.write(value)不仅接受0和1,而且在0和1之间的任何浮点数。

最新更新