加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
ESP32图形化推力计
14272024/08/06原创 电子技术 IP:天津
关键词
推力计
Labview

主控ESP32-wroom-32 

大概的流程图 这里选择Labview因为后面板编程生成图形化的前面板

并且程序也好修改 用VISA串口和透传发送AT指令控制ESP32 用Labview的波形

图表来显示推力曲线,设置文件的保存路径记录推力数值和对应时间

流程.png

Labview VISA的链接,安装labview对应版本即可

https://www.ni.com/en/support/downloads/drivers/download.ni-visa.html

需要的模块

1b80cadd1e0ecd8430a6bb90e2f744c.jpg

HX711 HC-12x2 ESP32 继电器x1

这是Labview的图形界面

IMG_20240805_220005.jpg

设置串口号, 波特率,点击连续运行,如果一切正常波形表会出现HX711采集的推力数据,左侧推力数值滚动,先设置保存推力数值的路径,按下点火按键记录发动机工作时间,并和推力记录在路径的文件中,默认记录20秒,记录完成按下终止按键

接下来是ESP32部分,我这里用的Thonny软件,程序大体流程 IMG_20240805_222712.jpg

HX711的DT接ESP32的GPIO13,SCK接GPIO4

HC-12模块的TXD接GPIO16,RXD接GPIO17

继电器模块接GPIO15(买的HX711据说采样可以到80HZ,实测到Labview只有20HZ了)

程序代码

attachment icon main.py 2.66KB PY 3次下载

Labview的代码

attachment icon Labview推力计V1.0.vi 53.09KB VI 3次下载

测试效果

连接ESP32和串口模块

c7c31f1fdbf7e602e3583563d59413b.jpg 7061cc044860a2606167b7d3b8e1f01.jpg

推力收集,点火

00:00
00:00
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
Continuous Serial Read 01.vi 2024-08-06 08-00-28.mp4  点击下载

保存的推力数据文件 推力数据文件.png

等我会熬KNSB后把用这个的试车视频补上

第一次写这种文章,感觉有很多不严谨的地方,有Bug还望各位指出

来自:电子信息 / 电子技术动手实践:实验报导
9
2
新版本公告
~~空空如也
1427 作者
8个月23天前 IP:天津
935560

补充一下后面板程序 Labview.png

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
8个月23天前 修改于 8个月23天前 IP:天津
935561
Python
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(2115200, 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)


引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
xljxlj
8个月29天前 IP:广东
935176

ESP32自身的FLASH可以用来记录数据从而省略无线通讯部分

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
8个月29天前 IP:天津
935184

我打算是实时采集推力曲线,翻了很久的发现论坛上没有人做labview的程序,顺手把这个补上了

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小叮当0312
8个月29天前 IP:河南
935186

有意思,支持 sticker

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
冇脖长颈鹿
8个月23天前 IP:江苏
935563

支持,不过科创的文章里是可以发代码的,不需要截图了

引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
8个月23天前 IP:天津
935604

有个问题,就是手机APP版看图片会很糊,保存到本地才清楚,电脑端就没这个问题 IMG_20240813_131935.jpg IMG_20240813_131946.jpg

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
helium
8个月20天前 修改于 8个月19天前 IP:广东
935758

哪天你试试写一个时间分辨率在微秒级别的计时器,加一个间距数据输入可以换算出速度值,兼顾通断电触发和高低电平触发的多功能(可以通过跳线帽去选择,可以兼顾测燃速、爆速、弹丸出膛速度(适合电炮、弹弓、弓箭一类),这个适用范围更广,受众面要大很多。

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1427作者
8个月20天前 IP:天津
935765
引用helium发表于8楼的内容
哪天你试试写一个时间分辨率在微秒级别的计时器,加一个间距数据输入可以换算出速度值,兼顾通断电触发和高...

目前实力不允许 sticker

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
1427
进士 笔友
文章
6
回复
207
学术分
0
2022/11/05注册,14天16时前活动

高中牲不想上学

主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:天津
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的