nodemcu lua接口id是什么

NODEMCU说明_文档库
设备管理器中查看USB转serial是否安装成功。二、运行NodeMcuFi" />
文档库最新最全的文档下载
当前位置: & NODEMCU说明
NODEMCU说明
一、使用USB数据线连接计算机与NodeMcu开发板。
第一次连接时,计算机会弹出安装驱动的提示,请搜索下载CH340的驱动9,可以在计算机->设备管理器中查看USB转serial是否安装成功。
二、运行NodeMcu Firmware Programmer烧写固件
NodeMcu Firmware Programmer(以下简称NFP)提供了NodeMcu Firmware的自动烧写功能,在成功连接计算机与NodeMcu开发板之后,打开NFP并选择Config选项,点击第一栏的
,选择已经下载的NodeMcu固件。如图所
然后选择“Operation”,出现如下图状态:
点击“Flash”,进行固件烧写。状态如下:
Word文档免费下载:
nodemcu API说明_计算机软件及应用_IT/计算机_专业资料。word文档,希望大家能方便下载 API 说明 flash 错误 注意:有些模块在烧写之后启动,串口输 出 ERROR in ...NODE MCU DEVKIT 硬件说明书管脚定义 V0.9
DEVKIT TOUT ADC0 NC NC NC 5V POWER 3.3V POWER GROUND GPIO WITH PWM GPIO WITHOUT PWM UART HSPI...NODEMCU-DEVKIT-INSTRUCTION-CN_计算机硬件及网络_IT/计算机_专业资料。NODE MCU DEVKIT 硬件说明书管脚定义 V0.9
DEVKIT TOUT ADC0 NC NC NC 5V ...NodeMcu, Nova,用户需要有 JavaScript 编程基础才能制作这部分模块) ,也允许用户...下面就对每一个目录进行说明。 4.2 block 和 generator block 和 generator ...NODEMCU-DEVKIT原理图(图片1页)_电子/电路_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 NODEMCU-DEVKIT原理图(图片1页)_电子/电路_工程科技_专业...nodemcu的中文API说明 有点混乱的官方文档 中文nodemcu官网,已经关闭了,汗。 必备软件官方推荐的IDE: ESPlorer ,集成了lua,需要安装java,一个俄罗斯人写的,IDE的...下图就是这个 2 路的低电平触发的继电器模块, 使用说明指出 JD-Vcc 和 Vcc ...NodeMcu 教程可参考《NodeMcu 三小时入门》:http://bbs.nodemcu.com/t/node...电脑性能好的话,不到 20 秒就 OK 了 “安信可 ESP8266SDK” ,包含 IDE 环境,控制台,烧写工具以 及源码 我们这次 ESP8266 前后台 +RTOS+NodeMCU 一起集成...查看: 18231|回复: 48
用NodeMCU(ESP8266)打造超级实用的智能插排
本帖最后由 快乐起航2012 于
11:51 编辑
用NodeMCU(ESP8266)打造超级实用的智能插排& && &很少写东东,因为确实很繁琐,总是无偿使用别人的成果,今天也贡献一些,希望能给人提供一些帮助。& && &买了很多智能插座,但是总和期望相差不少,由于智能家居技术发展很快,现成的产品功能有限,开发不完善,利用率很低,各个公司间壁垒严重,开发进度缓慢,在苦苦煎熬中等待的升级往往也是失望,作为极客一族,看来还是自己动手做一个吧!1、方案 NodeMCU(ESP8266)+智能插排& &&&选NodeMCU的理由是它足够便宜,另一个就是开源,这样就不会有人为的障碍阻挡你的脚步了,站在巨人的肩膀上,让花费的时间更有意义。
1.jpg (14.87 KB, 下载次数: 5)
15:30 上传
& && & 选择这款插排改造,是因为它本身外形美观,也很实用,加上了wifi可谓锦上添花,价值堪比市场上的几百元的产品,不用单个插座的理由是都上了这么多电路了,只控制一路岂不可惜,选择它还有一个重要原因是它内部有足够的空间去安装wifi控制电路,我们不能总停留在一堆零件上吧,改装完我们会获得这样一个美观实用、功能超强的智能插排!
2.jpg (90.91 KB, 下载次数: 4)
15:30 上传
插排内部图,绿色方框空出的位置正好可以安装NodeMcu和继电器板。
无标题.jpg (83.09 KB, 下载次数: 4)
17:43 上传
2 、电路原理
3.jpg (96.55 KB, 下载次数: 8)
15:30 上传
& && &是不是很简单,是因为前人已经做了很多工作了。准备好部件,先在插排内摆放好位置,接好线,其中5V电源连接到插排的USB供电电源上(原单片机供电电源功率可能偏小),12V电源连接到插排原12V电源上,切断原5V到USB连接器的供电,NodeMCU的USB口直接连接到原USB连接器插座上,这样为的是方便安装后再通过计算机给NodeMCU编程,确定需要控制的插座,剪断原铜排连线,将增加的继电器串联到插座中。这里尤其要注意的是板子上不是单纯的低压,220V、5V、12V都在同一块板上,所以在打开插座进行测量时要格外小心,改装后做好绝缘确保安全。全部安装好后要用LuaLoader软件测试一下继电器动作是否正常,一切就绪后再安装好插排盖板,这个一个精致的智能wifi插排就装好了。3、开发软件及平台& && &这个插排是不是很好用重头戏在软件上,开发系统是完全开放的,只要你有想法就能给它赋予更多的智慧,实现各种需求,让它也能与时俱进,不用苦苦等待厂家升级了。& && &NodeMCU模块是在ESP8266模块基础上增加了USB接口电路、5V电源等,软件系统实现了简单的脚本语言Lua,方便用户编程。系统的源代码已经开源。本文只讨论到Lua,如果特殊的应用可以再修改底层代码。& && &Lua是什么,是一种简单的解释性脚本语言,我也学了几句,程序就算是个示意,起个抛砖引玉的作用吧。& && &我们选乐为物联作为插排的管理平台,当然也可以选择其他各种平台,感觉目前都不甚成熟。首先我们需要接通平台,凡事要先从简单的来,太复杂的往往走的弯路更多,& && &1)上传数据& && && &&&a)我们先在乐为物联上设置两个继电器量;
4.jpg (50.65 KB, 下载次数: 8)
15:30 上传
& && && &&&b)输入上传代码test.lua[pre lang=&lua& line=&1&]local server = &&--&192.168.1.129&--
local port = 9960
local bConnected = false
gateWay = &xx&&&--设备代码
userKey = &xxxxxxxxxxxxxxxxxxxx&&&--你自己的key
local uSwitchNode = nil
local strOnline = &&
local str1=&&
wifi.setmode(wifi.STATION)
wifi.sta.config(&xxxxxxxxxxxxxx&,&xxxxxxx&)& &--路由器登陆名称和密码
wifi.sta.connect()
local cnt = 0
tmr.alarm(0, 1000, 1, function()
& && &&&if (wifi.sta.getip() == nil) and (cnt & ) then
& && && && && & print(&Trying Connect to Router, Waiting...&)
& && && && && & cnt = cnt + 1
& && && && && && && && & if cnt%2==1 then gpio.write(0,gpio.LOW);
& && && && && && && && & else gpio.write(0,gpio.HIGH); end
& && &&&else
& && && && && & tmr.stop(0);
& && && && && & gpio.write(1,gpio.LOW)
& && && && && & tmr.delay(500000)
& && && && && & gpio.write(2,gpio.LOW)
& && && && && & tmr.delay(500000)
& && && && && & gpio.write(5,gpio.LOW)
& && && && && &
& && && && && & if (cnt & 20) then print(&Conected to Router\r\nMAC:&..wifi.sta.getmac()..&\r\nIP:&..wifi.sta.getip())
& && && && && && && && &else print(&Conected to Router Timeout&)
& && && && && & end
& && && && && & gpio.write(0,gpio.LOW);
& && && && && & cnt =cfg=str=ssidTemp=
& && && && && & collectgarbage()
& && &&&end
strOnline = &{\&method\&:\&update\&,\&gatewayNo\&:\&&..gateWay..&\&,\&userkey\&:\&&..userKey..&\&}&^!&
socket=net.createConnection(net.TCP, 0)
& &&&socketn(&connection&, function(sck, response)
& && && & socket:send(strOnline)
& && && && && && && && &print (strOnline)
& && && && && && && && &tmr.delay(500000)
& && && && && && && && &str1= &{\&method\&:\&upload\&,\&data\&:[& .. &{\&Name\&:\&SW1\&,\&Value\&:\&99.7\&}&&&.. &]}&^!\r\n&
& && && && && && && && &socket:send(str1)
& && && && && && && && &print (str1)
& && && & bConnected = true
& &&&socketn(&disconnection&, function(sck, response)
& && && & bConnected = false
& &&&socketn(&receive&, function(sck, response)
& && && & --dealResponse(response)
& &&&socketn(&sent&, function(sck, response)
& && && & print(tmr.now()..&sent&)
socket:connect(port, server)[/pre]
666.jpg (50.59 KB, 下载次数: 6)
22:11 上传
& && && && &
& && && & 如上图所示,如果乐联平台上的状态显示由灰变蓝,说明数据已经上传到乐联网了。& && &2)增加控制功能& && && &a)乐联上设置控制开关功能
5.jpg (77.38 KB, 下载次数: 4)
15:30 上传
6.jpg (70.28 KB, 下载次数: 5)
15:30 上传
& && && &b)lua代码修改& && && && &测试一下,如果反馈回ok说明控制功能连接成功,到此一个能连wifi的物联插诞生了,可以把玩一下了!init.lualocal luaFile = {&sta.lua&}
for i, f in ipairs(luaFile) do
& && &&&if file.open(f) then
& && &file.close()
& && &print(&Compile File:&..f)
& && &pile(f)
& && && & print(&Remove File:&..f)
& && &file.remove(f)
& && &&&end
end
local luaFile = {&mysocket.lua&}
for i, f in ipairs(luaFile) do
& && &&&if file.open(f) then
& && &file.close()
& && &print(&Compile File:&..f)
& && &pile(f)
& && && & print(&Remove File:&..f)
& && &file.remove(f)
& && &&&end
end
dofile(&sta.lc&);
dofile(&mysocket.lc&);
luaFile = nil
collectgarbage();复制代码sta.luagpio.mode(1,gpio.OUTPUT)
gpio.mode(2,gpio.OUTPUT)
gpio.mode(5,gpio.OUTPUT)
gpio.write(1,gpio.HIGH)
gpio.write(2,gpio.HIGH)
gpio.write(5,gpio.HIGH)
wifi.setmode(wifi.STATION)
wifi.sta.config(&xxxxxx&,&xxxxxx&) --wifi路由器名称及密码
wifi.sta.connect()
local cnt = 0
tmr.alarm(0, 1000, 1, function()
& && &&&if (wifi.sta.getip() == nil) and (cnt & ) then
& && && && && & print(&Trying Connect to Router, Waiting...&)
& && && && && & cnt = cnt + 1
& && && && && && && && & if cnt%2==1 then gpio.write(0,gpio.LOW);
& && && && && && && && & else gpio.write(0,gpio.HIGH); end
& && &&&else
& && &&&
& && && && && & tmr.stop(0);
& && && && && & gpio.write(1,gpio.LOW)
& && && && && & tmr.delay(500000)
& && && && && & gpio.write(2,gpio.LOW)
& && && && && & tmr.delay(500000)
& && && && && & gpio.write(5,gpio.LOW)
& && && && && &
& && && && && & if (cnt & 20) then print(&Conected to Router\r\nMAC:&..wifi.sta.getmac()..&\r\nIP:&..wifi.sta.getip())
& && && && && && && && &else print(&Conected to Router Timeout&)
& && && && && & end
& && && && && & gpio.write(0,gpio.LOW);
& && && && && & cnt =cfg=str=ssidTemp=
& && && && && & collectgarbage()
& && &&&end
end)
复制代码mysocket.lualocal server = &&--&192.168.1.129&--
local port = 9960
local bConnected = false
local gateWay = &xx&&&--你的设备号,类似01等
local userKey = &xxxxxxxxx&&&--你自己的Key
local uSwitchNode = nil
local strOnline = &&
local str1=&&
local sw1=&0&
local sw2=&0&
local sw3=&0&
--get value from string like &p1&:&1&,&f&:&getAllSensors&
local function getStrValue(str,strName)
& &&&i,j = string.find(str,&\&&..strName..&\&:\&&)
& &&&k,l = string.find(string.sub(str, j+1, -1),&\&&)
& &&&return string.sub(str, j+1,j-1+l)
end
function sw_refresh()
& && &&&print(sw1,sw2,sw3)
& && &&&if sw1==&1& then
& && && && && & gpio.write(5,gpio.HIGH)
& && &&&else
& && && && && & gpio.write(5,gpio.LOW)
& && &&&end
& && &&&if sw2==&1& then
& && && && && & gpio.write(1,gpio.HIGH)
& && &&&else
& && && && && & gpio.write(1,gpio.LOW)
& && &&&end
& && &&&if sw3==&1& then
& && && && && & gpio.write(2,gpio.HIGH)
& && &&&else
& && && && && & gpio.write(2,gpio.LOW)
& && &&&end
end
local function dealResponse(str)
& &&&ufunctionName = getStrValue(str,&f&)
& &&&if(ufunctionName == &writeSerial&) then
& && && && && & uswitchName = getStrValue(str,&p1&)
& && &&&uswitchValue = getStrValue(str,&p2&)
& && && && && & if uswitchName==&1& then sw1=uswitchValue end
& && && && && & if uswitchName==&2& then sw2=uswitchValue end
& && && && && & if uswitchName==&3& then sw3=uswitchValue end
& && && && && & sw_refresh()
& && && && && & nodeStr= &{\&method\&:\&response\&,\&result\&:{\&successful\&:true,\&message\&:\&TD Write serial OK.\&}}&^!&
& && && && && & socket:send(nodeStr)
& && &&&nodeStr = nil
& && &&&str = nil
& &&&end
& &&&str = nil
end
socket=net.createConnection(net.TCP, 0)
& &&&socket:on(&connection&, function(sck, response)
& && && & socket:send(strOnline)
& && && && && && && && &print (strOnline)
& && && && && && && && &tmr.delay(500000)
& && && && && && && && &str1= &{\&method\&:\&upload\&,\&data\&:[& .. &{\&Name\&:\&SW1\&,\&Value\&:\&& .. sw1 .. &\&},{\&Name\&:\&SW2\&,\&Value\&:\&& .. sw2 .. &\&},{\&Name\&:\&SW3\&,\&Value\&:\&& .. sw3 .. &\&}&&&.. &]}&^!\r\n&
& && && && && && && && &socket:send(str1)
& && && && && && && && &print (str1)
& && && & bConnected = true
& &&&end)
& &&&socket:on(&disconnection&, function(sck, response)
& && && & bConnected = false
& &&&end)
& &&&socket:on(&receive&, function(sck, response)
& && && & dealResponse(response)
& && && && && & print(&return ok!&)
& &&&end)
& &&&socket:on(&sent&, function(sck, response)
& && && & print(tmr.now()..&sent&)
& &&&end)
strOnline = &{\&method\&:\&update\&,\&gatewayNo\&:\&&..gateWay..&\&,\&userkey\&:\&&..userKey..&\&}&^!&& && &&&
socket:connect(port, server)
tmr.alarm(4, 5000, 1, function()
& && &&&str1= &{\&method\&:\&upload\&,\&data\&:[& .. &{\&Name\&:\&SW1\&,\&Value\&:\&& .. sw1 .. &\&},{\&Name\&:\&SW2\&,\&Value\&:\&& .. sw2 .. &\&},{\&Name\&:\&SW3\&,\&Value\&:\&& .. sw3 .. &\&}&&&.. &]}&^!\r\n&
& && &&&print(str1)& && && && && && && && &
& && &&&socket:send(str1)
end)
复制代码
& && && &微信控制:通过手机微信开关插座,可以做到远程控制;& && && &定时烧茶水:每天可以定时开始烧水,烧完水好自动关闭电源;
& && && &&&编辑2个计划任务,一个用于打开烧茶说电源,一个任务是一小时以后关闭电源。
cha1.jpg (66.16 KB, 下载次数: 7)
22:02 上传
cha2.jpg (63.6 KB, 下载次数: 5)
22:02 上传
& && &&&启动计划后,系统就在每天晚上7点给烧水插座供电,如果需要烧水可预先灌好水,按下烧水按钮,待插座通电后自动开始烧水,水烧开后自动断电,此后每天7点以后,就可以泡一杯香茶或咖啡,岂不美哉!
7.jpg (90.17 KB, 下载次数: 5)
15:30 上传
& && && & 自动加湿:就是在湿度过低时自动接通加湿器电源加湿,隔一定时间或湿度到达后自动断开加湿器电源,停止加湿。有人问,那湿度信号从哪里来啊,那就请到论坛找找,有很多方法的,这个才体现了万物物联的真谛!
8.jpg (95.18 KB, 下载次数: 13)
15:30 上传
& && && & 还有很多很多新奇的功能…,欢迎交流,可以让生活更舒适简单。
& && && & 我还想实现一个功能,记得住宾馆,离开房间时拿走房卡,房间里可以自动断电,方便又安全,如何在家也这样方便呢,期待你的高招...
& && && & 感谢“瘦网虫”提供的lua代码参考,乐联提供的免费平台还有很多很多人在网上提供的资料和软件。
很多人咨询插排,少量提供,极客工坊的用户另有特价
欢迎联系交流我的qq:
源代码、资料、工具软件可以去qq群 下载
期待& && && && && && && && && && && && && &&&
很棒的教程,收藏……
真不错&&发教程的都是好人
老胖熊 发表于
一起完善啊,有什么好主意欢迎交流
Lua,百花齐放啊
嗯,不过想实现的功能还是有些局限
mysocket 代码最后差个end
〆﹏MARK 发表于
mysocket 代码最后差个end
高手啊,谢谢提醒,
修改过来了,代码粘过来漏掉了
快乐起航2012 发表于
高手啊,谢谢提醒,
修改过来了,代码粘过来漏掉了
照着教程做的,但是硬件不上线不知何因?
Powered by第一篇真正的文章:nodeMCU esp8266自学笔记 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了32713字,被31人关注,获得了15个喜欢
第一篇真正的文章:nodeMCU esp8266自学笔记
法克啊,本来我的底线是要自己建网站的。。。各种原因没有成功只好在简书上写了。。。
这篇文章是宗旨是怎么用arduino IDE来给ESP8266写程序。ESP8266是我最近发现的很黑科技的一个东西。首先,他继承了WIFI功能,本身也有GPIO之类的,这些以前的模块都能做到到是也没有什么了,但是价格非常之便宜,淘宝只需要25块钱,比普通的Arduino还要便宜一些。而最diao的是他只要安装一个插件,就可以直接用Arduino IDE写程序,就像是给Arduino写程序一样。很多Arduino的库也可以直接使用。
首先,几乎所有的部分都是来自于Adafruit的网站,网址是
恩,然后需要把Arduino升级到1.6.4以上。
这里开始可能电脑要翻墙,但是如果的电信的网络好像也可以不翻
选择这里preferences偏好设置
在那个文本框输入/stable/package_esp8266com_index.json
选择boards manager
搜索esp8266,然后点击安装
之后对话框下面会有一个进度调,要下载大约6m的文件,但是速度很慢。
之后就可以把我的代码拷进来,整体界面和processing很像
点击工具,然后按照我的选择,端口选择最下面的一个
然后就可以像给Arduino写程序一样写了。
这时候要拔掉控制板的220v插头。烧写程序的时候要先把控制板查到usb口上,然后在插口旁边有两个按钮,先按住标有flash的按钮,然后按住标有reset的按钮,板子上的蓝灯会闪烁一下,然后点击arduino上的upload或者下载按钮。
UPDATE:做了一个闪电云,然后拿回来以后不知道为什么就不能用了,直接接引脚是有用的,用usb供电就不行,用万用表量了一下VCC有一个限流电阻好像是断了。用杜邦线短接以后就行了。
然后不知道为什么现在烧程序不用想以前那样按按钮了。。。
然后这里是天气云(只能实现一个天气类型的展示)的代码
This sketch sends data via HTTP GET requests to
You need to get streamId and privateKey at
and paste them
below. Or just customize this script to talk to other HTTP servers.
#include &ESP8266WiFi.h&
#include &Adafruit_NeoPixel.h&
#define SENSOR_PIN
#define PIXEL_PIN
#define PIXEL_COUNT
#define LED_IN
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
const char* ssid
= "X imlab";
const char* password = "";
const char* host = "";
void setup() {
Serial.begin(115200);
delay(10);
pinMode(SENSOR_PIN, INPUT);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
pinMode(LED_IN, OUTPUT);
void loop() {
if(digitalRead(SENSOR_PIN) == HIGH){
digitalWrite(LED_IN,
delay(100);
digitalWrite(LED_IN, HIGH);
if(WiFi.status() != WL_CONNECTED){
rainbowCycle(5);
colorWipe(strip.Color(0,0,0), 0);
Serial.println("connecting to WiFi");
Serial.print("connected to ");
Serial.print(ssid);
Serial.println(", and now show the weather");
digitalWrite(LED_IN,
delay(100);
digitalWrite(LED_IN, HIGH);
int code_now = getWeatherCode();
while(code_now == -1){
code_now = getWeatherCode();
Serial.print("weather code is");
Serial.println(code_now);
displayWeather(code_now);
delay(6000);
delay(200);
int getWeatherCode(){
Serial.print("connecting to ");
Serial.println(host);
// Use WiFiClient class to create TCP connections
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return -1;
// We now create a URI for the request
String url = "/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.placefinder%20where%20text%3D\"shenzhen\")%20and%20u%3D\"c\"%0A&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(150);
// Read all the lines of the reply from server and print them to Serial
String str = "";
while(client.available()){
String line = client.readStringUntil('\r');
//Serial.println(str);
//get the code of weather now see here: /weather/documentation.html
int weather_code_begin = str.indexOf("condition\"")+20;
int weather_code_end
= str.indexOf("\"", weather_code_begin);
Serial.print("begin at ");
Serial.println(weather_code_begin);
Serial.print("end with");
Serial.println(weather_code_end);
if(weather_code_end == -1){
return -1;
int weather_code
= str.substring(weather_code_begin,weather_code_end).toInt();
Serial.print("code = ");
Serial.println(weather_code);
return weather_
void displayWeather(int code_now){
switch (code_now) {
for(int i=0; i&255; i++){
colorWipe(strip.Color(0,0,i), 0);
delay(20);
delay(1000);
//fair (night)
colorWipe(strip.Color(73, 147, 255),3);
//fair (day)
colorWipe(strip.Color(24,216,243),10);
colorWipe(strip.Color(0, 0, 0), 0);
colorWipe(strip.Color(24,216,243),10);
for(int i=0; i&255; i++){
colorWipe(strip.Color(i,0,0), 0);
delay(20);
delay(1000);
colorWipe(strip.Color(0, 0, 0), 0);
void colorWipe_short(uint16_t be, uint16_t en, uint32_t c, uint8_t wait){
for (uint16_t i = i & i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i & strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
void rainbow(uint8_t wait) {
uint16_t i,
for (j = 0; j & 256; j++) {
for (i = 0; i & strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
strip.show();
delay(wait);
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelP
if (WheelPos & 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
if (WheelPos & 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i,
for(j=0; j&256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i& strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
strip.show();
delay(wait);
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:5、nodeMCU学习笔记--uart(附透传例子) - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了9169字,被8人关注,获得了5个喜欢
5、nodeMCU学习笔记--uart(附透传例子)
这回来了解一下nodeMCU的模块。串口应该是我们用的最多的一个模块了,lua脚本都是通过串口传到mcu上面的。这部分的内容很少,只有4个函数。文档中提到了默认的波特率是115200,且在上电的前2分钟内启动了自动波特率功能。
仅有4个函数,都很简单。
method, [number/end_char], [function], [run_input]
id, baud, databits, parity, stopbits, echo
id, data1 [, data2, ...]
.alt可以重映射串口pin。传入1将pin映射到13、15。
.on用来设置串口接收回调函数。第一个参数现在只能传入"data"。参数2可以传入数字或者仅有单个字符的字符串,例如传入6就收到6个字符串就产生回调,不能大于255;传入"s"就接收到s的时候就产生回调或者收完255个字符。参数3是回调函数,取消回调就只传入"data"参数。参数4,是否执行lua解析,如果传入0将不解析执行。
.setup配置串口。id只能传入0。后面的分别是波特率(300, 600, , , 1, 5, , 0, 3686400)、数据位(5, 6, 7, 8)、校验(uart.PARITY_NONE, uart.PARITY_ODD,
uart.PARITY_EVEN)、停止位(uart.STOPBITS_1, uart.STOPBITS_1_5, uart.STOPBITS_2)。echo表示回显,0不回显。
.write是写函数。id只能传入0。
综合小例子
串口模块比较简单,直接来看看例子。把波特率设置38400 8-N-1 不带回显。回调不执行lua代码解析。这里使用1号pin来设别是否切换串口设置。
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
gpio.mode(0, gpio.OUTPUT)
tmr.alarm(0, 10000, tmr.ALARM_SINGLE, function()
gpio.write(0, gpio.LOW)
if(gpio.read(1) == 0) then
print("38400 8-n-1")
uart.setup(0, 38400, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
uart.on("data", 8, function(data)
uart.write(0, "rec: ", data)
print("-n-1")
uart.setup(0, , uart.PARITY_NONE, uart.STOPBITS_1, 1)
uart.on("data")
这个例子有个问题,得满8个字符才会产生回调。其实,可以不用设置数量或者采用ascii格式传输,然后用"\n"来触发回调。下面是一个不设置数量的例子,直接透传数据。
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
tmr.alarm(0, 10000, tmr.ALARM_SINGLE, function()
if(gpio.read(1) == 0) then
uart.setup(0, 38400, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
print("38400 8-n-1")
uart.on("data", function(data)
cnt = cnt + 1
tmr.stop(1)
tmr.interval(1, 1)
tmr.start(1)
uart.write(0, data)
uart.setup(0, , uart.PARITY_NONE, uart.STOPBITS_1, 1)
print("-n-1")
uart.on("data")
tmr.register(1, 1, tmr.ALARM_SEMI, function()
print("\n")
print(cnt)
print("\n")
这里加多个定时器来打印回调次数计数值,可以看到并不是每个字符都产生回调。所以,不必太担心频繁回调产生的性能问题。如果,我们把WiFi也加进来,那就可以变成WiFi转串口的透传模块了。如果想知道串口接收到多少字节,可以使用#data或者用string.len(data)
uart.on("data", function(data) print(#data) end, 0)
uart.on("data", function(data) print(string.len(data)) end, 0)
以下这段代码和上面的例子基本没什么区别,不过会让nodeMCU重启。如果你把它保存为init.lua,然后传送到MCU。那么,你会看到MCU反复重启。所以,建议在init.lua中加个延时。
我也没搞懂这个代码会让机器重启,bug在哪儿呢?
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
gpio.mode(0, gpio.OUTPUT)
function echoUart(data)
uart.write(0, "rec: ", data)
tmr.alarm(0, 10000, tmr.ALARM_SINGLE, function()
gpio.write(0, gpio.LOW)
if(gpio.read(1) == 0) then
print("38400 8-n-1")
uart.setup(0, 38400, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)
uart.on("data", 8, echoUart(data), 0)
print("-n-1")
uart.setup(0, , uart.PARITY_NONE, uart.STOPBITS_1, 1)
uart.on("data")
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
学习分享,技术交流,欢迎各位高人批评指正
· 37人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:}

我要回帖

更多关于 nodemcu三小时入门 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信