补充一下后面板程序
主控ESP32-wroom-32
大概的流程图 这里选择Labview因为后面板编程生成图形化的前面板
并且程序也好修改 用VISA串口和透传发送AT指令控制ESP32 用Labview的波形
图表来显示推力曲线,设置文件的保存路径记录推力数值和对应时间
Labview VISA的链接,安装labview对应版本即可
XXXXXXXXXXXXXXXXXX/en/support/downloads/drivers/XXXXXXXXXXXXXXXXXXXml
需要的模块
HX711 HC-12x2 ESP32 继电器x1
这是Labview的图形界面
设置串口号, 波特率,点击连续运行,如果一切正常波形表会出现HX711采集的推力数据,左侧推力数值滚动,先设置保存推力数值的路径,按下点火按键记录发动机工作时间,并和推力记录在路径的文件中,默认记录20秒,记录完成按下终止按键
接下来是ESP32部分,我这里用的Thonny软件,程序大体流程
HX711的DT接ESP32的GPIO13,SCK接GPIO4
HC-12模块的TXD接GPIO16,RXD接GPIO17
继电器模块接GPIO15(买的HX711据说采样可以到80HZ,实测到Labview只有20HZ了)
程序代码
Labview的代码
测试效果
连接ESP32和串口模块
推力收集,点火
Continuous Serial Read 01.vi 2024-08-06 08-00-28.mp4 点击下载
保存的推力数据文件
等我会熬KNSB后把用这个的试车视频补上
第一次写这种文章,感觉有很多不严谨的地方,有Bug还望各位指出
from machine import Pin
import utime
from machine import UART
# Pin configuration
HX711_SCK = Pin(4, Pin.OUT)
HX711_DT = Pin(13, Pin.IN)
known_weight = 100 # Known weight in grams
uart = UART(2, 115200, rx=16, tx=17)
fire_struct = Pin(15, Pin.OUT, Pin.PULL_DOWN)
def HX711_Read():
count = 0
HX711_DT.init(Pin.IN)
# Ensure DT line goes low
timeout = utime.ticks_ms() + 1000 # 1 second timeout
while HX711_DT.value() == 1:
if utime.ticks_ms() > timeout:
print("Timeout waiting for HX711 to go low")
return None
for _ in range(24):
HX711_SCK.value(1)
utime.sleep_us(1)
count = count << 1
HX711_SCK.value(0)
utime.sleep_us(1)
if HX711_DT.value() == 1:
count += 1
HX711_SCK.value(1)
count = count ^ 0x800000 # Convert to signed integer
utime.sleep_us(1)
HX711_SCK.value(0)
utime.sleep_us(1)
return count
def HX711_Tare():
tare_value = 0
for _ in range(10):
reading = HX711_Read()
if reading is None:
return None
tare_value += reading
utime.sleep(0.1)
tare_value /= 10
return tare_value
def Calibrate_Scale(tare_value, known_weight):
raw_value = 0
for _ in range(10):
reading = HX711_Read()
if reading is None:
return None
raw_value += reading
utime.sleep(0.1)
raw_value /= 10
return (raw_value - tare_value) / known_weight
def Get_Weight(tare_value, calibration_factor):
raw_value = HX711_Read()
if raw_value is None:
return None
weight = (raw_value - tare_value) / calibration_factor
return weight
if __name__ == "__main__":
fire_struct.value(0)
fire_Value=0
tare_value = HX711_Tare()
if tare_value is None:
print("Failed to tare the scale")
else:
calibration_factor = Calibrate_Scale(tare_value, known_weight)
if calibration_factor is None:
print("Failed to calibrate the scale")
else:
print(f"Calibration Factor: {calibration_factor}")
while True:
weight = Get_Weight(tare_value, calibration_factor)
if weight is not None:
uart.write(f"Weight: {weight:.2f} grams\n")
else:
print("Failed to read weight")
# Check for UART data
if uart.any():
state = uart.read().strip()
print(f"Received: {state}")
if state == b'1':
fire_Value = not fire_Value
fire_struct.value(fire_Value)
utime.sleep(0.05)
ESP32自身的FLASH可以用来记录数据从而省略无线通讯部分
我打算是实时采集推力曲线,翻了很久的发现论坛上没有人做labview的程序,顺手把这个补上了
有个问题,就是手机APP版看图片会很糊,保存到本地才清楚,电脑端就没这个问题
哪天你试试写一个时间分辨率在微秒级别的计时器,加一个间距数据输入可以换算出速度值,兼顾通断电触发和高低电平触发的多功能(可以通过跳线帽去选择,可以兼顾测燃速、爆速、弹丸出膛速度(适合电炮、弹弓、弓箭一类),这个适用范围更广,受众面要大很多。
200字以内,仅用于支线交流,主线讨论请采用回复功能。