camera780epm.lua 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. -- 实际使用时选1个就行
  2. -- require "bf30a2"
  3. require "gc032a"
  4. -- require "gc0310"
  5. httpplus = require "httpplus"
  6. gpio.setup(2, 1) -- GPIO2打开给camera电源供电
  7. gpio.setup(28, 1) -- 1.2版本 GPIO28打开给lcd电源供电
  8. gpio.setup(29, 1) -- 1.3版本 GPIO29打开给lcd电源供电
  9. local sleep_time = 1
  10. local period = 60*60*1000
  11. local realy_sleep_time = sleep_time*period
  12. gpio.setup(14, nil)
  13. gpio.setup(15, nil)
  14. local reason, slp_state = pm.lastReson() --获取唤醒原因
  15. log.info("wakeup state", pm.lastReson())
  16. if slp_state > 0 then
  17. mobile.flymode(0,false) -- 退出飞行模式,进入psm+前进入飞行模式,唤醒后需要主动退出
  18. end
  19. camera.on(0, "scanned", function(id, str)
  20. if type(str) == 'string' then
  21. log.info("扫码结果", str)
  22. elseif str == false then
  23. log.error("摄像头没有数据")
  24. else
  25. log.info("摄像头数据", str)
  26. sys.publish("capture done", true)
  27. end
  28. end)
  29. ------------------------------------
  30. ------------ 初始化 LCD ------------
  31. ------------------------------------
  32. -- 根据不同的BSP返回不同的值
  33. -- spi_id,pin_reset,pin_dc,pin_cs,bl
  34. local function lcd_pin()
  35. local rtos_bsp = rtos.bsp()
  36. if string.find(rtos_bsp,"780EPM") then
  37. return lcd.HWID_0, 36, 0xff, 0xff, 0xff -- 注意:EC718P有硬件lcd驱动接口, 无需使用spi,当然spi驱动也支持
  38. else
  39. log.info("main", "没找到合适的cat.1芯片",rtos_bsp)
  40. return
  41. end
  42. end
  43. local spi_id, pin_reset, pin_dc, pin_cs, bl = lcd_pin()
  44. if spi_id ~= lcd.HWID_0 then
  45. spi_lcd = spi.deviceSetup(spi_id, pin_cs, 0, 0, 8, 20 * 1000 * 1000, spi.MSB, 1, 0)
  46. port = "device"
  47. else
  48. port = spi_id
  49. end
  50. lcd.init("st7796", {
  51. port = port,
  52. pin_dc = pin_dc,
  53. pin_pwr = bl,
  54. pin_rst = pin_reset,
  55. direction = 0,
  56. -- direction0 = 0x00,
  57. w = 320,
  58. h = 480,
  59. xoffset = 0,
  60. yoffset = 0,
  61. sleepcmd = 0x10,
  62. wakecmd = 0x11,
  63. })
  64. -- 将拍好的照片发送到HTTP服务器里保存,
  65. -- 当前测试服务器可以在https://www.air32.cn/upload/data/这里看到你拍的照片
  66. local function HTTP_SEND_FILE()
  67. local opts = {
  68. url = "http://upload.air32.cn/api/upload/jpg", -- 必选, 目标URL
  69. method = "POST", -- 可选,默认GET, 如果有body,files,forms参数,会设置成POST
  70. headers = {}, -- 可选,自定义的额外header
  71. -- files = {file= "/ram/abc.jpg"}, -- 可选,文件上传,若存在本参数,会强制以multipart/form-data形式上传
  72. forms = {}, -- 可选,表单参数,若存在本参数,如果不存在files,按application/x-www-form-urlencoded上传
  73. -- body = "abc=123",-- 可选,自定义body参数, 字符串/zbuff/table均可, 但不能与files和forms同时存在
  74. debug = false, -- 可选,打开调试日志,默认false
  75. try_ipv6 = false, -- 可选,是否优先尝试ipv6地址,默认是false
  76. adapter = nil, -- 可选,网络适配器编号, 默认是自动选
  77. timeout = 30, -- 可选,读取服务器响应的超时时间,单位秒,默认30
  78. bodyfile = "/ram/abc.jpg" -- 可选,直接把文件内容作为body上传, 优先级高于body参数
  79. }
  80. local code, resp = httpplus.request(opts)
  81. log.info("http", code)
  82. -- 返回值resp的说明
  83. -- 情况1, code >= 100 时, resp会是个table, 包含2个元素
  84. if code >= 100 then
  85. -- headers, 是个table
  86. log.info("http", "headers", json.encode(resp.headers))
  87. -- body, 是个zbuff
  88. -- 通过query函数可以转为lua的string
  89. log.info("http", "headers", resp.body:query())
  90. log.info("发送完了,进PSM+吧")
  91. -- mobile.flymode(0,true) --进入psm+前进入飞行模式,唤醒后需要主动退出
  92. -- pm.dtimerStart(3, realy_sleep_time) --启动深度休眠定时器
  93. -- pm.power(pm.WORK_MODE,3)
  94. end
  95. end
  96. sys.taskInit(function()
  97. sys.wait(5000)
  98. log.info("摄像头启动")
  99. -- spi的id和摄像头的id
  100. local cspiId, i2cId = 1, 1
  101. local camera_id
  102. -- 配置iic
  103. i2c.setup(i2cId, i2c.FAST)
  104. gpio.setup(5, 0) -- PD拉低
  105. camera_id = gc032aInit(cspiId, i2cId, 24000000, SCAN_MODE, SCAN_MODE)
  106. camera.stop(camera_id)
  107. camera.preview(camera_id, true)--摄像头预览打开
  108. log.debug("摄像头拍照")
  109. -- 同名照片会被覆盖,所以这里拍照完保存在文件系统中的照片不用删除,
  110. -- 但是如果你的照片名字是按一定规律排序的,一定记得删除
  111. -- 后面的参数是照片质量,如果感觉默认的1质量不太好,可以换成2或者3
  112. -- 但是,2和3需要非常多非常多的psram,能不用还是不用
  113. camera.capture(camera_id, "/ram/abc.jpg", 1)
  114. result, data = sys.waitUntil("capture done", 30000)
  115. -- camera.close(camera_id) --完全关闭摄像头才用这个
  116. camera.stop(camera_id) --如果没有低功耗需求,就打开本句,屏蔽上面这句
  117. HTTP_SEND_FILE()
  118. end)