vibration.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. --[[
  2. @module vibration
  3. @summary 利用加速度传感器da221实现震动触发中断,然后处理逻辑
  4. @version 1.0
  5. @date 2025.08.01
  6. @author 李源龙
  7. @usage
  8. 使用Air8000整机开发板,本示例主要是展示exvib库的使用,提供了三种场景应用:
  9. 1,微小震动检测:用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g;
  10. 2,运动检测:用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g;
  11. 3,跌倒检测:用于人或物体瞬间跌倒时的检测;加速度量程8g;
  12. 在震动检测方面提供了两种模式,有效震动模式和持续震动检测模式:
  13. 持续震动检测模式:震动强度超过设定阈值时,会进入中断处理函数,获取xyz三轴的数据
  14. 有效震动模式:当10秒内触发5次震动强度超过设定阈值时,持续触发震动事件,并执行相应的处理函数,30分钟内只能触发一次,直到30分钟之后,再重新开始检测
  15. ]]
  16. exvib=require("exvib")
  17. local intPin=gpio.WAKEUP2 --中断检测脚,内部固定wakeup2
  18. local tid --获取定时打开的定时器id
  19. local num=0 --计数器
  20. local ticktable={0,0,0,0,0} --存放5次中断的tick值,用于做有效震动对比
  21. local eff=false --有效震动标志位,用于判断是否触发定位
  22. gpio.setup(164, 1, gpio.PULLUP) -- air8000整机板需要大概该电源控制i2c上电 和音频解码芯片共用,自己设计可以忽略掉
  23. gpio.setup(147, 1, gpio.PULLUP) -- air8000整机板需要大概该电源控制i2c上电 camera的供电使能脚,自己设计可以忽略掉
  24. --有效震动模式
  25. --tick计数器,每秒+1用于存放5次中断的tick值,用于做有效震动对比
  26. local function tick()
  27. num=num+1
  28. end
  29. --每秒运行一次计时
  30. sys.timerLoopStart(tick,1000)
  31. --有效震动判断
  32. local function ind()
  33. log.info("int", gpio.get(intPin))
  34. if gpio.get(intPin) == 1 then
  35. --接收数据如果大于5就删掉第一个
  36. if #ticktable>=5 then
  37. log.info("table.remove",table.remove(ticktable,1))
  38. end
  39. --存入新的tick值
  40. table.insert(ticktable,num)
  41. log.info("tick",num,(ticktable[5]-ticktable[1]<10),ticktable[5]>0)
  42. log.info("tick2",ticktable[1],ticktable[2],ticktable[3],ticktable[4],ticktable[5])
  43. --表长度为5且,第5次中断时间间隔减去第一次间隔小于10s,且第5次值为有效值
  44. if #ticktable>=5 and (ticktable[5]-ticktable[1]<10 and ticktable[1]>0) then
  45. log.info("vib", "xxx")
  46. --是否要去触发有效震动逻辑
  47. if eff==false then
  48. sys.publish("EFFECTIVE_VIBRATION")
  49. end
  50. end
  51. end
  52. end
  53. --设置30s分钟之后再判断是否有效震动函数
  54. local function num_cb()
  55. eff=false
  56. end
  57. local function eff_vib()
  58. log.info("触发有效震动")
  59. --触发之后eff设置为true,30分钟之后再触发有效震动
  60. eff=true
  61. --30分钟之后再触发有效震动
  62. sys.timerStart(num_cb,180000)
  63. end
  64. sys.subscribe("EFFECTIVE_VIBRATION",eff_vib)
  65. --持续震动模式
  66. --持续震动模式中断函数
  67. -- local function ind()
  68. -- log.info("int", gpio.get(intPin))
  69. -- --上升沿为触发震动中断
  70. -- if gpio.get(intPin) == 1 then
  71. -- local x,y,z = exvib.read_xyz() --读取x,y,z轴的数据
  72. -- log.info("x", x..'g', "y", y..'g', "z", z..'g')
  73. -- end
  74. -- end
  75. local function vib_fnc()
  76. -- 1,微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g;
  77. -- 2,运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g;
  78. -- 3,跌倒检测,用于人或物体瞬间跌倒时的检测;加速度量程8g;
  79. --打开震动检测功能
  80. exvib.open(1)
  81. --设置gpio防抖100ms
  82. gpio.debounce(intPin, 100)
  83. --设置gpio中断触发方式wakeup2唤醒脚默认为双边沿触发
  84. gpio.setup(intPin, ind)
  85. end
  86. sys.taskInit(vib_fnc)