Gpiozero 流程
2015年,我有了gpiozero的想法——一个用于树莓派的Python库,通过抽象化使编程GPIO设备变得更加简单:不再考虑引脚通道、电压、上拉电阻以及上升或下降沿,而是关注按钮被按下和释放、传感器检测光线或运动,以及电动机向前和向后驱动。gpiozero让你能够用这些术语编写代码。我们开发了一个以设备为中心的API,模式逐渐显现。最终我们支持了三种编程方式:1. 程序式:while True: if button.is_pressed: led.on() else: led.off() 2. 基于事件:button.when_pressed = led.on button.when_released = led.off 3. 声明式:led.source = button 这三段代码以不同的方式实现相同的目标。一种是反复询问按钮是否被按下;另一种是告诉按钮来控制LED;还有一种是告诉LED跟随按钮的状态。很难说哪种更易于阅读、编写或理解。也许最后一种,因为它只有一行。但是如果你想反转逻辑,让按钮关闭LED而不是打开,前两种的改变都很简单,但第三种就不容易了。但这就是有趣的地方!我们提供了操作值流的函数,当其从一个设备传递到另一个设备时:led.source = negated(button),甚至可以提供人工值流,比如正弦波:servo.source = sin_values() 这将驱动伺服电机在其最小和最大点之间稳定运行。所有这一切的工作方式是通过gpiozero将标准值范围分配给设备。有些设备是简单的布尔值,比如按钮和LED。按钮被按下时是1,其他情况下为0。对于LED,0是关闭,1是打开。我们可以使用PWM来控制LED,使其亮度在0到1的范围内调整。如果我们使用读取0到1的模拟输入,我们可以直接从该设备控制LED的亮度:pot = MCP3008() led = PWMLED(pin) led.source = pot 有些设备的范围是-1到1,比如电动机,其中0到1部分是向前的速度,0到-1部分是向后的速度。因此正弦波将使其逐渐加速到最大速度,然后减速,反转方向,再逐渐加速到另一个方向的最大速度。你可能想要操作或组合值流——所以我们提供了一系列常见用例的函数,比如negated、inverted、clamped、scaled、absoluted、booleanized、zipped和smoothed。你也可以编写自己的生成器函数。我曾经在树莓派工作时,在我的许多会议演讲中定期包含这个概念,并且我写了一页文档来解释它。这个页面展示了如何使用简单的流程图表达设备之间的关系:这促成了一个想法——一个基于Web的用户界面,你可以从侧面面板拖放GPIO设备到自由格式的画布上,并在它们之间绘制连接线。如果你将LED连接到按钮,按钮将控制LED,完全基于源/值关系。有一个叫Node-RED的项目以这种方式工作,但我发现它复杂,而且它的GPIO功能是基于引脚而不是设备的。我想要的完全是基于gpiozero的源/值的工作方式。我知道我想要什么,但管理的复杂性太多,需要很多现代JavaScript的知识。所以我们在2026年,这次我有Claude来轻松处理这样的事情。我写下了这个想法的描述和MVP的规格——纯粹是一个模拟器——迅速在达成一些技术和设计选择的共识后有了一个工作的原型。我花了一些时间调整UI,添加配置、图标和动画。它很快变成了一个有趣的工具。我们添加了一个Python代码生成器,以便你可以看到项目的等效Python代码。然后我们研究了一些远程控制树莓派GPIO引脚的方法,并编写了一个代理程序在树莓派上运行。Web应用程序通过WebSocket与树莓派通信,并且它就是好用。我们添加和改进了更多功能——几乎支持所有gpiozero中的设备,包括像TimeOfDay这样的内部设备,操作值流的源工具系列,以及像sin_values这样的人工源:我希望支持附加板,但这并不适合源/值的概念,因为由输入和输出组件组成的复合设备的形状使其使用变得困难。然而,能够拖入你拥有的板子,而不必分配它使用的所有特定引脚号,这很有用——所以我包括了板子,但让它们在画布上作为单独的组件出现,预配置在正确的引脚上。我觉得能够将复合设备像交通灯拆分成它们的组件是有用的,并将LED转换回PWMLED——所以我们添加了这个。我们添加了一组有限的初始化参数,并为每个类或函数添加了指向gpiozero文档的链接。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡