OP-BTS 脚本编程指南
1. 概述
OP-BTS蓝牙光电头支持基于PikaScript(Python语言的子集)的脚本编程功能,通过编写脚本可以实现自定义数据采集、处理和显示等功能,大大提升设备的灵活性和适用性。
1.1 PikaScript简介
PikaScript是一种轻量级的Python解释器,专为嵌入式设备设计,支持Python3标准语法的子集。在OP-BTS设备中,PikaScript提供了丰富的API,使您能够控制设备硬件、处理数据以及实现自定义功能。
1.2 脚本功能优势
- 自定义数据采集:根据特定需求定制数据采集流程,支持复杂的采集策略和条件触发
- 本地数据处理:在设备端直接处理数据,实现实时分析和智能决策,减少数据传输量
- 自动化操作:实现无人值守的自动化数据采集和处理,提高工作效率
- 灵活的用户界面:通过LCD显示自定义信息和操作提示,支持丰富的交互方式
- 低资源占用:相比手机APP和电脑软件,脚本运行更轻量高效,无需额外安装和配置
- 快速部署:支持脚本的快速编写和更新,便于现场调试和功能扩展
2. 开发环境准备
2.1 文件管理软件
我们提供专用的文件管理软件,用于管理和下载脚本到OP-BTS设备中。
2.1.1 软件下载与安装
- 访问我们的官方网站 下载最新版本的OP-BTS文件管理工具
- 运行安装程序,按照提示完成安装
- 安装完成后,启动软件
2.1.2 软件界面介绍
- 菜单栏:包含文件(F)、设备(D)和帮助(H)选项
- 工具栏:提供退出、刷新、连接和断开连接等快捷操作按钮
- 串口设置区:
- 端口选择:选择连接设备的COM端口
- 波特率:设置通信波特率(默认9600)
- 校验位:设置数据校验方式(默认NONE)
- 数据位:设置数据位长度(默认8位)
- 停止位:设置停止位长度(默认1位)
- 文件列表区:显示设备中已有的脚本文件
- 操作按钮:
- 刷新:更新文件列表
- 上传:将电脑中的文件上传到设备
- 下载:将设备中的文件下载到电脑
- 删除:删除设备中选中的文件
- 状态栏:显示操作状态和连接信息
2.2 连接设备
- 打开OP-BTS设备电源
- 通过蓝牙或对接工装光电头连接设备:
- 蓝牙连接:通过SPP蓝牙虚拟串口方式连接设备,找到设备的传出COM端口号,操作方法参考TP-BT: 如何与Windows 11 配对
- 对接工装光电头连接:
- 在软件中选中之前配对好的蓝牙COM端口号,并按连接按钮
- 连接成功后,软件会显示设备的基本信息和文件脚本列表,并使用刷新、上传、下载、删除等按钮,操作脚本文件
2.3 脚本管理
2.3.1 上传脚本到设备
- 确保设备已连接
- 选择要上传的脚本文件
- 点击"上传到设备"按钮
- 上传成功后,脚本将显示在设备脚本列表中
2.3.2 从设备下载脚本
- 在设备脚本列表中选择要下载的脚本
- 点击"下载到电脑"按钮
- 选择保存位置,点击"确定"
2.3.3 删除设备中的脚本
- 在设备脚本列表中选择要删除的脚本
- 点击"删除脚本"按钮
- 在确认对话框中点击"确定"
3. 设备操作方法
3.1 脚本选择与运行
3.1.1 通过按键操作
- 在设备主界面,短按"菜单"键进入菜单
- 使用"上"、“下"按键选择"脚本"选项
- 短按"确认"键进入脚本列表
- 使用"上”、“下"按键选择要运行的脚本
- 短按"确认"键运行选中的脚本
3.2 脚本交互操作
脚本可以通过以下方式与用户交互:
- 显示信息:在LCD屏幕上显示文本、数值或图形
- 按键响应:响应用户的按键操作
- 声音提示:通过蜂鸣器发出声音提示
4. 脚本编程API
4.1 基础模块
4.1.1 系统模块
# 导入系统模块
import sys
# 获取系统版本
version = sys.version
# 退出脚本
sys.exit()
# 延时(毫秒)
sys.sleep(1000) # 延时1秒
4.1.2 时间模块
# 导入时间模块
import time
# 获取当前时间戳(秒)
timestamp = time.time()
# 格式化时间
time_str = time.strftime("%Y-%m-%d %H:%M:%S")
# 延时(秒)
time.sleep(1) # 延时1秒
4.2 硬件控制API
4.2.1 显示控制
# 导入显示模块
import display
# 清除屏幕
display.clear()
# 显示文本
display.text("Hello World", x=10, y=20, size=12, color=0xFFFFFF)
# 显示数值
display.number(123.45, x=10, y=40, decimal=2, size=12, color=0xFFFFFF)
# 绘制线条
display.line(x1=10, y1=10, x2=100, y2=50, color=0xFF0000, width=2)
# 绘制矩形
display.rect(x=10, y=60, width=100, height=30, color=0x00FF00, fill=True)
# 绘制圆形
display.circle(x=50, y=100, radius=20, color=0x0000FF, fill=False)
# 显示图像
display.image("logo.bmp", x=10, y=130)
# 更新显示(某些操作需要手动更新)
display.update()
4.2.2 按键控制
# 导入按键模块
import button
# 按键定义
# KEY_UP: 上键
# KEY_DOWN: 下键
# KEY_LEFT: 左键
# KEY_RIGHT: 右键
# KEY_OK: 确认键
# KEY_BACK: 返回键
# KEY_MENU: 菜单键
# 检测按键状态
if button.is_pressed(button.KEY_OK):
print("OK键被按下")
# 等待按键按下
key = button.wait_for_press(timeout=5000) # 等待5秒,超时返回None
# 按键回调函数
def on_key_press(key):
print("按键被按下:", key)
# 注册按键回调
button.register_callback(button.KEY_OK, on_key_press)
4.2.3 蜂鸣器控制
# 导入蜂鸣器模块
import buzzer
# 蜂鸣器鸣响(频率,持续时间ms)
buzzer.beep(1000, 500) # 1000Hz,持续500ms
# 播放音调序列
buzzer.play_tone([1000, 1500, 2000], [200, 200, 500]) # 频率列表,持续时间列表
4.3 数据处理API
4.3.1 数据采集
# 导入数据采集模块
import sensor
# 开始数据采集
sensor.start()
# 停止数据采集
sensor.stop()
# 获取当前数据
data = sensor.read()
print("当前数据:", data)
# 设置采样率(Hz)
sensor.set_sample_rate(100) # 设置为100Hz
# 获取采样率
rate = sensor.get_sample_rate()
print("当前采样率:", rate)
# 数据回调函数
def on_data(data):
print("接收到数据:", data)
# 注册数据回调
sensor.register_callback(on_data)
4.3.2 数据存储
# 导入文件模块
import file
# 打开文件
f = file.open("data.txt", "w") # 写入模式
# 写入数据
f.write("Hello World\n")
f.write("123.45\n")
# 关闭文件
f.close()
# 读取文件
f = file.open("data.txt", "r") # 读取模式
data = f.read()
print("文件内容:", data)
f.close()
# 检查文件是否存在
if file.exists("data.txt"):
print("文件存在")
# 删除文件
file.remove("data.txt")
4.4 通信API
4.4.1 蓝牙通信
# 导入蓝牙模块
import bluetooth
# 检查蓝牙连接状态
if bluetooth.is_connected():
print("蓝牙已连接")
# 发送数据
bluetooth.send("Hello World")
# 接收数据
data = bluetooth.receive(timeout=1000) # 等待1秒,超时返回None
print("接收到数据:", data)
# 数据接收回调函数
def on_receive(data):
print("接收到数据:", data)
# 注册数据接收回调
bluetooth.register_callback(on_receive)
5. 开发示例
5.1 基础示例:Hello World
# 导入必要的模块
import display
import time
# 清除屏幕
display.clear()
# 显示文本
display.text("Hello World!", x=10, y=20, size=16, color=0xFFFFFF)
display.text("OP-BTS Script Demo", x=10, y=40, size=12, color=0xFFFFFF)
# 更新显示
display.update()
# 等待3秒
time.sleep(3)
# 显示结束信息
display.clear()
display.text("Demo Completed", x=10, y=20, size=16, color=0xFFFFFF)
display.update()
5.2 数据采集示例
# 导入必要的模块
import display
import sensor
import time
import file
# 清除屏幕
display.clear()
display.text("数据采集示例", x=10, y=10, size=16, color=0xFFFFFF)
display.text("正在准备...", x=10, y=30, size=12, color=0xFFFFFF)
display.update()
# 准备数据文件
f = file.open("sensor_data.txt", "w")
f.write("时间,数据值\n") # CSV文件头
# 采集数据的回调函数
def on_data(data):
# 获取当前时间
t = time.time()
# 显示数据
display.clear()
display.text("数据采集示例", x=10, y=10, size=16, color=0xFFFFFF)
display.text("当前值: {:.2f}".format(data), x=10, y=30, size=12, color=0xFFFFFF)
display.update()
# 保存数据到文件
f.write("{},{:.2f}\n".format(t, data))
# 注册数据回调
sensor.register_callback(on_data)
# 设置采样率
sensor.set_sample_rate(10) # 10Hz
# 开始采集
display.text("开始采集数据...", x=10, y=50, size=12, color=0xFFFFFF)
display.update()
sensor.start()
# 采集10秒
time.sleep(10)
# 停止采集
sensor.stop()
# 关闭文件
f.close()
# 显示完成信息
display.clear()
display.text("数据采集完成", x=10, y=10, size=16, color=0xFFFFFF)
display.text("数据已保存到sensor_data.txt", x=10, y=30, size=12, color=0xFFFFFF)
display.update()
5.3 交互式应用示例
# 导入必要的模块
import display
import button
import buzzer
import time
# 初始化变量
counter = 0
# 清除屏幕
display.clear()
display.text("交互式应用示例", x=10, y=10, size=16, color=0xFFFFFF)
display.text("计数器: {}".format(counter), x=10, y=40, size=14, color=0xFFFFFF)
display.text("上键: 增加 下键: 减少", x=10, y=60, size=12, color=0xFFFFFF)
display.text("确认键: 重置 返回键: 退出", x=10, y=80, size=12, color=0xFFFFFF)
display.update()
# 按键回调函数
def on_up_key():
global counter
counter += 1
update_display()
buzzer.beep(1000, 100) # 短促提示音
def on_down_key():
global counter
counter -= 1
update_display()
buzzer.beep(800, 100) # 短促提示音
def on_ok_key():
global counter
counter = 0
update_display()
buzzer.beep(1200, 200) # 较长提示音
def on_back_key():
# 退出程序
display.clear()
display.text("程序已退出", x=10, y=40, size=16, color=0xFFFFFF)
display.update()
buzzer.beep(500, 300) # 低音提示音
time.sleep(1)
import sys
sys.exit()
# 更新显示函数
def update_display():
display.clear()
display.text("交互式应用示例", x=10, y=10, size=16, color=0xFFFFFF)
display.text("计数器: {}".format(counter), x=10, y=40, size=14, color=0xFFFFFF)
display.text("上键: 增加 下键: 减少", x=10, y=60, size=12, color=0xFFFFFF)
display.text("确认键: 重置 返回键: 退出", x=10, y=80, size=12, color=0xFFFFFF)
display.update()
# 注册按键回调
button.register_callback(button.KEY_UP, on_up_key)
button.register_callback(button.KEY_DOWN, on_down_key)
button.register_callback(button.KEY_OK, on_ok_key)
button.register_callback(button.KEY_BACK, on_back_key)
# 主循环
while True:
time.sleep(0.1) # 降低CPU占用
6. 常见问题
6.1 脚本无法运行
问题:上传脚本后无法运行,或运行时立即停止。
解决方案:
- 检查脚本语法是否正确,确保没有语法错误
- 检查脚本是否使用了设备不支持的API或功能
- 检查脚本文件名是否包含特殊字符或空格
- 尝试重新上传脚本或重启设备
6.2 脚本运行缓慢
问题:脚本运行速度明显变慢或响应延迟。
解决方案:
- 减少循环中的复杂计算
- 避免频繁更新显示,可以设置更新间隔
- 使用更高效的算法和数据结构
- 减少不必要的文件读写操作
6.3 数据采集问题
问题:数据采集不稳定或无法获取数据。
解决方案:
- 检查传感器连接是否正常
- 确认采样率设置是否合理,过高的采样率可能导致数据丢失
- 检查数据回调函数是否正确注册
- 尝试重新启动数据采集过程
6.4 蓝牙通信问题
问题:无法通过蓝牙发送或接收数据。
解决方案:
- 确认设备与接收端的蓝牙连接状态
- 检查蓝牙模块是否正确初始化
- 确保数据格式正确,避免发送过大的数据包
- 尝试重新建立蓝牙连接
6.5 内存不足
问题:运行复杂脚本时出现内存不足错误。
解决方案:
- 减少全局变量的使用
- 及时释放不再使用的资源
- 避免创建过大的数据结构
- 将大型数据处理分解为多个小步骤
- 使用文件存储中间结果,而不是全部保存在内存中