拙网论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 135|回复: 0

NodeMCU 的主要特点和优势是什么?

[复制链接]

949

主题

1001

帖子

3736

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3736
发表于 2018-5-31 14:37:14 | 显示全部楼层 |阅读模式
作者:Mars韩笑
链接:https://www.zhihu.com/question/36288709/answer/69881237
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作为项目组的成员...总觉得不说点什么不太应该...
先说说历史吧~为啥会有有人突发奇想做出来一个这样的玩意
Espressif是个非常好的公司...他们有一个非常不错的芯片叫ESP8266,但是...就像我在回答————ESP8266这类超低成本WiFi SoC的加入会不会改变现有的物联网产业结构? - Mars韩笑的回答———这个中写到的一样,乐鑫对于SDK的设计非常超前,采用OO+事件响应的方式,对于硬件工程师来说,是十分蛋疼的。同时,由于NDA(现在都逐渐公开了~)的存在+没啥资料+有的也是混乱。所以呢,有一天,一群人聚在群里各种吐槽,有人提议,为啥不去做个二次封装?实现让硬件工程师不用着心塞+软件工程师不看着晕菜,于是就引入了脚本语言的概念。于是几个有志青年(然而并没有我...)聚集在一起,准备做个这玩意。
有人问,现在Espruino(JS), MicroPython...各种适应于单片机的脚本语言有很多,为何采用了这个很少听到过的"Lua"呢?
因为它的轻量化!ESP8266初期,由于SDK的优化比较差,虽然可以在NOR Flash中直接执行,但硬件不支持单字节读取写入,所以很多变量还是要存储在Falsh,可用内存仅有60多KB,MicroPython,JS之类的扔上去都阉割的不像样子了。这个即便在现在借助某黑科技后(后面说)可以达到80KB+,但是依旧没能实现我们的最初的宏伟的设想(继续后面说...)。
但是,这依旧是在Arduino出现之前最快速上手的8266编程方式,所以也得到了很多人的关注
[炫耀~截至2015/10/29中午13:25分,Arduino for ESP8266有1286 Star,而光是NodeMCU Firmware就有1397 Star]
好了,撤了这么多,回答问题吧,主要特点与优点。
特点:
1.脚本语言
这就意味着,你不需要限制诸多的庞大编译工具链,换句话说,你不需要编程环境。我可以用我的手机写代码,用我的iPad写代码(这个有User在开发哦~,在线编程调试).... 而且,好处还在于,其可扩展性。举个例子,有个人问我,怎么实现模块做服务器,可以任意控制模块的动作。想想看...如果你用SDK,准备写多少行?
来个NodeMCU的例子....
cn("receive",function(c, pl)  local res = pl:sub( pl:find("res=\".+\""))  local res = res:sub(6,-2)  node.input(res)end)
是不是感觉特流氓....是的,就是这么简单直接暴力...
服务端怎么写呢?
人家是有文件系统的!
2.文件系统(目前为SPIFFS,FATFS开发当中)
还记得当年OTG升级的痛苦么?这又是脚本语言的一大优点,人家就是一堆“原始代码”,想干啥干啥,增量更新也就是直接从服务器down下来一段脚本,开机的时候给你执行以下让后自删除。是不是感觉世界更明亮了?SDK想做增量更新那就是痛啊......
那我整个更新? 我想说,其实如果逻辑处理的好话,根本就是设备连重启都不需要,卸除旧的加载新的,如果发现新的工作不正常,那可以...卸载,换回去。就是这么任性...
除了OTG方便,其次就是网络服务器。 演示一个很简单的,用10分钟时间做的蛋疼玩意
=============================长程序警告=================================
node.setcpufreq(160)ap_cfg = {}ap_cfg.ssid = "SmartWindowController"wifi.ap.config(ap_cfg)wifi.sta.config("*****","******")wifi.setmode(wifi.STATIONAP)wifi.sta.connect()tmr.alarm(0,1000,1,function()    if wifi.sta.getip() ~= nil then        print(wifi.sta.getip())        tmr.stop(0)        tmr.stop(1)        gpio.mode(0,gpio.INPUT)    endend)sv=net.createServer(net.TCP,30)shadow_status = "stop";GPIO13 = 7;  --Red CableGPIO14 = 5;  --Write Cablegpio.mode(GPIO13, gpio.OUTPUT)gpio.mode(GPIO14, gpio.OUTPUT)gpio.write(GPIO13, gpio.HIGH)gpio.write(GPIO14, gpio.HIGH)sv:listen(80,function(c)       cn("receive",function(c, pl)        if pl:find("favicon") then            c:close();            --print(pl)            --print("FAVICON REFUSE CONNECTION")            return        end                if pl:find("status=shadow H") then            gpio.write(GPIO13, gpio.LOW)            gpio.write(GPIO14, gpio.HIGH);            shadow_status = "shadow";            file.open("index.stop.html")            c:send(file.read(1000))            --print(pl);            --print("CHANGE TO SHADOW")            return        end        if pl:find("status=clear H") then            gpio.write(GPIO13, gpio.HIGH)            gpio.write(GPIO14, gpio.LOW);            shadow_status = "clear";            file.open("index.stop.html")            c:send(file.read(1000))            --print(pl);            --print("CHANGE TO CLEAR")            return        end        if pl:find("status=stop H") then            gpio.write(GPIO13, gpio.HIGH)            gpio.write(GPIO14, gpio.HIGH);            shadow_status = "stop";            file.open("index.ready.html")            c:send(file.read(1000))            --print(pl);            --print("CHANGE TO STOP")            return        end        if shadow_status ~= "stop" then            file.open("index.stop.html")            c:send(file.read(1000))            --print(pl);            --print("CHANGE TO STOP, NEW PAGE")            return        end        file.open("index.ready.html")        c:send(file.read(1000))        --print(pl);        --print("NEW PAGE")         end)    cn("sent",function()                    local buf = file.read(1000)        if buf ~= nil then            c:send(buf)            buf = nil        else            file.close()            c:close()        end    end)end)

=============================================================================
当然...没有按照HTTP包来是我的锅...不过10分钟嘛...
网页当然是用Bootstrap写的,js之类都在云端,怎么控制呢?哇塞,直接跳转就好了...relocate,一行JS的锅.当然也是可以放歌,刷图之类的,这个就看造化了。。。NodeMCU采用特殊方法绕过系统的Flash大小检测,所以可以支持无限大的Nor Flash,主流能买到的不过只有32MB,能存几首歌吧......

在回答前面的“后面说”之前,提提与这个项目相关的一些玩意。

这个是什么?
当然,NodeMCU并不只是一个Firmware,我们希望创造一个完整的生态圈。
在Github中->nodemcu (zeroday) · GitHub
NodeMCU项目(暂时)由-组成
        NodeMCU Firmware
        NodeMCU Flasher
        NodeMCU Devkit
作为目前ESP8266最稳定好用的开源开发板之一(除了这个,其他看得上眼的就只有原厂了...不过超级贵),其他很多项目例如说十分牛逼的Smart.JS也用的我们的哦:)
当然,整个项目不会停滞于此,还会有更加牛逼的东西,不过只是在Under Developement而已。

3.这个项目有很多大神
现在来回答”后面说“
内存不足从项目伊始就在困扰着整个的发展,直到有这样一个大神的加入——jmattsson (Johny Mattsson) · GitHub ——。通过一种完全可以写一篇论文来描述的方法(基本上就是实现了单字节模拟四字节读取写入Flash),实现了内存大小质的提升。这个即便是原厂...一开始也没啥好办法的问题,被他解决了。让后,我们与原厂的工程师沟通,希望将这个特性加入SDK底层中,So...另外一个RAM的突破点被打开,剩余内存大幅度下降。可能有人会问,这个会不会影响程序速度?当然...不过你感觉不到罢了~
当然还有其他许许多多的大神,比如说TerryE (Terry Ellison) · GitHubdvv (Vladimir Dronnikov) · GitHub等等......这些人的存在,让整个项目更加有活力~也使得其拥有越来越的的”黑科技“

======吃饭去了...饿死了


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|抱朴守拙BBS

GMT+8, 2025-5-26 02:46 , Processed in 0.189664 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表