边学NodeMcu边学Lua--GPIO,PWM操作

         早听闻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的操作就大致说到这里,如果本文中有说错的地方,欢迎指出

猜你喜欢

转载自blog.csdn.net/a909204013/article/details/54708678
今日推荐