2、nodeMCU学习笔记--tmr模块

闲言碎语

nodeMCU是基于esp8266的开源项目,项目组让这个小玩意可以使用Lua脚本语言来开发一些有趣的东西。这里有nodeMCU最新的英文文档。当然,也有中文文档,但不是最新的。从这篇文章起,会花几篇文章来讲讲笔者构建的固件中的模块。从简单的开始说起,今天的主角是tmr模块。这里是英文的API文档,以及对应的C文件

模块函数

提供API的翻译,只会针对性的说一些文档里面的内容 -.-

模块提供7个静态timer,编号0~6(很快将移除)。也可以使用 .create函数动态创建。tmr模块总共有13的函数。

序号 函数名 参数 返回值
1 tmr.alarm() id / ref, interval_ms, mode, func true / false
2 tmr.create() object
3 tmr.delay() us nil
4 tmr.interval() id / ref, interval_ms nil
5 tmr.now() us
6 tmr.register() id / ref, interval_ms, mode, func nil
7 tmr.softwd() timeout_s nil
8 tmr.start() id / ref true / false
9 tmr.state() id / ref bool, int / nil
10 tmr.stop() id / ref true / false
11 tmr.time() s
12 tmr.unregister() id / ref nil
13 tmr.wdclr() nil

先从简单的函数开始说起,

  1. .softwd 设置一个软件看门狗,时间参数单位为秒。使用任何负数可以失能。
  2. .wdclr 喂狗。但是,文档说使用这个功能是错误的。没明白tmr这个看门狗干嘛用的。
  3. .delay 顾名思义,就是最传统的死循环延时,文档中明确指出不推荐使用!
  4. tmr.now & tmr.time 都是用来获取系统时间,只是单位不一样。前者是微秒,后者是秒。31位计数器,计满后清零。
  5. .alarm 就是调用 .register.start 两个函数。
  6. .interval 修改一个定时器的终止时间,单位ms
  7. .start 启动或者重启定时器.
  8. .stop 暂停一个正在运行的定时器,可以使用.start重启。
  9. .state 返回一个定时器的运行状态(启动or暂停)和模式或者nil。注意,该函数返回的是两个参数。Lua的神奇之处在于,返回值可以是多个。
  10. .register & .unregister 前者用于注册一个定时器。后者注销一个定时器,如果定时器还在运行会先暂停。
  11. .create 动态创建一个定时器。

还有,就是mode参数有三种选择。分别是:

  1. tmr.ALARM_SINGLE 单触发模式,会自动注销定时器;
  • tmr.ALARM_SEMI 手动重置模式,可以使用.start重启定时器;
  • tmr.ALARM_AUTO 自动重置模式。

接下来,会用几个例子来说tmr模块中的函数应该怎样用。前3个函数忽略掉!首先来看看.alarm是什么效果。

count = 0
function print_count() 
    count = count + 1
    print("count = ", count)
    end
tmr.alarm(0, 1000, tmr.ALARM_SINGLE, print_count)
单触发模式

保存上面的代码,会自动把文件传到nodeMCU并执行。可以看到只是输出了一次就停下来了。可以在右边的输入框里面输入

=dofile("tmr_1.lua")       

重新执行,引号里面是你刚才保存的文件名。接着,把mode换成

tmr.alarm(0, 1000, tmr.ALARM_SEMI, print_count)

手动重置模式

效果如上图所示,也是输出一次就停了。不过,使用.start(0)可以重启该定时器,并输出累计值。如果在单触发模式使用.start(0)则会返回false,不会有输出累计值。对于,自动重置模式,就不用给例子了,我知道你懂的。不过,你使用自动重置模式后,会发现那累计值的输出根本停不下来。这时候,别忘了,还有.stop可以用哈。一不小心,就说了3个函数了。再来试试看.interval,在右边输入

=tmr.interval(0, 10000)

把自动重置时间调整到10s,如果先前你暂停了定时器,那麻烦先启动一下。

=tmr.state(0)

我们还可以用.state来查询一下定时器的状态。我不会告诉你返回了true跟1的。可能你会有疑问,这样子输指令,哪里是编程。这样做只是要看看效果,Lua是异步的,在接收到一条指令后就会执行。这里把手动输入指令当作一个外部中断就可以了。
接下来用另外一个例子介绍剩下的几个函数

count = 0
timer = tmr.create()
runTime = tmr.time()
tmr.register(timer, 1000, tmr.ALARM_AUTO, function()
    local temp = 0
    count = count + 1
    temp = tmr.time()
    print("count&runTime=", count, temp - runTime)
    runTime = temp
    if(count == 10) then
        tmr.interval(timer, 3000)
    end
    if(count == 20) then
        tmr.stop(timer)
        print(tmr.state(timer))
        print(tmr.unregister(timer))
        print(tmr.state(timer))
    end
end)
tmr.start(timer)

先使用.create动态创建一个定时器,然后使用.register注册这个定时器,在其回调函数里面使用了.interval调整时间间隔。最后使用.stop和** .unregister**停止、注销这个定时器。这里使用print函数打印查询状态、暂停、注销的返回值。

一点问题

第二个例子中,由于定时器是动态创建的。如果你在这个例子中的定时器没有停下来之前,又send了一次文件,那么恭喜你,你会看到一直有输出。每send一次就动态创建一个定时器。因为count是一个全局变量,一直在+1,count = 20只有一次,也就只有一个定时器会被暂停,其他的定时器则不会。

补充一下Lua语法

  • Lua中没有像C语言那样的自增运算符,比如++
  • 函数是这样声明的
function 函数名(参数)
    干活,干活
return 参数,参数
end
  • if 语句是这样子的
if (条件) then
    干活,干活
end

简书评论不能贴图, 如有需要可以到我的GitHub上提issues

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 指令集 lua_capture_error_log lua_use_default_type lua_malloc...
    吃瓜的东阅读 11,987评论 0 2
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,381评论 0 17
  • 记录人:张木泽 应到人数:6 实到人数:4 已完成: 部分同学完成103 观看103引导视频 待完成: 继续完成1...
    MIRANDAz1011阅读 117评论 0 0
  • 气象预报说明天开始冷空气南下,气温会直降十几度,,今天车上的温度显示25度,但是我还是穿着短袖T恤,一点都不觉得...
    枫下坐禅阅读 263评论 0 0