ds3231.lua 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. --------------------------------------------------------------------------------
  2. -- DS3231 I2C module for NODEMCU
  3. -- NODEMCU TEAM
  4. -- LICENCE: http://opensource.org/licenses/MIT
  5. -- Tobie Booth <tbooth@hindbra.in>
  6. --------------------------------------------------------------------------------
  7. require("bit")
  8. require("i2c")
  9. local moduleName = ...
  10. local M = {}
  11. _G[moduleName] = M
  12. -- Constants:
  13. M.EVERYSECOND = 6
  14. M.EVERYMINUTE = 7
  15. M.SECOND = 1
  16. M.MINUTE = 2
  17. M.HOUR = 3
  18. M.DAY = 4
  19. M.DATE = 5
  20. M.DISABLE = 0
  21. -- Default value for i2c communication
  22. local id = 0
  23. --device address
  24. local dev_addr = 0x68
  25. local function decToBcd(val)
  26. if val == nil then return 0 end
  27. return((((val/10) - ((val/10)%1)) *16) + (val%10))
  28. end
  29. local function bcdToDec(val)
  30. return((((val/16) - ((val/16)%1)) *10) + (val%16))
  31. end
  32. local function addAlarmBit(val,day)
  33. if day == 1 then return bit.bor(val,64) end
  34. return bit.bor(val,128)
  35. end
  36. --get time from DS3231
  37. function M.getTime()
  38. i2c.start(id)
  39. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  40. i2c.write(id, 0x00)
  41. i2c.stop(id)
  42. i2c.start(id)
  43. i2c.address(id, dev_addr, i2c.RECEIVER)
  44. local c=i2c.read(id, 7)
  45. i2c.stop(id)
  46. return bcdToDec(tonumber(string.byte(c, 1))),
  47. bcdToDec(tonumber(string.byte(c, 2))),
  48. bcdToDec(tonumber(string.byte(c, 3))),
  49. bcdToDec(tonumber(string.byte(c, 4))),
  50. bcdToDec(tonumber(string.byte(c, 5))),
  51. bcdToDec(tonumber(string.byte(c, 6))),
  52. bcdToDec(tonumber(string.byte(c, 7)))
  53. end
  54. --set time for DS3231
  55. -- enosc setted to 1 disables oscilation on battery, stopping time
  56. function M.setTime(second, minute, hour, day, date, month, year, disOsc)
  57. i2c.start(id)
  58. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  59. i2c.write(id, 0x00)
  60. i2c.write(id, decToBcd(second))
  61. i2c.write(id, decToBcd(minute))
  62. i2c.write(id, decToBcd(hour))
  63. i2c.write(id, decToBcd(day))
  64. i2c.write(id, decToBcd(date))
  65. i2c.write(id, decToBcd(month))
  66. i2c.write(id, decToBcd(year))
  67. i2c.stop(id)
  68. i2c.start(id)
  69. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  70. i2c.write(id, 0x0E)
  71. i2c.stop(id)
  72. i2c.start(id)
  73. i2c.address(id, dev_addr, i2c.RECEIVER)
  74. local c = string.byte(i2c.read(id, 1), 1)
  75. i2c.stop(id)
  76. if disOsc == 1 then c = bit.bor(c,128)
  77. else c = bit.band(c,127) end
  78. i2c.start(id)
  79. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  80. i2c.write(id, 0x0E)
  81. i2c.write(id, c)
  82. i2c.stop(id)
  83. end
  84. -- Reset alarmId flag to let alarm to be triggered again
  85. function M.reloadAlarms ()
  86. if bit == nil or bit.band == nil or bit.bor == nil then
  87. print("[ERROR] Module bit is required to use alarm function")
  88. return nil
  89. end
  90. i2c.start(id)
  91. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  92. i2c.write(id, 0x0F)
  93. i2c.stop(id)
  94. i2c.start(id)
  95. i2c.address(id, dev_addr, i2c.RECEIVER)
  96. local d = string.byte(i2c.read(id, 1), 1)
  97. i2c.stop(id)
  98. -- Both flag needs to be 0 to let alarms trigger
  99. d = bit.band(d,252)
  100. i2c.start(id)
  101. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  102. i2c.write(id, 0x0F)
  103. i2c.write(id, d)
  104. i2c.stop(id)
  105. print('[LOG] Alarms reloaded')
  106. end
  107. -- Enable alarmId bit. Let it to be triggered
  108. function M.enableAlarm (almId)
  109. if bit == nil or bit.band == nil or bit.bor == nil then
  110. print("[ERROR] Module bit is required to use alarm function")
  111. return nil
  112. end
  113. if almId ~= 1 and almId ~= 2 then print('[ERROR] Wrong alarm id (1 or 2): '..almId) return end
  114. i2c.start(id)
  115. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  116. i2c.write(id, 0x0E)
  117. i2c.stop(id)
  118. i2c.start(id)
  119. i2c.address(id, dev_addr, i2c.RECEIVER)
  120. local c = string.byte(i2c.read(id, 1), 1)
  121. i2c.stop(id)
  122. c = bit.bor(c,4)
  123. if almId == 1 then c = bit.bor(c,1)
  124. else c = bit.bor(c,2) end
  125. i2c.start(id)
  126. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  127. i2c.write(id, 0x0E)
  128. i2c.write(id, c)
  129. i2c.stop(id)
  130. M.reloadAlarms()
  131. print('[LOG] Alarm '..almId..' enabled')
  132. end
  133. -- If almID equals 1 or 2 disable that alarm, otherwise disables both.
  134. function M.disableAlarm (almId)
  135. if bit == nil or bit.band == nil or bit.bor == nil then
  136. print("[ERROR] Module bit is required to use alarm function")
  137. return nil
  138. end
  139. i2c.start(id)
  140. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  141. i2c.write(id, 0x0E)
  142. i2c.stop(id)
  143. i2c.start(id)
  144. i2c.address(id, dev_addr, i2c.RECEIVER)
  145. local c = string.byte(i2c.read(id, 1), 1)
  146. i2c.stop(id)
  147. if almId == 1 then c = bit.band(c, 254)
  148. elseif almId == 2 then c = bit.band(c, 253)
  149. else
  150. almId = '1 and 2'
  151. c = bit.band(c, 252)
  152. end
  153. i2c.start(id)
  154. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  155. i2c.write(id, 0x0E)
  156. i2c.write(id, c)
  157. i2c.stop(id)
  158. print('[LOG] Alarm '..almId..' disabled')
  159. end
  160. -- almId can be 1 or 2;
  161. -- almType should be taken from constants
  162. function M.setAlarm (almId, almType, second, minute, hour, date)
  163. if bit == nil or bit.band == nil or bit.bor == nil then
  164. print("[ERROR] Module bit is required to use alarm function")
  165. return nil
  166. end
  167. if almId ~= 1 and almId ~= 2 then print('[ERROR] Wrong alarm id (1 or 2): '..almId) return end
  168. M.enableAlarm(almId)
  169. second = decToBcd(second)
  170. minute = decToBcd(minute)
  171. hour = decToBcd(hour)
  172. date = decToBcd(date)
  173. if almType == M.EVERYSECOND or almType == M.EVERYMINUTE then
  174. second = addAlarmBit(second)
  175. minute = addAlarmBit(minute)
  176. hour = addAlarmBit(hour)
  177. date = addAlarmBit(date)
  178. elseif almType == M.SECOND then
  179. minute = addAlarmBit(minute)
  180. hour = addAlarmBit(hour)
  181. date = addAlarmBit(date)
  182. elseif almType == M.MINUTE then
  183. hour = addAlarmBit(hour)
  184. date = addAlarmBit(date)
  185. elseif almType == M.HOUR then
  186. date = addAlarmBit(date)
  187. elseif almType == M.DAY then
  188. date = addAlarmBit(date,1)
  189. end
  190. local almStart = 0x07
  191. if almId == 2 then almStart = 0x0B end
  192. i2c.start(id)
  193. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  194. i2c.write(id, almStart)
  195. if almId == 1 then i2c.write(id, second) end
  196. i2c.write(id, minute)
  197. i2c.write(id, hour)
  198. i2c.write(id, date)
  199. i2c.stop(id)
  200. print('[LOG] Alarm '..almId..' setted')
  201. end
  202. -- Get Control and Status bytes
  203. function M.getBytes ()
  204. i2c.start(id)
  205. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  206. i2c.write(id, 0x0E)
  207. i2c.stop(id)
  208. i2c.start(id)
  209. i2c.address(id, dev_addr, i2c.RECEIVER)
  210. local c = i2c.read(id, 2)
  211. i2c.stop(id)
  212. return tonumber(string.byte(c, 1)), tonumber(string.byte(c, 2))
  213. end
  214. -- Resetting RTC Stop Flag
  215. function M.resetStopFlag ()
  216. if bit == nil or bit.band == nil or bit.bor == nil then
  217. print("[ERROR] Module bit is required to reset stop flag")
  218. return nil
  219. end
  220. i2c.start(id)
  221. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  222. i2c.write(id, 0x0F)
  223. i2c.stop(id)
  224. i2c.start(id)
  225. i2c.address(id, dev_addr, i2c.RECEIVER)
  226. local s = string.byte(i2c.read(id, 1))
  227. i2c.stop(id)
  228. s = bit.band(s,127)
  229. i2c.start(id)
  230. i2c.address(id, dev_addr, i2c.TRANSMITTER)
  231. i2c.write(id, 0x0F)
  232. i2c.write(id, s)
  233. i2c.stop(id)
  234. print('[LOG] RTC stop flag resetted')
  235. end
  236. return M