摇一摇
教学目标及方法
调用手机加速度传感器,摇一摇控制一盏灯
主要内容

建立项目

建立一个新的文件夹,项目目录选择该文件。将第二堂课文件拷贝到现在的文件夹,项目配置文件project.config.json除外。

如何获取摇动状态

查了小程序API后发现有加速度传感器,知道加速度就可以知道摇动情况了。这里采用比较速
度的办法来判断是否摇动,一定时间内加速度的变化为速度。

小程序代码实现

点击按钮开始,开始检测摇动状态,判断速度变化超过一定范围认为触发摇动,,从而控制灯依次开关。

WXML文件

修改名称即可
<view class='title'>
  <text>mCookie-BLE摇一摇开灯</text>
  <view class="line"></view>
</view>
<view class='image-H'>
  <image class='userinfo-avatar' src='../bleLED/snm.jpg'></image>
</view>
<view>
  <button class='weui-btn' hover-class='other-button-hover' bindtap='sendData'>开始</button>
</view>

WXSS文件

不用变动
.title {
  color: #731496;
  text-align: center;
  margin-top: 20px;
}

.line {
  margin-top: 20px;
  width: 100%;
  height: 1rpx;
  background: #731496;
}

.image-H {
  text-align: center;
  margin-top: 110px;
}

.userinfo-avatar {
  width: 166rpx;
  height: 166rpx;
  margin: 20rpx;
  border-radius: 50%;
}

.weui-btn {
  margin-top: 128px;
  width: 156rpx;
  height: 156rpx;
  border-radius: 50px;
  padding-top: 15px;
  text-align: center;
  background-color: #8d1cb7;
  color: #fff;
}

.other-button-hover {
  background-color: #731496;
}

js逻辑实现

完整代码:
import bleComm from '../utils/bleComm.js';
var msg;
var lastTime = 0;//此变量用来记录上次摇动的时间

Page({
  onUnload: function () {
    bleComm.disConnect();
  },
  onHide: function () {
    bleComm.disConnect();
  },

  onLoad: function (options) {
    wx.showLoading({
      title: '靠近连接',
      mask: true
    })
    bleComm.connectDevice().then(res => {
      wx.showToast({
        title: '蓝牙连接成功',
        icon: 'success',
        duration: 300
      })
    });
  },

  sendData: function () {
    msg = !msg; //状态切换一次,用于开关灯
    var x = 0,
      y = 0,
      z = 0,
      lastX = 0,
      lastY = 0,
      lastZ = 0;//此组变量分别记录对应x、y、z三轴的数值和上次的数值
    wx.onAccelerometerChange(function (acceleration) {
      var nowTime = new Date().getTime();//记录当前时间,单位毫秒
      //如果这次摇的时间距离上次摇的时间有一定间隔 才执行
      if (nowTime - lastTime > 100) {
        var diffTime = nowTime - lastTime;//记录时间段
        lastTime = nowTime;//记录本次摇动时间,为下次计算摇动时间做准备
        x = acceleration.x;//获取x轴数值
        y = acceleration.y;//获取y轴数值
        z = acceleration.z;//获取z轴数值
        //加速度运行一定时间,即为我们想要的速度 v=at
        var speed = Math.abs(x + y + z - lastX - lastY - lastZ) * 10 * 1000 / diffTime;
        console.log(speed)//调试结果
        lastX = x;//赋值,为下一次计算做准备
        lastY = y;//赋值,为下一次计算做准备
        lastZ = z;//赋值,为下一次计算做准备
        if (speed > 110) {//如果计算出来的速度超过了阈值,就算作成功摇一摇
          console.log(msg)
          if (msg)
            bleComm.writeValue('1');//蓝牙发送指令
          else
            bleComm.writeValue('0');//蓝牙发送指令
          wx.stopAccelerometer(); //停止获取加速度
          wx.vibrateLong();//手机震动
          wx.showToast({   //弹框提示
            title: '摇一摇OK',
            icon: 'success',
            duration: 500, //持续时间500毫秒
          })
        }
        else {
          wx.hideToast();//隐藏弹框
        }
      }
    })
  },
})
1.变量存储
msg存储灯的开关状态。x,y,z存储对应轴的加速度,lastX,lastY,lastZ存储超时最后一刻的加速度。
msg = !msg; //状态切换一次,用于开关灯
    var x = 0,
      y = 0,
      z = 0,
      lastX = 0,
      lastY = 0,
      lastZ = 0;//此组变量分别记录对应x、y、z三轴的数值和上次的数值
2.定时获取加速度
每隔100毫米时间获取一次加速度,记录在变量x,y,z中。
wx.onAccelerometerChange(function (acceleration) {
  var nowTime = new Date().getTime();//记录当前时间,单位毫秒
  //如果这次摇的时间距离上次摇的时间有一定间隔 才执行
  if (nowTime - lastTime > 100) {
    var diffTime = nowTime - lastTime;//记录时间段
    lastTime = nowTime;//记录本次摇动时间,为下次计算摇动时间做准备
    x = acceleration.x;//获取x轴数值
    y = acceleration.y;//获取y轴数值
    z = acceleration.z;//获取z轴数值
  }
})
加速度详细参考:
3.通过加速度计算速度
速度=加速度变化*时间。加速度可以变小,变化可能是个负数,因此通过Math.abs()取绝对值
得到正数。时间以毫秒计时,将时间转化秒:1000 / diffTime,利于比较。
var speed = Math.abs(x + y + z - lastX - lastY - lastZ) * 10 * 1000 / diffTime;
console.log(speed)//调试结果

4.根据速度值判断是否摇动
认为摇动了则发送开关灯指令,并且弹框及手机震动提示。110参数可以根据自身需求调整。
if (speed > 110) {//如果计算出来的速度超过了阈值,就算作成功摇一摇
  console.log(msg)
  if (msg)
    bleComm.writeValue('1');//蓝牙发送指令
  else
    bleComm.writeValue('0');//蓝牙发送指令
  wx.stopAccelerometer(); //停止获取加速度
  wx.vibrateLong();//手机震动
  wx.showToast({   //弹框提示
    title: '摇一摇OK',
    icon: 'success',
    duration: 500, //持续时间500毫秒
  })
}
else {
  wx.hideToast();//隐藏弹框
}

调试摇动速度值

把onLoad函数蓝牙连接消息注释,方便调试。
onLoad: function (options) {
  // wx.showLoading({
  //   title: '靠近连接',
  //   mask: true
  // })
  // bleComm.connectDevice().then(res => {
  //   wx.showToast({
  //     title: '蓝牙连接成功',
  //     icon: 'success',
  //     duration: 300
  //   })
  // });
},
编译下载到手机。点击右上角弹出框选择打开调试。

点击开始后再点击vConsole即可看到速度数据。


可以看到计算出的速度,最大为128,其次92。故程序中设置了110。

最后记得把onLoad里的蓝牙函数取消注释。
预览到手机上就可以通过摇摇控制灯的开关了。

测试

硬件与上堂课。预览小程序即可通过指纹开关灯。

END
代码展示
暂无数据!
附件下载
  • 资料展示
  • ArduinoColorLED_ONOFF.zip
  • shake.zip
授课教师
  • 杨立斌

    美科

问答专区
暂无数据!