main.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. -- 本demo适合Air101/Air103
  3. PROJECT = "nimbledemo"
  4. VERSION = "1.0.0"
  5. log.info("main", PROJECT, VERSION)
  6. -- 一定要添加sys.lua !!!!
  7. sys = require("sys")
  8. --添加硬狗防止程序卡死
  9. if wdt then
  10. wdt.init(15000)--初始化watchdog设置为15s
  11. sys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗
  12. else
  13. log.warn("wdt", "not wdt found!!!")
  14. end
  15. leds = {}
  16. if rtos.bsp():lower() == "air101" then -- 与w800/805等价
  17. leds["a"] = gpio.setup(pin.PB08, 0, gpio.PULLUP) -- PB_08,输出模式
  18. leds["b"] = gpio.setup(pin.PB09, 0, gpio.PULLUP) -- PB_09,输出模式
  19. leds["c"] = gpio.setup(pin.PB10, 0, gpio.PULLUP) -- PB_10,输出模式
  20. elseif rtos.bsp():lower() == "air103" then -- 与w806等价
  21. leds["a"] = gpio.setup(pin.PB24, 0, gpio.PULLUP) -- PB_24,输出模式
  22. leds["b"] = gpio.setup(pin.PB25, 0, gpio.PULLUP) -- PB_25,输出模式
  23. leds["c"] = gpio.setup(pin.PB26, 0, gpio.PULLUP) -- PB_26,输出模式
  24. else
  25. log.info("gpio", "pls add gpio.setup for you board")
  26. end
  27. local count = true
  28. local function led_bulingbuling()
  29. leds["a"](count == true and 1 or 0)
  30. leds["b"](count == true and 1 or 0)
  31. leds["c"](count == true and 1 or 0)
  32. count = not count
  33. nimble.send_msg(1, 0, "led_bulingbuling")
  34. end
  35. local bulingbuling = sys.timerLoopStart(led_bulingbuling, 1000)
  36. if lcd then
  37. spi_lcd = spi.deviceSetup(0,20,0,0,8,20*1000*1000,spi.MSB,1,1)
  38. lcd.setColor(0x0000,0xFFFF)
  39. log.info("lcd.init",
  40. lcd.init("st7735s",{port = "device",pin_dc = 17, pin_pwr = 7,pin_rst = 19,direction = 2,w = 160,h = 80,xoffset = 1,yoffset = 26},spi_lcd))
  41. lcd.clear()
  42. lcd.setFont(lcd.font_opposansm12_chinese)
  43. lcd.drawStr(30,15,"nimbledemo",0X07FF)
  44. lcd.drawStr(50,35,"监听中",0x001F)
  45. else
  46. log.info("lcd", "lcd not found, display is off")
  47. end
  48. gpio.setup(pin.PA00, function(val) print("PA0 R",val) if lcd then lcd.fill(0,40,160,80) if val == 0 then lcd.drawStr(50,60,"R down",0x07E0) end end end, gpio.PULLUP)
  49. gpio.setup(pin.PA07, function(val) print("PA7 U",val) if lcd then lcd.fill(0,40,160,80) if val == 0 then lcd.drawStr(50,60,"U down",0x07E0) end end end, gpio.PULLUP)
  50. gpio.setup(pin.PA04, function(val) print("PA4 C",val) if lcd then lcd.fill(0,40,160,80) if val == 0 then lcd.drawStr(50,60,"C down",0x07E0) end end end, gpio.PULLUP)
  51. gpio.setup(pin.PA01, function(val) print("PA1 L",val) if lcd then lcd.fill(0,40,160,80) if val == 0 then lcd.drawStr(50,60,"L down",0x07E0) end end end, gpio.PULLUP)
  52. gpio.setup(pin.PB11, function(val) print("PB11 D",val) if lcd then lcd.fill(0,40,160,80) if val == 0 then lcd.drawStr(50,60,"D down",0x07E0) end end end, gpio.PULLUP)
  53. function decodeURI(s)
  54. s = string.gsub(s, '%%(%x%x)', function(h) return string.char(tonumber(h, 16)) end)
  55. return s
  56. end
  57. -- 注册一个命令列表
  58. cmds = {
  59. -- 控制led的命令
  60. led = function(id, val)
  61. local led = leds[id]
  62. if led then
  63. led(val == "on" and 1 or 0)
  64. end
  65. end,
  66. -- 重启板子的命令
  67. reboot = function()
  68. sys.taskInit(function()
  69. log.info("ble", "cmd reboot, after 5s")
  70. sys.wait(5000)
  71. rtos.reboot()
  72. end)
  73. end,
  74. -- 显示屏输出内容的命令
  75. display = function(text)
  76. lcd.fill(0, 20, 160, 36)
  77. lcd.drawStr(50 , 35, decodeURI(text) ,0x001F)
  78. end,
  79. }
  80. -- 监听BLE主适配的状态变化,需要nimble库
  81. if nimble then
  82. -- BLE初始化成功或失败会产生该事件
  83. sys.subscribe("BLE_STATE_INC", function(state)
  84. log.info("ble", "ble state changed", state)
  85. if state == 1 then
  86. nimble.server_init()
  87. else
  88. nimble.server_deinit()
  89. end
  90. end)
  91. -- 监听GATT服务器的WRITE_CHR事件
  92. sys.subscribe("BLE_GATT_WRITE_CHR", function(info, data)
  93. sys.timerStop(bulingbuling)
  94. -- info 是个table, 但当前没有数据
  95. log.info("ble", "data got!!", data:toHex())
  96. if data:len() == 0 then
  97. return
  98. end
  99. -- led,a,on 对应hex值 6c65642c612c6f6e
  100. -- led,b,on 对应hex值 6c65642c622c6f6e
  101. -- led,c,on 对应hex值 6c65642c632c6f6e
  102. -- led,a,off 对应 6c65642c612c6f6666
  103. -- led,b,off 对应 6c65642c622c6f6666
  104. -- led,c,off 对应 6c65642c632c6f6666
  105. -- display,xxx 对应 646973706C6179xxx, 支持中文
  106. local cmd = data:split(",")
  107. if cmd[1] and cmds[cmd[1]] then
  108. cmds[cmd[1]](table.unpack(cmd, 2))
  109. else
  110. log.info("ble", "unkown cmd", json.encode(cmd))
  111. end
  112. end)
  113. -- TODO 支持传数据(read)和推送数据(notify)
  114. -- 配合微信小程序 "LuatOS蓝牙调试"
  115. -- 1. 若开发板无天线, 将手机尽量靠近芯片也能搜到
  116. -- 2. 该小程序是开源的, 每次write会自动分包
  117. -- https://gitee.com/openLuat/luatos-miniapps
  118. sys.taskInit(function()
  119. sys.wait(2000) -- 为了能看到日志,休眠2秒
  120. nimble.debug(6) -- 开启日志
  121. nimble.init() -- 初始化nimble, 会产生事件BLE_STATE_INC
  122. end)
  123. else
  124. -- 没有nimble, 那就闪灯吧
  125. log.info("gpio", "no nimble, just leds")
  126. end
  127. -- 用户代码已结束---------------------------------------------
  128. -- 结尾总是这一句
  129. sys.run()
  130. -- sys.run()之后后面不要加任何语句!!!!!