替换数据列,并从斐济设备读入重量数据

77 阅读2分钟

1.需要将数据列的 input 替换为斐济设备读入的重量,并使用5阶多项式函数将斐济设备读入的重量值转换为重量值,从而实现读入重量值后得到力值。

2、解决方案

  • 首先,打开需要读入重量的斐济设备。
  • 其次,设置斐济设备的采样率为10。
  • 读取斐济设备的1秒内的数据,并计算这些数据的平均值。
  • 将平均值代入5阶多项式函数,得到重量值。
  • 最后,将重量值写入指定的列中。
from Phidgets.PhidgetException import PhidgetException
from Phidgets.Devices.Bridge import Bridge, BridgeGain

import datetime
import os
import re
import sys
import time
import numpy


wgh = list()
avg = list()
buf = list()
x = []
y = []

# 读取标定文件,生成转换系数
def nonlinear_regression():   
    fd = open("calibration.csv", "r")

    for line in fd:
        [v0, v1] = line.split(",")
        x.append(float(v0))
        y.append(float(v1[:len(v1) - 1]))

    xdata = numpy.array(x)
    ydata = numpy.array(y)


    z = numpy.polyfit(x, y, 5)      

    return z       


# 创建数据目录
def create_data_directory():   
    if not os.path.exists("data"):
        os.makedirs("data")

# 读取配置文件
def parse_config():   
    v = int()

    config = open("config.properties", "r")
    for line in config:
        toks = re.split(r"[\n= ]+", line)
        if toks[0] == "record_interval":
            v = int(toks[1])

    return v

# 读取斐济设备数据
def read_bridge_data(event):   
    buf.append(event.value)

# 记录数据
def record_data(f_name, date, rms):
    if not os.path.isfile(f_name):
        fd = open(f_name, "w")
        fd.write("time,weight\n")
        fd.write(datetime.datetime.strftime(date, "%H:%M"))
        fd.write(",")
        fd.write(str(rms) + "\n")
        fd.close()
    else:
        fd = open(f_name, "a")
        fd.write(datetime.datetime.strftime(date, "%H:%M"))
        fd.write(",")
        fd.write(str(rms) + "\n")
        fd.close()
    print("Data recorded.")

# 释放斐济设备
def release_bridge(event):   
    try:
        event.device.closePhidget()
    except:
        print("Phidget bridge could not be released properly.")
        sys.exit(1)


# 主函数
def main():

    create_data_directory()

    RECORD_INTERVAL = parse_config()        # get the config-file value
    calibrate = nonlinear_regression()      # get calibration function; use like: calibrate(some_input)
    bridge = Bridge()

    try:
        bridge.setOnBridgeDataHandler(read_bridge_data)
        bridge.setOnDetachHandler(release_bridge)   # when the phidget gets physically detached
        bridge.setOnErrorhandler(release_bridge)   # asynchronous exception (i.e. keyboard interrupt)
    except:
        print("Phidget bridge event binding failed.")
        sys.exit(1)

    try:
        bridge.openPhidget()
        bridge.waitForAttach(3000)
    except:
        print("Phidget bridge opening failed.")
        sys.exit(1)

    last_record = int()
    while (True):
        date = datetime.datetime.now()
        f_name = "data\" + datetime.datetime.strftime(date, "%B_%d_%Y") + ".csv"

        curr = time.time() * 1000
        if (curr - last_record) > (RECORD_INTERVAL * 1000):
            try:
                bridge.setDataRate(10)
                last = time.time() * 1000
                bridge.setEnabled(0, True)
                while (time.time() * 1000 - last) < 1000:   # collects over 1 sec
                    pass
                bridge.setEnabled(0, False)
            except:
                print("Phidget bridge data reading error.")
                bridge.setEnabled(0, False)
                bridge.closePhidget()
                sys.exit(1)
            vol = sum(buf) / len(buf)

            del buf[:]
            last_record = curr

            record_data(f_name, date, calibrate(vol))   # replace curr with calibrated data

        else:
            time.sleep(RECORD_INTERVAL - 1)   # to reduce the CPU's busy-waiting

if __name__ == "__main__":
    main()

这些代码可以使用5阶多项式函数将斐济设备读入的重量值转换为重量值。

注意,代码中的配置文件config.properties只是一个示例,您需要根据实际情况进行修改。