带孩子做花环

图片

难度等级:适合初学者。

这个主意是在除夕夜打破旧花环时提出的。 儿子看着RGB LED灯条,问是否可以用它制作花环。 你可以-我说,儿子很长一段时间开始确切地描述花环应该如何闪烁。 我什么都不懂,因此决定确保他可以自己完成自己想做的事情。 我首先分析了自己对项目的愿望:

  1. 从头开始的开发环境
  2. 离线工作-可以使用设备的功能已关闭
  3. 空中工作,无需连接电线
  4. 可靠性-在需要重新启动之前,任何下载的程序都不应“挂起”设备


硬件平台


晶体管

基于带有NodeMCU的ESP8266板( 像这样 ),在其中添加了两个晶体管和电阻器。 选定的模块具有3至20伏的稳压器,从而可以使用与磁带相同的电源为其供电。 esp输出提供3伏的电压,电流限制为12mA,因此我使用常规的双极晶体管来控制磁带。

图片

为了使微控制器不会冒白烟,我在输出和基极之间放置了一个220 Ohm的电阻。 Esp有软件pwm,有些管脚有特殊用途,我通过实验进行了选择。

韧体


在使用之前,esp8266需要刷新,我将NodeMCU与lua一起使用,尽管它的功能比带有C ++的Arduino略少。 因此,最简单的启动方法是使用来自nodemcu-build.com的现成固件。 对于我们的项目,我们将需要添加pwm模块。 稍后,指向该图像的链接将放入邮件中。 您需要带浮球一个。

您可以从这里与任何程序员一起刷它,而我使用NodeMCU Flasher。

NodeMCU有一个文件系统,执行从init.lua模块开始,我使用ESPlorer进行下载。

闪烁二极管


下一刻误导了我。 内部编号(GPIO0-16)仅在本机程序(Arduino / C ++)中使用。 从lua,使用来自董事会的符号。 例如,要使用GPIO16 / D0(内置LED)。 从Lua,您需要编写gpio.write(0,gpio.HIGH)。 您可以直接从ESPlorer控制台闪烁二极管。

图片

与Arduino不同,nodemcu 无法使用延迟和繁忙循环,控制台和wifi使用同一处理器来工作。 板卡中还内置了看门狗,如果您的代码运行时间超过500ms,它将重新启动它。 建议处理器占用时间不超过2ms。 为了解决这个问题,有功能node.task.posttmr

选择开发环境


起初我想使用Scratch,但它不适合我,因为它不允许我脱机工作-该程序在草稿环境中的计算机上运行,​​并且所有开发板都是被动工作的。 在互联网上流连忘返之后 ,我遇到了Google Blockly 。 事实证明,这正是您所需要的:它支持lua中的代码生成以及自己的块的创建。 经过实验后,我决定创建基于Web的项目,选择nodejs作为服务器,并选择Blockly作为前端。 绝对有必要创建2个块-设置颜色和延迟。 Blockly具有用于处理#ffffff格式的颜色的内置函数,创建用于设置颜色的函数不是问题。

扰流板方向
Blockly.Lua['set_color'] = function (block) { var parseColor = Blockly.Lua.provideFunction_( 'set_colour_rgb', ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(s)', ' local rs,gs,bs = s.match(s, "#(..)(..)(..)");', ' setColor(tonumber(rs, 16),tonumber(gs, 16),tonumber(bs, 16));', 'end']); var value_color = Blockly.Lua.valueToCode(block, 'Color', Blockly.Lua.ORDER_ATOMIC); var code = `set_colour_rgb(${value_color})\n`; return code; }; 


因此,三分之二的要求已关闭。

睡眠()函数


在这里,我必须特别考虑如何将OTA的可靠操作与自定义代码的执行结合起来。 幸运的是,lua有一个协程

在仔细思考并仔细阅读文档之后,我意识到所有客户端代码都需要在协程中运行,并使用yield而不是sleep,以便主模块可以设置计时器。

另外,为了保护电路板免受无限循环的影响,我在生成器之后通过在每个循环的每次迭代的开始处插入yield(0)来修补代码

 function MCUPostProcessLua(code) { return code.replace(/ do[ ]?\n/, ' do \ncoroutine.yield(0);\n'); } 

OTA下载


我决定为局域网实施最简单的解决方案,该板连接到家庭wifi,以固定地址连接到服务器,发送唯一的标识符(以便正确处理重新连接),并期望通过此套接字更新程序。

结果


github.com/farafonoff/BlocklyESP8266


您可以添加很多,例如,用于通过公共网络工作的某种授权选项,以hostap模式使用的用户友好配置器,改进init.lua模块化以及对其OTA更新的支持(现在仅更新带有加载程序的模块)。

Source: https://habr.com/ru/post/zh-CN409449/


All Articles