main.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "einkdemo"
  3. VERSION = "1.0.0"
  4. -- sys库是标配
  5. _G.sys = require("sys")
  6. --[[
  7. 本DEMO需要V0005或2020-12-14及之后的源码才支持
  8. ]]
  9. --[[
  10. 显示屏为佳显 1.54寸,200x200,快刷屏
  11. 硬件接线
  12. 显示屏SPI --> Air302 SPI
  13. 显示屏 Pin_BUSY (GPIO18)
  14. 显示屏 Pin_RES (GPIO7)
  15. 显示屏 Pin_DC (GPIO9)
  16. 显示屏 Pin_CS (GPIO16)
  17. ]]
  18. _G.pm_sleep_sec = 3600
  19. --//-----------------------------------------------------
  20. -- 非预期唤醒监测函数, TODO 在固件内实现
  21. -- 如需使用ctiot, 那么lpmem的前1800字节将被ctiot使用, 请把偏移量往后移动
  22. function pm_enter_hib_mode(sec)
  23. lpmem.write(512, pack.pack(">HI", 0x5AA5, os.time()))
  24. pm.dtimerStart(0, sec*1000)
  25. pm.request(pm.HIB)
  26. log.info("pm check",pm.check())
  27. sys.wait(300*1000)
  28. end
  29. function pm_wakeup_time_check ()
  30. log.info("pm", pm.lastReson())
  31. if pm.lastReson() == 1 then
  32. local tdata = lpmem.read(512, 6) -- 0x5A 0xA5, 然后一个32bit的int
  33. local _, mark, tsleep = pack.unpack(tdata, ">HI")
  34. if mark == 0x5AA5 then
  35. local tnow = os.time()
  36. log.info("pm", "sleep time", tsleep, tnow)
  37. --下面的3600S根据休眠时间设置,最大可以设置休眠时间-12S。
  38. if tnow - tsleep < (pm_sleep_sec - 12) then
  39. pm.request(pm.HIB) -- 建议休眠
  40. return -- 是提前唤醒, 继续睡吧
  41. end
  42. end
  43. end
  44. return true
  45. end
  46. --//----------------------------------------------------------------
  47. function eink154_update()
  48. -- 访问天气服务,稍后开放设备位置的设置
  49. http.get("http://www.luatos.com/api/public/weather?imei=" .. nbiot.imei(), {timeout = 5000}, function(code,headers,data)
  50. log.info("http show", code, data)
  51. if data then
  52. objnow = json.decode(data)
  53. end
  54. sys.publish("HTTP_OK")
  55. end)
  56. sys.waitUntil("HTTP_OK", 6000)
  57. -- 获取失败,就不更新了
  58. if not objnow then return end
  59. -- 读取本地时间, 接了SHT30
  60. i2c.setup(0)
  61. local re, H, T = i2c.readSHT30(0)
  62. if re then
  63. log.info("sht30", H, T)
  64. end
  65. i2c.close(0)
  66. -- 设置视窗大小
  67. eink.setWin(200, 200, 0)
  68. -- 获取电池电量
  69. adc.open(1)
  70. local _, bat = adc.read(1)
  71. adc.close(1)
  72. log.debug("Bat:", bat+0)
  73. -- 显示标题Title
  74. eink.bat(170, 2, tonumber(bat))
  75. eink.print(0, 2, objnow.cityEn, 0, 12)
  76. eink.print(70, 2, objnow.date, 0, 12)
  77. -- 今天 天气
  78. eink.weather_icon(10, 20, 100, objnow.wea_img)
  79. eink.print(60, 30, objnow.tem .. "C", 0, 24)
  80. eink.print(60, 55, objnow.tem2 .. "C~" .. objnow.tem1 .. "C", 0, 12)
  81. -- 刷新时间
  82. local t = os.date("%H:%M")
  83. eink.print(100, 45, t, 12)
  84. -- 室内温湿度
  85. eink.print(40, 85, tostring(T) .. "C/".. tostring(H) .."%", 0, 24)
  86. -- 明天 天气
  87. local str = objnow.data[1].date
  88. str = string.sub(str,6,string.len(str))
  89. eink.print(15, 130, str, 0, 12)
  90. eink.weather_icon(10, 140, 101, objnow.data[1].wea_img)
  91. eink.print(10, 188, objnow.data[1].tem2 .. "C~" .. objnow.data[1].tem1 .. "C", 0, 12)
  92. -- 后天 天气
  93. str = objnow.data[2].date
  94. str = string.sub(str,6,string.len(str))
  95. eink.print(80, 130, str, 0, 12)
  96. eink.weather_icon(75, 140, 102, objnow.data[2].wea_img)
  97. eink.print(75, 188, objnow.data[2].tem2 .. "C~" .. objnow.data[2].tem1 .. "C", 0, 12)
  98. -- 大后天 天气
  99. str = objnow.data[3].date
  100. str = string.sub(str,6,string.len(str))
  101. eink.print(145, 130, str, 0, 12)
  102. eink.weather_icon(140, 140, 103, objnow.data[3].wea_img)
  103. eink.print(140, 188, objnow.data[3].tem2 .. "C~" .. objnow.data[3].tem1 .. "C", 0, 12)
  104. -- 刷屏幕
  105. eink.show()
  106. end
  107. sys.taskInit(function()
  108. -- 先检查是否为想要的唤醒
  109. if not pm_wakeup_time_check() then
  110. sys.wait(10*60*1000)
  111. end
  112. if not socket.isReady() then
  113. while not socket.isReady() do
  114. sys.waitUntil("NET_READY", 1000)
  115. log.info("wait net ready")
  116. end
  117. end
  118. -- 初始化必要的参数
  119. log.info("eink", "begin setup")
  120. eink.setup(1, 0)
  121. log.info("eink", "end setup")
  122. -- 稍微等一会,免得墨水屏没初始化完成
  123. sys.wait(1000)
  124. while 1 do
  125. log.info("e-paper 1.54", "Testing Go\r\n")
  126. eink154_update()
  127. log.info("e-paper 1.54", "Testing End\r\n")
  128. sys.wait(500) -- 稍微等一会
  129. pm_enter_hib_mode(pm_sleep_sec) -- 一小时一次够了吧
  130. --sys.wait(300000)
  131. end
  132. end)
  133. sys.run()