设计构建一个带有ESP32触摸控制的触摸灯
扫描二维码
随时随地手机看文章
如果光输出可以直接在设备上进行交互控制,那就太好了。现在我们将构建并编程一个设备。
几个星期前,当我去一家餐馆的时候,这种台灯的变体真的弄伤了我的手指。这东西是要通过触摸来控制的,但要用一种神秘的方式。有足够的理由进一步研究使用ESP32。当然,使用Micropython是成功的。这是该系列下一集的结果
带有触摸控制的台灯
有了手机应用程序,你自然有很多选择来控制台灯。但是问题已经从决定开始了——无线局域网通过路由器还是通过控制器自己的接入点。这必须在课程中考虑到,或者在开始时就已经有了。
如果光输出可以直接在设备上进行交互控制,那就太好了。现在我们将构建并编程一个设备。首选控制器是ESP32,因为它有触摸板输入。进一步考虑使用ESP8266或树莓派Pico,然后产生了触摸问题的进一步解决方案。我们将在下一集中讨论这些问题。今天我们继续讨论ESP32。我将展示如何将数据永久存储在NVS区域中,以及如何实现进程并行执行。至少第一个功能只提供ESP32。
对于使用的控制器板ESP32 Dev Kit C V4,需要两个面包板来开发电路,它们通过电流轨放在一起。这是为跳线获得足够自由接触点的唯一方法。
图1:ESP32的设置
作为触摸板,我使用了电路板和波峰的剩余部分。小铝孩子将服务于生产系统。
我使用RGB LED来显示运行状态。戒指上led的颜色可以单独设置和下调。RGB LED显示颜色。总共有五种情况:红、绿、蓝、白、中。
预电阻的尺寸是这样的,一起发出白光。蓝色的,尤其是绿色的LED比红色的要亮得多。因此,电阻值的差异很大。如果你想要一个更轻的显示,就取更小的欧姆值。
图2中的电路图显示了所有部件是如何组合在一起的。
图2:带有ESP32和触摸板的电路
作为能源供应,我选择了18650型的锂离子电池,加上一个带有加载部分和5V输出的电池所有者。我在USB A插座的连接旋转上焊接了我的电路的供应线。这样我就不用USB插头了,仍然可以使用板上的机械开关。它将指向房屋朝向地面,以及在图2中板子上端的加载插座。
因为灯里放面包板的空间太小了,我设计了一个电路板,上面可以容纳几个单独的零件。您可以按照下载PDF文件的方式进行布局。
图3:传感器灯-布局
我在实验设置中使用了RGB LED模块。对于灯本身,我发现该系列的一个led更理想,因为它更容易组装在盖子上。LED只是用双组分粘合剂粘在框架上。
图4:带有公共阴极的RGB LED
灯具部件
房屋框架和盖子由木材制成。框架由15毫米的枫木板组成,45毫米× 150毫米。作为盖子,我拿了一个5毫米厚的板,其中一个木制圆柱体粘在中间的黄铜管的中心。
图5:灯具部件
图6:粘接前的框架条
图7:安装在外壳框架和灯座在盖子
图8:传感器按键和信号LED
灯头坐落在一个230毫米长的黄铜管与6mm Ø。
图9:灯头内的LED环
Micropython -语言-模块和程序
要安装托尼,你会在这里找到一个详细的说明(英文版)。还有一个关于ESP芯片上的Micropython固件(截至2022年6月18日)如何被烧毁的描述。
Micropython是一种解释器语言。Arduino IDE与Arduino IDE的主要区别在于,你只需要在ESP32上闪烁Micropython固件一次,以便控制器理解Micropython指令。您可以使用Thonny,µpycraft或ESPTOOL.PY。对于安东尼,我在这里描述了这个过程。
一旦固件闪过,你就可以很容易地在对话框中与控制器对话,测试单个命令并立即看到答案,而无需事先编译和传输整个程序。这正是Arduino IDE困扰我的地方。如果您可以检查语法和硬件的简单测试,以便在编写程序之前通过命令行尝试和改进函数和整个程序部分,则可以节省大量时间。出于这个目的,我总是喜欢创建小型测试程序。作为一种宏,它们总结了重复出现的命令。然后从这些程序片段开发整个应用程序。
自动启动
如果程序要通过打开控制器自动启动,请将程序文本复制到新创建的空白磁贴中。将该文件保存在WorkSpace中的Main.py中,并将其上传到ESP芯片。该程序将在下次复位或开机时自动启动。
测试程序
tony - ide中当前编辑器窗口中的程序通过F5按钮手动启动。这可以比鼠标点击开始按钮或通过菜单运行更快地完成。只有程序中使用的模块必须在ESP32的flash中。
在两者之间,Arduino id ?
如果您以后将控制器与Arduino IDE一起使用,只需以通常的方式刷新程序。然而,ESP32/ESP8266随后忘记了它曾经说过Micropython。相反,任何包含Arduino IDE或AT-Firmware或Lua或…可以很容易地提供micropython固件。这个过程总是像这里描述的那样。
新像素环
类型WS2812新像素led包含三个单独的led,释放红色,绿色或蓝色光。它们由控制器寻址,控制器通过一种时钟为800kHz的总线系统接收指令。
在I2C总线或SPI总线上,来自控制器(例如ESP32)的信号以相同的方式到达总线上的所有从机,每个人都能看到一切。它与WS2812模块不同。每个构建块都有一个数据输入和数据输出。通过连接I2C总线或SPI总线,几个构建模块可以级联,来自控制器的信号,例如ESP32,以相同的方式到达总线上的所有从机,每个人都能看到一切。它与WS2812模块不同。每个构建块都有一个数据输入和数据输出。几个构建块可以级联在I2C总线或SPI总线上,来自控制器的信号,例如ESP32,以相同的方式到达总线上的所有从机,每个人都看到一切。它与WS2812模块不同。每个构建块都有一个数据输入和数据输出。几个构建块可以为单个颜色级联。我们以一个列表的形式给出颜色代码,每个WS2812有三个字节。
让我们从一个尝试开始。我们使用图2的结构。首先导入Class Pin和Neopixel。我创建了一个GPIO引脚对象作为结果,从而实例化了一个具有八个组件的新像素对象。
neopixel实例neo包含一个Bytearar和write()方法,通过该方法Bytearar的内容被传输到neopixel环。
使用neoI处理数组的前三个元素,并传递红色,绿色和蓝色,0xe0, 0x07和0x3c的值。在内部,这使得私有函数setitem()。这些值以改变后的顺序输入缓冲区。正如我们将看到的曲线,这是我在逻辑分析仪的帮助下记录的。这些值是在缓冲区中发送的。一个0对应于一个近似的窄脉冲。500NS宽度后面跟着a)。这些值以改变后的顺序输入缓冲区。正如我们将看到的曲线,这是我在逻辑分析仪的帮助下记录的。这些值是在缓冲区中发送的。一个0对应于一个近似的窄脉冲。500NS宽度后面跟着a)。这些值以改变后的顺序输入缓冲区。正如我们将看到的曲线,这是我在逻辑分析仪的帮助下记录的。这些值是在缓冲区中发送的。一个0对应于一个近似的窄脉冲。500NS的宽度按交换顺序发送。这与数据表中的信息相对应,也可以通过以下方式进行验证。
图10:RGB = 0xe0, 0x07, 0x3c, 0xF0, 0xF0, 0xF0的脉冲序列
在第一个WS2812B的输出中,丢失了三个字节0xe0、0x07和0x3c,这已经吞噬了这个构建块。相反,代码0xF0, 0xF0, 0xF0出现时间延迟,即第二个组件的代码。逻辑分析仪通道1的输入连接到第一个LED入口的测量,通道2连接到它的输出。
现在我们知道WS2812B上的袋鼠是如何运行的,并且可以转向灯的程序。
这个项目
我们想用三个传感器板来控制新led。通过GPIO33的触摸板进行颜色选择。有五个通道:开/关、红、绿、蓝和明/暗。强度增加到GPIO32,降低到GPIO27。这三个活动的操作在后台以三个函数并行运行。这是通过asyncio模块实现的。
起初,我试图做模块为_thread使用。这在两个过程中工作得很好,但拒绝为第三方服务。我找不出原因是什么。所以我们使用asyncio。
我们先从进口业务说起。该模块支持我们使用触摸板的方法。我们需要LED输出的引脚。在Neopixel上我们管理LED环的WS2812B。别名NP允许我们使用更短的拼写。这些方法用于模块时间的小小睡sleep和Sleep_ms。在C-Python中,我们也错过了这个模块的别名。类NVS只对ESP32可用,ESP32可以从我们导入类的地方看到。NVS是非易失性存储的缩写。这允许我们在系统中永久存储数据。我们用它来取下我们最喜欢的颜色组合,然后在冷启动时再次自动加载。(下载:timeout.py touch.py touchlamp .py)
NVS区域被划分为名称空间(name spaces),其中有符号32位数字和所谓的二进制blob,所以字节对象所以字节字符串。我们的分区名为config。
这里我们设置触摸板对象。第一个参数是GPIO引脚号。因此GPIO33代表Touch8, GPIO32代表Touch9, GPIO27代表Touch7。第二个参数是触摸板被归类为触摸的限制。当触摸时,读取值和方法掉落,触摸()传递1,否则传递0。
为了设置限制值,我们直接要求TP对象的相应收据,而不需要触摸。
然后是触摸。
我们将LED环的信号线连接到GPIO13上。戒指有8个led,同样你也可以使用一个有12个led的戒指。当然,它也会更快地耗尽电池。使用8系列环,电流消耗在40mA到250ma之间。当使用2200毫安时,根据亮度设置的不同,负载足够使用大约8小时。
我已经列出了上面5个通道的含义。颜色的颜色作为代码列表“All LEDs out”=[0.0.0]。
接下来是NVS区域中保存和读取颜色代码的例程定义。颜色名称用作键,值来自列表元素。重要:只有使用commit()命令才能传输到内存。
阅读更容易。我们以列表的形式返回颜色值。如果省略方括号,将得到一个返回对象Tupel。我们不需要这样做,因为我们想要改变程序中的元素值,而这在tupel中是不可能的。
在开始时,名称空间config仍然为空。因此,读访问抛出一个Try Except拦截的异常。我们不读取颜色代码,而是在内存中编写上面定义的代码。在下一个开始,键红,绿和蓝存在。
我们继续定义其他变量和对象。如果我们在操作过程中切换led变暗,则实现是当前颜色代码的短暂中间存储器。那我们就带走真的。
然后我们定义RGB LED的输出。我们把物体放在tupel led中。因为对象引用没有改变,所以可以安全地使用tupel。对于形状,也可以采用tupel。这些元件依次是燃料,并决定如何将电缆切换到信号LED。channel中是四个通道的名称,这是我们在Replica中输出所需要的。
函数lum()用颜色代码填充新像素缓冲区,并通过GPIO13输出将缓冲区内容发送到环。
现在开始使用asyncio模块。因此,我们定义了三个用于触摸控制的函数。使用TP1时,如果我们切换通道,将当前颜色保存为Nvs。config并将戒指调暗。我们用触摸触控板的周期来解码每种情况下应该发生的情况。
在异步系统中表示进程的函数必须以asyncdef方式启动。该过程在函数离开后立即结束。我们不希望那样,所以这个过程就像一个无限循环一样运行。对象的channel和color经历我们必须在其他地方使用的潜在变化,所以我们在启动函数时将它们声明为全局。
我们用asyncio-Variant的asyncio.sleep_ms()代替正常的超时的Sleep_ms()。用线条
我们向系统发出信号,告知该进程可以在此时中断,以便操作其他进程。
只要pad TP1没有被触碰,那么这个循环就会空着运行。如果确定了触摸,则传递触摸()1,并使用getduration()确定持续时间(以毫秒为单位)。
一个短的水龙头带来的周期远低于100。
如果保持时间小于500ms,我们计数通道并将信号RGB切换到相应的颜色。通过模5除数的形成,我们将其取值范围限制在0…4,从而接收到一个环形计数器。
如果保持时间在半秒到两秒之间,我们触发当前颜色的存储。
LED环变暗超过两秒。
函数showchannel()操作信号LED的输出。通道号被移交并测试是否符合有效区域。如果不是这种情况,则抛出异常。led (i)一个接一个地表示红色,绿色和蓝色的三个输出。在num上访问相应的模式,并在模式的元组中寻址值。
showchannel(3)调用通道3(蓝色)的模式(0.0.1),并设置Ledr = 0, LedG = 0和LEDB = 1。
具有Async Def的函数被启动时,行为是协作的,它们允许多个进程彼此并行执行,因此被称为协程。使用协同程序increate(),我们计算所设置通道的颜色值。颜色、实现和注释的变化必须在流程之外可见,即全局可见。该进程被永久地保存在while循环中,并且可以被中断。
通道1到3,一个离散的颜色被控制。如果我们控制颜色值增加时的附加值。在第10次运行时,为了避免不必要的副作用,第5次运行时,我们将颜色值限制为最大255。列表中对应的元素颜色为。1中的通道数减少1个PTR。
在通道4中,所有分量的颜色增加相同的值3。在[255,255,255]处结束。当向后移动时,只有白光的强度降低。原来设定的颜色不再达到。目前这不是很好,但应该在sensorlampy2.0的另一集中进行优化。
信号LED在通道0处变暗。在减少选项卡中,当前的颜色代码为realciintermediated,代码为[0.0.0]。这里,在increate()中,颜色代码被恢复并发送到环。旗子说:让我们把它放回去。
函数递减()如果我们做类似的工作,不是加,而是用颜色值做减法。
主程序也是作为协程编写的。首先,我们创建一个事件循环。它接管了对任务过程的控制。作为参数,我们传递函数并解释事件循环应该是一个永久的运行器。
我们打开灯并启动Main()函数。在那之后,一切都自行进行。在那之后,一切都是通过触摸触控板完成的。
本文编译自hackster.io