OP-BTS 脚本编程指南

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 软件下载与安装

  1. 访问我们的官方网站 下载最新版本的OP-BTS文件管理工具
  2. 运行安装程序,按照提示完成安装
  3. 安装完成后,启动软件

2.1.2 软件界面介绍

文件管理软件界面

  1. 菜单栏:包含文件(F)、设备(D)和帮助(H)选项
  2. 工具栏:提供退出、刷新、连接和断开连接等快捷操作按钮
  3. 串口设置区:
    • 端口选择:选择连接设备的COM端口
    • 波特率:设置通信波特率(默认9600)
    • 校验位:设置数据校验方式(默认NONE)
    • 数据位:设置数据位长度(默认8位)
    • 停止位:设置停止位长度(默认1位)
  4. 文件列表区:显示设备中已有的脚本文件
  5. 操作按钮:
    • 刷新:更新文件列表
    • 上传:将电脑中的文件上传到设备
    • 下载:将设备中的文件下载到电脑
    • 删除:删除设备中选中的文件
  6. 状态栏:显示操作状态和连接信息

2.2 连接设备

  1. 打开OP-BTS设备电源
  2. 通过蓝牙或对接工装光电头连接设备:
    • 蓝牙连接:通过SPP蓝牙虚拟串口方式连接设备,找到设备的传出COM端口号,操作方法参考TP-BT: 如何与Windows 11 配对
    • 对接工装光电头连接
  3. 在软件中选中之前配对好的蓝牙COM端口号,并按连接按钮
  4. 连接成功后,软件会显示设备的基本信息和文件脚本列表,并使用刷新、上传、下载、删除等按钮,操作脚本文件

2.3 脚本管理

2.3.1 上传脚本到设备

  1. 确保设备已连接
  2. 选择要上传的脚本文件
  3. 点击"上传到设备"按钮
  4. 上传成功后,脚本将显示在设备脚本列表中

2.3.2 从设备下载脚本

  1. 在设备脚本列表中选择要下载的脚本
  2. 点击"下载到电脑"按钮
  3. 选择保存位置,点击"确定"

2.3.3 删除设备中的脚本

  1. 在设备脚本列表中选择要删除的脚本
  2. 点击"删除脚本"按钮
  3. 在确认对话框中点击"确定"

3. 设备操作方法

3.1 脚本选择与运行

3.1.1 通过按键操作

  1. 在设备主界面,短按"菜单"键进入菜单
  2. 使用"上"、“下"按键选择"脚本"选项
  3. 短按"确认"键进入脚本列表
  4. 使用"上”、“下"按键选择要运行的脚本
  5. 短按"确认"键运行选中的脚本

3.2 脚本交互操作

脚本可以通过以下方式与用户交互:

  1. 显示信息:在LCD屏幕上显示文本、数值或图形
  2. 按键响应:响应用户的按键操作
  3. 声音提示:通过蜂鸣器发出声音提示

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 脚本无法运行

问题:上传脚本后无法运行,或运行时立即停止。

解决方案

  1. 检查脚本语法是否正确,确保没有语法错误
  2. 检查脚本是否使用了设备不支持的API或功能
  3. 检查脚本文件名是否包含特殊字符或空格
  4. 尝试重新上传脚本或重启设备

6.2 脚本运行缓慢

问题:脚本运行速度明显变慢或响应延迟。

解决方案

  1. 减少循环中的复杂计算
  2. 避免频繁更新显示,可以设置更新间隔
  3. 使用更高效的算法和数据结构
  4. 减少不必要的文件读写操作

6.3 数据采集问题

问题:数据采集不稳定或无法获取数据。

解决方案

  1. 检查传感器连接是否正常
  2. 确认采样率设置是否合理,过高的采样率可能导致数据丢失
  3. 检查数据回调函数是否正确注册
  4. 尝试重新启动数据采集过程

6.4 蓝牙通信问题

问题:无法通过蓝牙发送或接收数据。

解决方案

  1. 确认设备与接收端的蓝牙连接状态
  2. 检查蓝牙模块是否正确初始化
  3. 确保数据格式正确,避免发送过大的数据包
  4. 尝试重新建立蓝牙连接

6.5 内存不足

问题:运行复杂脚本时出现内存不足错误。

解决方案

  1. 减少全局变量的使用
  2. 及时释放不再使用的资源
  3. 避免创建过大的数据结构
  4. 将大型数据处理分解为多个小步骤
  5. 使用文件存储中间结果,而不是全部保存在内存中