文章目录
前言
给小朋友做了一个手机遥控器来遥控小车,需要调用手机的加速度传感器的数据来控制转向。因为本人从来没玩过Java,只会一点Python,想着在Android上直接跑Python把这个功能实现。找了很久的实现方式,发现正好PYQT5支持跨平台,里面的QtSensors似乎就是我想要的东西,同时还能一并把遥控器的界面也解决了!但奈何网上查到的QtSensors的用例几乎都是基于C语言的,或者QML。折腾一番后还是给弄出来,这里分享出来,给自己做个记录,也给大家演示一下基于Python的QtSensors用法(也算是弥补网上空白?当然,也可能是我自己没发现而已)。
有点啰嗦,毕竟第一次发博,下面进入正题。
一、运行环境
我是用Pydroid3在Android上跑的python。其实鸿蒙应该也可以的,之前没弄出来,以为是鸿蒙系统不支持,后面特意刷回了Android,又是一番瞎折腾。
至于Pydroid3怎么安装,怎么用,这里就不多了,网上很多资料。Pydroid3自带了PYQT5,省了一点安装库的麻烦。
二、使用步骤
1.引入库
从PyQt5.QtSensors导入QAccelerometer模块(还有很多其他传感器模块,大家可以自己去玩)。
from PyQt5.QtSensors import QAccelerometer
本示例中做了一个简单的界面来反馈当前的传感器获取的值,所以一并导入相关的模块:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLineEdit
from PyQt5.QtCore import QTimer
2.功能函数
2.1 初始化
界面初始化,同时对QAccelerometer()模块实例化,通过setActive(True)打开传感器。添加一个定时器,进行定时的刷新数据。
代码如下:
def __init__(self, parent=None):
super(App, self).__init__(parent)
layout = QFormLayout()
self.editX = QLineEdit()
self.editY = QLineEdit()
self.editZ = QLineEdit()
layout.addRow("X数值", self.editX)
layout.addRow("Y数值", self.editY)
layout.addRow("Z数值", self.editZ)
self.setLayout(layout)
self.Accelerometer = QAccelerometer()
self.Accelerometer.setActive(True)
self.MyTimer()
2.2 定时器函数
定时器每100ms刷新一次数据:
def MyTimer(self):
timer = QTimer(self)
timer.timeout.connect(self.update)
timer.start(100)
2.3 刷新传感器数据
刷新传感器数据则通过reading函数,获取当前相应轴坐标的加速度数据,然后刷新到界面中:
def update(self):
current_x = self.Accelerometer.reading().x()
current_y = self.Accelerometer.reading().y()
current_z = self.Accelerometer.reading().z()
self.editX.setText(str(current_x))
self.editY.setText(str(current_y))
self.editZ.setText(str(current_z))
2.4 主函数
剩下的就是主函数了:
def main():
app = QApplication(sys.argv)
window = App()
window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
3.最终效果
最终效果截了个图。实际你晃动手机,界面上各个轴的数据就会发生变化。找出你想要的变化规律,就可以开发相应的应用了。做一个手机遥控器来控制方向就很简单了.^-^.
总结
最终做出来,看起来还是挺简单的,关键的其实就两三行代码。但因为自己基础薄弱,总想着能copy现成的东西,当网络上找不到时就抓瞎了。其实虽然不是对应的语言,但实现方式和步骤都是大相径庭的,自己认真研究一下也是能行的!
另外,QtSensors还支持很多其他的传感器类型,用法都是差不多了,大家可以试试其他的,这样就可以开发出各种类型的app,可玩性就很高了!
后记
手机跟小车的通信是靠的蓝牙,同样也是基于Python的PyQt5写的蓝牙通信接口。后面有时间也把这部分的经验分享出来,其中有几个问题其实至今也没有很完美的解决,还得请教网络上的各位高手了!