我正在为Arduino的#34; Python编程工作#34;由Pratik Desai撰写(恼人的聪明人)。
我被困在运动中,学生正在学习如何实现一个改变连接到引脚的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或0(False)将其关闭,但是没有任何调整强度的选项。
我在这里做错了什么?如果write()
函数只能接受1或0这本书怎么说你可以自定义输入?
答案 0 :(得分:4)
<强>写强>(值)
从引脚输出电压
参数:值 - 如果引脚处于输出模式,则使用值作为布尔值;如果引脚处于PWM模式,则使用0到1的浮点数。如果引脚位于SERVO中,则该值应为度。
<强> get_pin 强>( pin_def )
返回引脚定义给出的激活引脚。可以提出
InvalidPinDefError
或PinAlreadyTakenError
。参数: pin_def - 引脚定义如下所述,但没有arduino名称。例如
a:1:i
。'a'模拟引脚输入'd'数字引脚的引脚编号'i'pwm(脉冲宽度调制)输出'p'的引脚编号'o'
全部由
:
分隔。
您需要将引脚定义为PWM不输出。
lenPin = board.get_pin('d:11:p')
然后lenPin.write(value)
不仅接受0和1,而且接受0到1之间的任何浮点数。