aircamera.lua 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. local aircamera = {}
  2. require "gc032a"
  3. local airlcd = require "airlcd"
  4. local httpplus = require "httpplus"
  5. local taskName = "SPI_CAMERA"
  6. local TEST_MODE = 0
  7. local scan_pause = true -- 扫码启动与停止标志位
  8. local done_with_close = false -- true 结束后关闭摄像头
  9. local uartid = 1 -- 根据实际设备选取不同的uartid
  10. local cspiId = 1 -- 摄像头使用SPI1、I2C0
  11. local i2cId = 0
  12. local scan_end = ""
  13. local camera_flag = 0
  14. local send_end = ""
  15. local camera_id
  16. local run_state = 0
  17. local camera_capture_flag = 0
  18. -- 初始化UART
  19. local result = uart.setup(uartid, -- 串口id
  20. 115200, -- 波特率
  21. 8, -- 数据位
  22. 1 -- 停止位
  23. )
  24. camera.on(0, "scanned", function(id, str)
  25. if type(str) == 'string' then
  26. log.info("扫码结果", str)
  27. scan_end = str
  28. if TEST_MODE == 1 then
  29. camera.stop(camera_id)
  30. camera.preview(camera_id, false)
  31. TEST_MODE = 0
  32. end
  33. elseif str == false then
  34. log.error("摄像头没有数据")
  35. else
  36. log.info("摄像头数据", str)
  37. sys.publish("capture done", true)
  38. end
  39. end)
  40. local function HTTP_SEND_FILE()
  41. send_end = "照片上传中.."
  42. log.info("准备发送")
  43. local opts = {
  44. url = "http://upload.air32.cn/api/upload/jpg", -- 必选, 目标URL
  45. method = "POST", -- 可选,默认GET, 如果有body,files,forms参数,会设置成POST
  46. headers = {}, -- 可选,自定义的额外header
  47. -- bodyfile="/ram/testcamera.jpg", -- 可选,文件上传,若存在本参数,会强制以multipart/form-data形式上传
  48. body = io.readFile("/ram/testcamera.jpg"),
  49. forms = {}, -- 可选,表单参数,若存在本参数,如果不存在files,按application/x-www-form-urlencoded上传
  50. -- body = "abc=123",-- 可选,自定义body参数, 字符串/zbuff/table均可, 但不能与files和forms同时存在
  51. debug = false, -- 可选,打开调试日志,默认false
  52. try_ipv6 = false, -- 可选,是否优先尝试ipv6地址,默认是false
  53. adapter = nil, -- 可选,网络适配器编号, 默认是自动选
  54. timeout = 30, -- 可选,读取服务器响应的超时时间,单位秒,默认30
  55. -- bodyfile = "/testCamera.jpg" -- 可选,直接把文件内容作为body上传, 优先级高于body参数
  56. }
  57. local code, resp = httpplus.request(opts)
  58. log.info("http", code)
  59. -- 返回值resp的说明
  60. -- 情况1, code >= 100 时, resp会是个table, 包含2个元素
  61. if code >= 100 then
  62. -- headers, 是个table
  63. log.info("http", "headers", json.encode(resp.headers))
  64. -- body, 是个zbuff
  65. -- 通过query函数可以转为lua的string
  66. log.info("http", "headers", resp.body:query())
  67. log.info("发送完了")
  68. send_end = "照片已上传"
  69. -- mobile.flymode(0,true) --进入psm+前进入飞行模式,唤醒后需要主动退出
  70. -- pm.dtimerStart(3, realy_sleep_time) --启动深度休眠定时器
  71. -- pm.power(pm.WORK_MODE,3)
  72. end
  73. end
  74. function aircamera.close()
  75. if camera_id then
  76. camera.close(camera_id)
  77. end
  78. end
  79. local function aircamera_run()
  80. lcd.autoFlush(true)
  81. lcd.close()
  82. camera.preview(camera_id, true) -- 打开LCD预览功能(直接将摄像头数据输出到LCD)
  83. log.info(rtos.meminfo("sys"))
  84. log.info(rtos.meminfo("psram"))
  85. if TEST_MODE == 1 then
  86. log.info("aircamera start scan")
  87. camera.close(camera_id)
  88. log.info("摄像头初始化-扫码")
  89. gpio.setup(153, 1) -- PD拉高
  90. sys.wait(100)
  91. gpio.setup(153, 0) -- PD拉低
  92. sys.wait(500)
  93. camera_id = gc032aInit(cspiId, i2cId, 25500000, 1, 1) -- 最后两个1 ,是默认按照扫码始化
  94. sys.wait(100)
  95. camera.start(camera_id) -- 开始扫码
  96. end
  97. while true do
  98. if TEST_MODE == 0 then
  99. camera.close(camera_id)
  100. break
  101. end
  102. sys.wait(30)
  103. end
  104. end
  105. -- 启动任务时传入依赖
  106. function aircamera.init()
  107. log.info("aircamera_run inint")
  108. gpio.setup(147, 1, gpio.PULLUP) -- camera的供电使能脚
  109. gpio.setup(153, 1, gpio.PULLUP) -- 控制camera电源的pd脚
  110. gpio.setup(24, 1, gpio.PULLUP) -- i2c工作的电压域
  111. gpio.setup(164, 1, gpio.PULLUP) -- air8000 整机开发板因为I2C 和 解码芯片公用,如果不打开,会由于解码芯片对地,造成I2C无法工作
  112. log.info("摄像头初始化")
  113. gpio.setup(153, 0) -- PD拉低
  114. sys.wait(500)
  115. camera_id = gc032aInit(cspiId, i2cId, 25500000, 0, 0) -- 最后两个0 ,是默认按照拍照初始化
  116. end
  117. local function aircamera_ui()
  118. -- lcd.clear()
  119. if TEST_MODE ==0 then
  120. lcd.clear(_G.bkcolor)
  121. lcd.autoFlush(false)
  122. lcd.setFont(lcd.font_opposansm12_chinese) -- 具体取值可参考api文档的常量表
  123. lcd.drawStr(0,80,"本demo 展示摄像头拍照应用,请点击下面的按钮进行功能展示")
  124. lcd.showImage(120,100,"/luadb/next.jpg")
  125. lcd.drawStr(0,180,"点击上方按钮将对二维码,一维码进行扫描")
  126. lcd.drawStr(0,200,"扫描成功后,自动退出,并显示在下方")
  127. lcd.drawStr(80,220,scan_end)
  128. lcd.showImage(120,240,"/luadb/next.jpg")
  129. lcd.drawStr(0,320,"点击上方按钮将进行拍照,点击屏幕后,会将照片上传,并可以在:")
  130. lcd.drawStr(0,340,"https://www.air32.cn/upload/data/这里看到你拍的照片"..send_end)
  131. lcd.drawStr(0,365,send_end)
  132. lcd.showImage(120,360,"/luadb/back.jpg")
  133. lcd.drawStr(100,440,"点击上方按钮将返回主界面")
  134. lcd.flush()
  135. elseif TEST_MODE == 1 or TEST_MODE == 2 then
  136. aircamera.init()
  137. aircamera_run()
  138. elseif TEST_MODE == 3 then
  139. aircamera.close()
  140. gpio.setup(147, 0) -- camera的供电使能脚
  141. TEST_MODE = 0
  142. return true
  143. end
  144. return false
  145. end
  146. function aircamera.run()
  147. log.info("aircamera.run")
  148. while true do
  149. if aircamera_ui() then
  150. return true
  151. end
  152. sys.wait(30)
  153. end
  154. end
  155. function send_file_task()
  156. if camera_capture_flag == 0 then
  157. log.info("aircamera send_file_task1")
  158. camera_capture_flag = 1
  159. log.info("摄像头初始化-拍照")
  160. camera.close(camera_id)
  161. gpio.setup(153, 1) -- PD拉高
  162. sys.wait(100)
  163. gpio.setup(153, 0) -- PD拉低
  164. sys.wait(500)
  165. camera_id = gc032aInit(cspiId, i2cId, 25500000, 0, 0) -- 最后两个1 ,是默认按照扫码始化
  166. sys.wait(100)
  167. local res= camera.capture(camera_id, "/ram/testcamera.jpg", 95)
  168. log.info("aircamera send_file_task1 res",res)
  169. sys.waitUntil("capture done", 30000)
  170. camera.preview(camera_id, false)
  171. TEST_MODE = 0
  172. camera_capture_flag = 0
  173. HTTP_SEND_FILE()
  174. end
  175. end
  176. function aircamera.tp_handal(x,y,event) -- 判断是否需要停止播放
  177. if TEST_MODE == 0 then
  178. if x > 120 and x < 200 and y > 100 and y < 180 then
  179. TEST_MODE = 1
  180. elseif x > 120 and x < 200 and y > 240 and y < 320 then
  181. TEST_MODE = 2
  182. elseif x > 120 and x < 200 and y > 360 and y < 440 then
  183. TEST_MODE = 3
  184. end
  185. elseif TEST_MODE == 2 then
  186. sys.taskInit(send_file_task, "send_file_task")
  187. end
  188. end
  189. return aircamera