-------------------------------------------------------------------------------- -- DS3231 I2C module for NODEMCU -- NODEMCU TEAM -- LICENCE: http://opensource.org/licenses/MIT -- Tobie Booth -------------------------------------------------------------------------------- local moduleName = ... local M = {} _G[moduleName] = M -- Default value for i2c communication local id = 0 --device address local dev_addr = 0x68 local function decToBcd(val) return((((val/10) - ((val/10)%1)) *16) + (val%10)) end local function bcdToDec(val) return((((val/16) - ((val/16)%1)) *10) + (val%16)) end -- initialize i2c --parameters: --d: sda --l: scl function M.init(d, l) if (d ~= nil) and (l ~= nil) and (d >= 0) and (d <= 11) and (l >= 0) and ( l <= 11) and (d ~= l) then sda = d scl = l else print("iic config failed!") return nil end print("init done") i2c.setup(id, sda, scl, i2c.SLOW) end --get time from DS3231 function M.getTime() i2c.start(id) i2c.address(id, dev_addr, i2c.TRANSMITTER) i2c.write(id, 0x00) i2c.stop(id) i2c.start(id) i2c.address(id, dev_addr, i2c.RECEIVER) local c=i2c.read(id, 7) i2c.stop(id) return bcdToDec(tonumber(string.byte(c, 1))), bcdToDec(tonumber(string.byte(c, 2))), bcdToDec(tonumber(string.byte(c, 3))), bcdToDec(tonumber(string.byte(c, 4))), bcdToDec(tonumber(string.byte(c, 5))), bcdToDec(tonumber(string.byte(c, 6))), bcdToDec(tonumber(string.byte(c, 7))) end --set time for DS3231 function M.setTime(second, minute, hour, day, date, month, year) i2c.start(id) i2c.address(id, dev_addr, i2c.TRANSMITTER) i2c.write(id, 0x00) i2c.write(id, decToBcd(second)) i2c.write(id, decToBcd(minute)) i2c.write(id, decToBcd(hour)) i2c.write(id, decToBcd(day)) i2c.write(id, decToBcd(date)) i2c.write(id, decToBcd(month)) i2c.write(id, decToBcd(year)) i2c.stop(id) end return M