早听闻nodemcu功能强大,于是买元件的时候的顺便买了一块,后来由于时间原因就闲置在旁边了。最近闲着翻了一下Nodemcu的官网,发现的确很强大。但是编写的语言是Lua,对这门语言没了解过。就干脆边学nodemcu边学lua语言。这两天学了IO输入输出,中断,定时器,pwm一些基本的操作,后续会更新比较高级点的东西。如果有写错了的地方,希望大家可以指出。
1.IO口的操作
IO的操作可以说是单片机最基本的。记得当时学习单片机的时候电路第一个led灯的场景。今天就用lua点亮nodemcu上面的led灯。
笔者用的是nodemcuv0.9版本,根据官网上的原理图可以知道GPIO16是连接led灯,另一端连接的是VCC
GPIO16与D0相对应,又可知发光二级管产生压降的时候会发光。所以当D0输出0,led亮。输出1,led灭。弄懂原理之后开始写代码,新建一个init.lua的文件,用你喜欢的编辑器打开。这儿笔者推荐用sublime text 3,网上有很多关于这个编辑器的资料,这儿也就不罗嗦了。直接上代码。
LED= 0
gpio.mode(LED,gpio.OUTPUT)
gpio.write(LED,gpio.LOW)
第一句和普通单片机的定义管脚是一个原理,甚至更简单。刚才我们提到了GPIO16对应的是D0。第二句是指将LED的管脚设置为输出模式。第三句将LED管脚输出高电平。
这样一看,原理和我们C51的原理大致差不多,只是写法更简便,nodemcu集成了很多库函数,需要的时候只需要调用就行。将上面的代码烧录进nodemcu。我们可以看到nodemcu上面的小led一直常亮。
现在我们在写一个led闪烁的程序
LED = 0
gpio.mode(LED,gpio.OUTPUT)
gpio.write(LED,gpio.HIGH)
COUNTER = 0
tmr.alarm(0,1000,1,function( )
ifCOUNTER % 2 == 0 then
COUNTER= COUNTER + 1
gpio.write(LED,gpio.HIGH)
else
COUNTER= COUNTER + 1
gpio.write(LED,gpio.LOW)
end
end
)
我们可以看到后面多了tmr.alarm().这个函数的原型是
tmr.alarm(id, interval, repeat, functiondo())
参数
id: 定时器的 id,0~6.
Interval: 定时时间,单位:毫秒。
repeat: 0:一次性闹钟;1:重复闹钟。
function do(): 定时器到时回调函数
这儿用的定时器实现的led灯的亮灭。每隔1000ms就执行一次回调函数。每执行一次函数就将counter加一,判断是奇数还是偶数。偶数灭,奇数亮。如此这般循环。
从上面两个例子可以看出。用lua编写在nodemcu上面跑的程序很方便。比51和stm32还方便,只有调用一个函数就可以。Lua的执行顺序也是从上到下,与C语言不同的地方。语句后面可以不加标点符号,属于无类型的语言,不需要定义直接使用,这儿和python比较像。Lua的函数可以没有函数名,就像上面led闪烁的例子。当然可以调用函数的这种写法。比如下面这种
LED = 0
gpio.mode(LED,gpio.OUTPUT)
gpio.write(LED,gpio.HIGH)
COUNTER = 0
function ledShark( )
ifCOUNTER % 2 == 0 then
COUNTER= COUNTER + 1
gpio.write(LED,gpio.HIGH)
else
COUNTER= COUNTER + 1
gpio.write(LED,gpio.LOW)
end
end
tmr.alarm(0,1000,1,ledShark)
和C语言一样,lua的函数也是经过调用才会执行的。
PWM操作
在这儿也把pwm的操作归到GPIO的操作里面。先来看与pwm操作的库函数有哪些
这儿就不针对每一个库函数细细讲解了。
本想做一个LED的呼吸灯效果,但是LED灯对应的是D0,而恰好D0不支持PWM。所以只有用D1来做这个小实验,观察现象也得用万用表了╭(╯^╰)╮。
pin = 1
pwm.setup(pin, 1000, 512)
pwm.start(pin)
function led(r)
pwm.setduty(LED, r)
end
led(1000)
pwm.setup(pin, clock, duty)
参数
pin: 1~12, IO 编号
clock: 1~1000, pwm 频率
duty: 0~1023, pwm 占空比,最大 1023(10bit)。
pwm.start(pin),启动pin管脚的pwm
pwm.setduty(LED, r)设置pin管脚的占空比。
具体的现象只有用万用表测试具体管脚的电压了。注意只有1-12支持pwm输出。
关于GPIO和PWM的操作就大致说到这里,如果本文中有说错的地方,欢迎指出