1、实验目标:

基于Micro Pytohn使用ESP32采集两路压力传感器信号。

2、实验环境:

芯片esp32-wroom-32
传感器压力传感器
开发环境Thonny + micro python

3、实验步骤

购买的压力传感器如下图:有三个引脚,GNG,VCC,S;

  1. GND连接esp32的GND,
  2. VCC连接esp32的VCC,
  3. S来连接esp32任意具有ADC功能的GPIO口。

Tips: ESP32 芯片有2 个12位的SAR(逐次逼近)ADC,最多可以读取18个不同的模拟通道输入:(ADC1支持8个通道(GPIO32-GPIO39),ADC2支持10个通道(GPIO0、GPIO2、GPIO4、GPIO12-GPIO15、GPIO25-GPIO27)。

代码:

from machine import Pin# 导入Pin模块
from machine import ADC# 导入ADC模块
from machine import Timer# 导入Timer模块
import time# 导入time模块
import utime
import os

sensor1 =ADC(Pin(25))
sensor1.width(ADC.WIDTH_12BIT) #读取的电压转为0-4096;ADC.WIDTH_9BIT:0-511
sensor1.atten(ADC.ATTN_11DB)   #衰减设置范围:输入电压0-3.3v

sensor2 =ADC(Pin(26))
sensor2.width(ADC.WIDTH_12BIT) #读取的电压转为0-4096;ADC.WIDTH_9BIT:0-511
sensor2.atten(ADC.ATTN_11DB)   #衰减设置范围:输入电压0-3.3v


while True:
    print(f'sensor1输出:{sensor1.read_u16()}',f'sensor2输出:{sensor2.read_u16()}')
    utime.sleep_ms(20)

结果如图:

如果想保存传感器数据,可以使用xcom或者sscom等串口助手进行保存。

4、代码改进

代码比较简单,但是这个代码有一下几个缺点

1、缺乏实时性

循环阻塞操作:代码使用 while True 循环读取传感器数据,且在每次迭代中调用 utime.sleep_ms(20)。这种实现会阻塞主线程,导致无法同时执行其他任务。

2、无法保证精准的采样周期

该代码使用 utime.sleep_ms(20) 控制采样周期,但 utime.sleep 的精度依赖于系统时钟和其他任务的执行情况,可能导致实际采样周期偏离预期,尤其是在运行复杂任务时。

3、数据采集不可扩展

每个传感器的初始化和读取都需要单独的代码块(如 sensor1 和 sensor2 的设置),当需要增加更多传感器时,代码会变得冗长且难以维护。

4、高功耗

由于代码持续运行在 while True 循环中,主线程始终处于忙碌状态,增加了功耗,尤其是在电池供电的嵌入式设备中不理想。

如果想克服以上缺点,可以使用以下方法:

  1. 使用 定时器(Timer) 实现周期性采样,避免主线程阻塞。
  2. 将传感器的初始化和数据采集封装为模块化函数或类,方便扩展和维护。
  3. 在低功耗应用中,使用合适的休眠模式降低能耗。

相关程序在下一个博客中给出 。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐