from machine import Pin, ADC, Timer
import utime
class Config:
SENSOR_PINS = [2, 4, 36, 39] # 定义传感器引脚
SAMPLING_PERIOD_MS = 20 # 采样周期 (ms)
# 初始化传感器函数
def init_sensor(pin):
"""初始化ADC传感器"""
sensor = ADC(Pin(pin))
sensor.width(ADC.WIDTH_12BIT) # 设置12位分辨率,读取范围0-4096
sensor.atten(ADC.ATTN_11DB) # 设置衰减,测量范围为0-3.3V
return sensor
def init_sensors(pins):
"""初始化所有传感器"""
return [init_sensor(pin) for pin in pins]
class DataLogger:
def __init__(self, sensor_pins, sampling_period_ms):
self.sensors = init_sensors(sensor_pins)
self.sampling_period_ms = sampling_period_ms
self.counter = 1
self.timer = Timer(-1)
def sample_callback(self, timer):
"""定时器回调函数,采集数据"""
# 获取时间戳
timestamp = utime.ticks_ms()
# 读取所有传感器值
sensor_values = [sensor.read_u16() for sensor in self.sensors]
# 打印时间戳、计数和传感器值
print(f"{timestamp},{self.counter},{','.join(map(str, sensor_values))}")
# 增加计数
self.counter += 1
def start(self):
"""启动数据采集"""
self.timer.init(period=self.sampling_period_ms, mode=Timer.PERIODIC, callback=self.sample_callback)
def stop(self):
"""停止数据采集"""
self.timer.deinit()
# 主程序
if __name__ == "__main__":
logger = DataLogger(Config.SENSOR_PINS, Config.SAMPLING_PERIOD_MS)
try:
logger.start()
while True:
utime.sleep(1) # 主线程空转,避免退出
except KeyboardInterrupt:
logger.stop()
print("程序已停止")
传感器的引脚和采样周期都可以通过配置类Config进行调整,方便扩展和修改配置。如果要增加采集的模拟传感器数量,更改class Config里面的SENSOR_PINS = [2, 4, 36, 39]就可以。
利用定时器确保在设定的采样周期内周期性地获取传感器数据,能够实时反映传感器的变化。同时由于使用了定时器进行回调,主线程(通过while True空转)不会被阻塞,可以继续执行其他任务,或者在采集停止时优雅地退出。
通过ADC.WIDTH_12BIT设置传感器的输出范围是 0 到 4095,能够提供更高精度的数值。传感器设置了 11dB 的衰减,适用于 0-3.3V 的电压范围,适合大部分传感器应用。传感器的引脚和采样周期都通过配置类Config进行调整,方便扩展和修改配置。DataLogger类封装了数据采集的逻辑,使代码更具可读性和模块化,便于后期扩展或重用。主程序通过utime.sleep(1)使主线程空转,避免程序频繁退出。使用定时器回调的方式减少了主程序的计算负担,从而节省了资源。
加入MAX_SAMPLIE参数,可以自定义每次采集的点数。采集到设定点数时候自动停止采集。
from machine import Pin, ADC, Timer
import utime
class Config:
SENSOR_PINS = [4, 2] # 定义传感器引脚
SAMPLING_PERIOD_MS = 20 # 采样周期 (ms)
MAX_SAMPLES = 1000 # 最大采样次数
# 初始化传感器函数
def init_sensor(pin):
"""初始化ADC传感器"""
sensor = ADC(Pin(pin))
sensor.width(ADC.WIDTH_12BIT) # 设置12位分辨率,读取范围0-4096
sensor.atten(ADC.ATTN_11DB) # 设置衰减,测量范围为0-3.3V
return sensor
def init_sensors(pins):
"""初始化所有传感器"""
return [init_sensor(pin) for pin in pins]
class DataLogger:
def __init__(self, sensor_pins, sampling_period_ms, max_samples):
self.sensors = init_sensors(sensor_pins)
self.sampling_period_ms = sampling_period_ms
self.counter = 1
self.max_samples = max_samples # 最大采样次数
self.timer = Timer(-1)
def sample_callback(self, timer):
"""定时器回调函数,采集数据"""
if self.counter > self.max_samples:
# 达到最大采样次数,停止定时器
self.stop()
print(f"采集完成,共采集数据 {self.max_samples} 次")
return
# 获取时间戳
timestamp = utime.ticks_ms()
# 读取所有传感器值
sensor_values = [sensor.read_u16() for sensor in self.sensors]
# 打印时间戳、计数和传感器值
print(f"{timestamp},{self.counter},{','.join(map(str, sensor_values))}")
# 增加计数
self.counter += 1
def start(self):
"""启动数据采集"""
self.timer.init(period=self.sampling_period_ms, mode=Timer.PERIODIC, callback=self.sample_callback)
def stop(self):
"""停止数据采集"""
self.timer.deinit()
# 主程序
if __name__ == "__main__":
logger = DataLogger(Config.SENSOR_PINS, Config.SAMPLING_PERIOD_MS, Config.MAX_SAMPLES)
try:
logger.start()
while True:
utime.sleep(1) # 主线程空转,避免退出
except KeyboardInterrupt:
logger.stop()
print("程序已停止")
增加了最大采样次数MAX_SAMPLES和if判断语句,当counter>max_samples时候,停止采集数据,如果想取消这个功能,把以下代码删掉即可
if self.counter > self.max_samples:
# 达到最大采样次数,停止定时器
self.stop()
print(f"采集完成,共采集数据 {self.max_samples} 次")
return
来源:https://blog.csdn.net/m0_54740856/article/details/144103457
欧姆定律是指在同一电路中,通过某段导体的电流跟这段导体两端的电压成正比,跟这段导体的电阻成反比。该定律是由德国物理学家乔治·西蒙·欧姆1826年4月发表的《金属导电定律的测定》论文提出的。
本节我们在迭代二的基础上使用四位数码管和OLED显示屏显示相关交互信息。
本节我们在迭代一的基础上增加采集土壤湿度数据,并根据湿度数据来决定是否自动进行浇水动作。
本节我们实现一个基本能工作的手动浇水装置,即通过按下按键来闭合继发器让小水泵进行浇水。
本小节通过点亮LED和串口输出两个程序,来初步掌握ArduinoIDE、了解GPIO和串口使用、同时把开发环境与开发板的连接,上传程序的各环节跑通,
本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。
本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。
本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。
本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。