nodemcu-firmware/lua_examples/mcp23017/mcp23017_example.lua

78 lines
2.0 KiB
Lua

--[[
This example demonstrates how to use the different functions of the mcp23017 lua module.
@author Marcel P. | Plomi.net
@github https://github.com/plomi-net
@version 1.0.0
]]
--[[
initialize and setup
]]
-- initialize module
local mcp23017 = require "mcp23017"
local address = 0x20 -- the address for MCP23017 (between 0x20 and 0x27)
local cSCL = 1 -- SCL pin = 1 = D1 / GPIO 5 (ESP8266)
local cSDA = 2 -- SDA pin = 2 = D2 / GPIO4 (ESP8266)
local i2cId = 0 -- i2c id
-- setup i2c bus and create instance for mcp23017 (assigned to mcp)
i2c.setup(i2cId, cSDA, cSCL, i2c.SLOW)
local mcp = mcp23017(address, i2cId)
--[[
set output and input channels
]]
-- set pin 7 and 8 to output (GPA7 and GPB0) and GPB1 to input
mcp:setMode(mcp.GPA, 7, mcp.OUTPUT)
mcp:setMode(mcp.GPB, 0, mcp.OUTPUT)
mcp:setMode(mcp.GPB, 1, mcp.INPUT)
--[[
set output channels to high and low
]]
-- set pin 7 to high (GPA7)
mcp:setPin(mcp.GPA, 7, mcp.HIGH)
-- set pin 8 to low (GPB0)
mcp:setPin(mcp.GPB, 0, mcp.LOW)
--[[
toggle pin 6 channel state every second (blinking)
]]
local currentPin = 6
local currentReg = mcp.GPA
local currentState = false
mcp:setMode(currentReg, currentPin, mcp.OUTPUT)
tmr.create():alarm(1000, tmr.ALARM_AUTO, function()
if currentState == true then
-- print("set to low")
mcp:setPin(currentReg, currentPin, mcp.LOW)
currentState = false
else
-- print("set to high")
mcp:setPin(currentReg, currentPin, mcp.HIGH)
currentState = true
end
end)
--[[
read input channels and display every 7 seconds
]]
-- read input register
tmr.create():alarm(7000, tmr.ALARM_AUTO, function()
local a = mcp:readGPIO(mcp.GPA)
if a ~= nil then
print("GPIO A input states: " .. a)
else
print("GPIO A unreadable, check device")
end
local b = mcp:readGPIO(mcp.GPB)
if b ~= nil then
print("GPIO B input states: " .. b)
else
print("GPIO B unreadable, check device")
end
print(" ")
end)