补充一下后面板程序
主控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版看图片会很糊,保存到本地才清楚,电脑端就没这个问题
哪天你试试写一个时间分辨率在微秒级别的计时器,加一个间距数据输入可以换算出速度值,兼顾通断电触发和高低电平触发的多功能(可以通过跳线帽去选择,可以兼顾测燃速、爆速、弹丸出膛速度(适合电炮、弹弓、弓箭一类),这个适用范围更广,受众面要大很多。
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。