基于ESP32与VIBERAIL框架的振动监测系统:从信号处理到物联网应用
1. 项目概述与核心价值
最近在折腾一个挺有意思的开源项目,叫VIBERAIL。乍一看这个名字,可能有点摸不着头脑,但如果你对嵌入式开发、物联网设备或者DIY硬件感兴趣,那这个项目绝对值得你花时间研究。简单来说,VIBERAIL是一个为ESP32系列微控制器设计的、功能强大的振动数据采集与分析框架。它的核心目标,是让开发者能够轻松地将物理世界的振动信号——比如机器的异常抖动、结构件的疲劳监测、甚至是你敲击桌面的力度——转化为可量化、可分析的数字数据,并在此基础上构建智能应用。
我之所以对这个项目产生浓厚兴趣,是因为在实际工作中,振动监测一直是个“高门槛”领域。传统的方案要么依赖昂贵的专业传感器和采集卡,要么需要从零开始搭建信号处理链,光是滤波、FFT(快速傅里叶变换)这些基础操作就能劝退不少人。VIBERAIL的出现,相当于提供了一个“开箱即用”的解决方案。它把硬件抽象、数据采集、实时处理、特征提取甚至初步的云端对接都封装好了,你只需要关心你的业务逻辑:比如,什么样的振动特征代表电机轴承磨损了?多大的振幅意味着设备安装松动了?
这个项目非常适合几类人:首先是物联网开发者,想给设备增加预测性维护功能;其次是创客和学生,想低成本地做一些结构健康监测或交互式装置;最后是任何对信号处理、边缘计算在嵌入式平台落地感兴趣的技术爱好者。接下来,我会带你深入拆解VIBERAIL的设计思路、关键技术实现,并分享从环境搭建到实际应用的全流程实操经验,以及那些官方文档里不会写的“坑”。
2. 核心架构与设计哲学解析
2.1 为什么选择ESP32作为硬件基石
VIBERAIL选择ESP32作为核心平台,是一个经过深思熟虑的决策,绝非偶然。首先从性能角度看,ESP32系列芯片(尤其是ESP32-S3)提供了足够的计算能力。振动信号处理,特别是实时FFT运算,对CPU的算力有一定要求。ESP32的主频可达240MHz,且拥有双核处理器,可以将数据采集(通常放在一个核心)和信号处理/网络通信(放在另一个核心)分离开,避免任务阻塞,保证采样时序的精确性,这对于振动分析至关重要,因为采样率的不稳定会直接导致频谱分析失真。
其次,ESP32内置了丰富的外设,特别是高速ADC(模数转换器)和I2S(集成电路内置音频总线)接口。振动传感器(如压电式加速度计)输出的模拟信号,需要高精度的ADC进行数字化。ESP32的ADC在合理配置下,能够达到足够的采样率和分辨率,以满足中低频振动监测的需求(通常工业设备故障特征频率在几千赫兹以内)。而I2S接口本是为音频设计,但其同步串行通信特性非常适合高速、连续的数据流传输,可以用来对接数字输出的MEMS(微机电系统)振动传感器,实现更高性能的数据采集。
最关键的一点是生态与成本。ESP32拥有极其庞大的开发者社区,Arduino框架和ESP-IDF(乐鑫官方开发框架)的支持非常完善,这意味着围绕其开发的驱动、网络库、文件系统等资源唾手可得。同时,ESP32模组成本极低,一片集成了Wi-Fi和蓝牙的模组仅需二三十元人民币,这使得构建分布式、无线化的振动监测节点成为可能,大幅降低了整个系统的部署成本。VIBERAIL构建在这样一个高性价比、高生态成熟度的硬件平台上,是其能够快速推广和应用的底层保障。
2.2 分层架构:从传感器到云端的数据流
VIBERAIL的软件架构采用了清晰的分层设计,这很好地体现了其“框架”而非“单一固件”的定位。理解这个数据流,是灵活使用和二次开发的基础。
最底层是硬件抽象层(HAL)。这一层定义了与物理传感器通信的统一接口。无论是通过ADC读取模拟传感器,还是通过I2S/SPI读取数字传感器,亦或是通过I2C读取内置DSP(数字信号处理器)的智能传感器,在HAL层都被抽象为统一的“数据源”。这样做的好处是,上层应用代码无需关心具体用的是哪款传感器,只需要调用read_vibration_data()这样的通用函数。当你需要更换传感器时,通常只需实现或选用对应的HAL驱动,而不必重写业务逻辑。
往上是数据采集与缓冲层。这一层负责以固定的采样率从HAL读取原始数据,并存入环形缓冲区。这里有一个关键设计:双缓冲机制。一个缓冲区用于接收实时采样数据,当它被填满后,会与另一个缓冲区进行“交换”。被填满的缓冲区会被提交给处理管道,而空的缓冲区则继续接收新数据。这种设计避免了处理过程阻塞数据采集,确保了数据流的连续性。采样率的配置在这里非常重要,它需要根据奈奎斯特采样定理来设定,即采样率至少是目标分析最高频率的两倍。例如,你想分析1000Hz以下的振动成分,采样率至少应设置为2000Hz。
核心部分是信号处理管道。原始振动数据(通常是时域波形)会依次通过一系列处理“滤波器”。这个管道是可配置的,典型的处理链包括:
- 直流偏移移除:传感器可能有零点漂移,需要减去均值,让信号以零为中心。
- 数字滤波:通常包括一个高通滤波器(去除极低频的缓慢变化或温度漂移)和一个低通滤波器(抗混叠,去除高于分析频率的无用高频噪声)。
- 加窗函数:在进行FFT之前,对一段时域数据加窗(如汉宁窗),以减少频谱泄漏。
- FFT计算:将时域信号转换为频域信号,得到频谱图,这是故障诊断的核心。
- 特征提取:从频谱中计算各种特征值,如总振级、特定频段的能量、峰值频率、峭度指标等。这些特征值是后续逻辑判断和云端上传的浓缩信息。
最上层是应用逻辑与输出层。处理后的特征值可以被本地使用,例如触发一个报警GPIO(通用输入输出)口,点亮LED;也可以通过ESP32的Wi-Fi模块,按照MQTT、HTTP等协议将数据打包上传到云端服务器或本地网关,进行更长期的趋势分析和人工智能模型推断。
注意:这个分层架构是逻辑上的,在实际代码中可能以库、任务(FreeRTOS任务)或回调函数的形式组织。理解每一层的职责和层与层之间的数据接口(通常是结构体或队列),是进行深度定制的前提。
3. 硬件选型与传感器接口实战
3.1 传感器类型选择与电路考量
振动监测的精度和可靠性,一半取决于传感器。VIBERAIL框架支持多种传感器,但你需要根据应用场景做出选择。
压电式加速度传感器是最经典的选择。它们灵敏度高、频率响应范围宽(通常可达5kHz甚至更高),非常适合监测中高频振动。但其输出是高阻抗的电荷信号,需要配套电荷放大器才能转换为电压信号供ADC读取。这增加了电路复杂性。不过,市面上也有内置了放大器的IEPE(集成电路压电式)传感器,它需要恒流源供电(通常为2-20mA),输出是低阻抗的电压信号,可以直接接入ESP32的ADC。对于大多数DIY和工业监测场景,IEPE传感器是更省心的选择。
MEMS加速度计是另一个主流方向,特别是数字输出的型号(如通过SPI或I2C通信)。像ADI的ADXL345、ST的LSM6DSOX,它们将传感器和ADC、甚至简单的DSP都集成在了一个芯片里,通过数字接口直接输出已经过数字化和初步校准的加速度值。优点是接口简单、噪声低、功耗可控,且通常支持多种量程(如±2g, ±4g, ±16g)。缺点是高频响应通常不如专业的压电传感器(可能到1kHz左右),但对于很多机械设备的基础状态监测已经足够。
电路连接上的坑我踩过不少。如果你使用模拟传感器接ADC,务必注意参考电压和偏置电压。ESP32的ADC参考电压默认是3.3V,传感器的输出信号范围必须在这个区间内。很多IEPE传感器在零加速度时,输出是一个中间电压(如1.65V或2.5V),这意味着它输出的是“偏置”后的交流信号。你需要确保这个偏置电压在ADC量程内,并且在前端信号调理电路(如分压、跟随器)设计时考虑进去。此外,一定要在ADC输入引脚和地之间并联一个0.1uF的陶瓷电容,以滤除高频噪声,这是提升采样稳定性的廉价而有效的方法。
对于数字MEMS传感器,接线相对简单,但要注意电源去耦。必须在传感器的VCC和GND引脚之间,尽可能靠近芯片引脚的地方,并联一个10uF的钽电容和一个0.1uF的陶瓷电容,以确保电源干净,避免数字噪声影响模拟传感部分。
3.2 ESP32 ADC配置与采样率精确控制
使用ESP32内置ADC采集模拟振动信号,配置不当是结果失真的主要元凶。首先,ESP32的ADC本身有一定非线性,尤其是在量程两端。VIBERAIL框架通常会包含或推荐一个ADC校准过程。这个校准不是简单的软件偏移,而是通过读取内部电压参考,来补偿ADC的非线性特性。在ESP-IDF中,可以调用esp_adc_cal_characterize函数来获取校准特性,然后在每次读取后使用esp_adc_cal_raw_to_voltage进行转换,能得到更精确的电压值。
采样率的精确控制是实现可靠频谱分析的生命线。你不能简单地用一个for循环加delay来采样,因为函数调用和任务调度的不确定性会导致采样间隔抖动。正确的方法是使用硬件定时器中断。在Arduino环境下,可以使用hw_timer_t;在ESP-IDF下,使用通用定时器(GPTIMER)或高分辨率定时器(ESP-Timer)。在定时器中断服务程序(ISR)中,以最简化的代码读取ADC值并存入缓冲区。中断的优先级要设置得足够高,以避免被其他任务打断。
这里有一个关键公式:采样周期 = 定时器周期 = 1 / 采样率。例如,要实现2000Hz的采样率,定时器中断需要每500微秒触发一次。你需要根据ESP32的APB时钟频率(通常是80MHz)和定时器的分频系数,计算出正确的定时器计数比较值。代码配置的微小错误,可能导致实际采样率是1990Hz或2010Hz,这种偏差在长时FFT中会产生严重的频率“漂移”。
实操心得:在开发初期,务必增加一个调试功能:用另一个GPIO口,在每次进入ADC采样中断时翻转一次电平。然后用示波器或逻辑分析仪测量这个GPIO方波的频率,它应该严格等于你设定的采样率。这是验证采样定时是否精确的最直接方法。我曾在项目初期忽略了这一步,结果做出来的频谱总是对不上,排查了很久才发现是定时器分频数计算有误。
4. 信号处理链的深度实现与调优
4.1 实时FFT运算在资源受限MCU上的实现
在ESP32上做实时FFT,是对计算资源和内存管理的考验。VIBERAIL通常集成一个轻量级的FFT库,如arduinoFFT或专门为ESP32优化的esp-dsp库中的FFT函数。选择哪个库,取决于你对速度和精度的权衡。
arduinoFFT纯C++实现,易于集成到Arduino项目中,支持多种窗函数和幅值/相位计算,但速度相对较慢。esp-dsp库是乐鑫官方提供的,包含了大量用汇编优化的数字信号处理函数,其FFT速度远超通用实现,特别是对于固定点数(如256点、512点)的FFT有高度优化。如果你的采样率和处理帧长固定,强烈推荐使用esp-dsp。
FFT点数(N)的选择是一门艺术。点数越多,频率分辨率越高(Δf = 采样率Fs / N),但计算量也呈N*logN增长,且需要更多内存。对于嵌入式设备,常见的折中选择是256点或512点。假设采样率Fs=2000Hz,做256点FFT,那么频率分辨率Δf≈7.8Hz,能分析的频率范围是0-1000Hz(奈奎斯特频率)。这意味着你能区分开两个相差7.8Hz的频率成分,对于许多旋转机械的故障特征(如转频、倍频)识别来说,这个分辨率是足够的。
内存管理至关重要。FFT运算需要复数数组(实部+虚部)。对于256点FFT,你需要一个长度为256的复数数组。在ESP32上,应该使用DMAMEM(如果支持)或heap_caps_malloc从内部高速内存(如SRAM)中分配这些数组,而不是使用普通的堆或全局数组,以确保最快的访问速度。同时,输入数据(时域信号)在送入FFT前,需要从整数(ADC值)转换为浮点数,这个转换过程也可以考虑使用查表法或定点数运算来加速。
4.2 数字滤波器的设计与参数整定
原始振动信号中混杂着各种噪声,有效的滤波是特征提取的前提。VIBERAIL的处理管道中,数字滤波器是关键一环。通常需要两个:一个高通滤波器(HPF)和一个低通滤波器(LPF)。
高通滤波器的作用是去除直流分量和极低频的缓慢漂移(有时称为“趋势项”)。这些成分通常不是我们关心的振动,而是由温度变化、传感器安装倾斜等原因引起的。如果不滤除,它们会在FFT后的频谱上产生一个巨大的0Hz分量(直流),掩盖掉低频段有用的信息。一个截止频率在0.5Hz到5Hz的二阶或四阶巴特沃斯高通滤波器通常就足够了。实现上,可以使用IIR(无限脉冲响应)滤波器,因为它计算效率高。在C语言中,你需要根据滤波器的系数(通过Matlab、Python的scipy或在线工具计算得到),实现一个二阶节(Biquad)的直接II型转置结构,这是数值稳定性最好的实现方式之一。
低通滤波器的核心作用是抗混叠。尽管在ADC前端可能有模拟抗混叠滤波器,但数字低通滤波器作为第二道防线,可以确保在降采样(如果需要)或进一步处理前,高于奈奎斯特频率的信号被充分抑制。其截止频率应略低于你关心的最高分析频率(例如,关心1000Hz,截止频率可设为900Hz)。同样,巴特沃斯或切比雪夫I型滤波器是常用选择。
滤波器系数的计算和实现需要谨慎。我建议在PC上用Python(SciPy库)设计好滤波器,计算出系数,然后将这些系数作为常量数组硬编码到ESP32的代码中。不要在MCU上实时计算滤波器系数,那太耗资源。在实现滤波器函数时,务必保存好状态变量(即上一次的输出和输入值),因为IIR滤波器是有记忆的。
避坑指南:滤波器的相位延迟问题。IIR滤波器在滤除噪声的同时,会对信号的相位产生非线性扭曲。这对于只需要分析振幅谱(如计算总振级)的应用影响不大,但如果你需要精确分析信号中各频率成分的时序关系(如交叉频谱分析),则需要使用具有线性相位特性的FIR(有限脉冲响应)滤波器。不过,FIR滤波器的计算量远大于IIR,在ESP32上实现长抽头的实时FIR滤波会非常吃力,需要根据实际需求权衡。
5. 特征提取与本地智能诊断逻辑
5.1 从频谱中提炼关键特征值
得到频谱图(FFT结果的幅值)后,原始数据量依然很大(256个频率点)。直接上传所有数据到云端既不经济,也无必要。本地提取特征值,是边缘计算的核心价值。VIBERAIL框架通常会提供一系列特征提取函数,以下是最常用、最有工程意义的几种:
总振级(Overall Vibration Level, OVL):计算频谱中所有频率点幅值的均方根(RMS)。这是一个最宏观的指标,反映了振动的总体能量。设备健康状态恶化时,OVL值通常会呈现上升趋势。计算公式为:
OVL = sqrt( sum( amplitude[i]^2 ) / N ),其中amplitude[i]是第i个频率点的幅值。峰值频率与幅值:找出频谱中幅值最高的前3-5个频率点及其对应的幅值。对于旋转机械,转频及其倍频(2x, 3x…)的幅值异常增长,是失衡、不对中、松动等故障的典型特征。记录这些峰值,可以为故障类型初步判断提供依据。
频带能量:将整个频谱划分为几个关键频带(例如:0.5x转频, 1x转频, 2x转频, 高频段),分别计算每个频带内幅值的RMS值。通过监测各频带能量的相对变化,可以更精细地定位故障。例如,高频段能量显著增加,可能预示着轴承或齿轮的早期损伤。
峭度指标(Kurtosis):这是一个时域统计特征,对冲击性信号非常敏感。计算时域信号x[n]的四阶中心矩与标准差四次方的比值:
Kurtosis = sum( (x[n] - mean)^4 ) / (N * std^4)。健康轴承的振动信号近似高斯分布,峭度接近3。当轴承出现点蚀、剥落等局部损伤时,会产生周期性冲击,峭度值会显著增大(远大于3)。峭度指标常用于轴承的早期故障预警。
在ESP32上实现这些计算,要注意浮点运算开销。对于OVL和频带能量,可以使用整数运算或平方根查找表来加速。对于寻找峰值,一个简单的遍历比较算法即可,因为数据量(256点)不大。
5.2 基于阈值的本地报警与状态判断
提取出特征值后,就可以在设备端做出初步判断,实现快速的本地响应。最直接的方法是阈值报警。你需要为关键特征(如总振级OVL、峭度值)设定一个或多个阈值。
- 预警阈值:当特征值超过此阈值,表示设备状态可能开始劣化,但还未达到危险程度。可以触发一个低级别报警,比如让一个LED慢速闪烁,并通过网络上报一条预警日志。
- 报警阈值:当特征值超过此阈值,表示设备已处于异常状态,需要尽快检查。此时应触发高级别报警,比如让LED快速闪烁或蜂鸣器鸣叫,并立即上报报警事件。
阈值如何设定?这是最具经验性的部分。理想情况是在设备安装初期、健康状态下,长时间运行并记录特征值,计算其统计分布(均值和标准差),然后将预警阈值设为“均值 + 3倍标准差”,报警阈值设为“均值 + 5倍标准差”。如果没有历史数据,可以参考设备制造商提供的标准,或基于同类设备的经验值进行初步设定,并在运行中持续优化。
更高级一点的逻辑可以是趋势判断。例如,连续监测一段时间(如1小时)内的OVL值,计算其移动平均值。如果移动平均值呈现持续上升的趋势(例如,线性拟合的斜率大于某个正数),即使当前值未超过绝对阈值,也可以发出“趋势预警”,提示设备性能可能在缓慢退化。
这些本地逻辑的判断结果,可以通过ESP32的GPIO口直接控制指示灯、继电器,也可以通过Wi-Fi以MQTT消息的形式发布到指定的主题(Topic),由网络侧的服务器(如Node-RED, Home Assistant)或手机App接收并做出更复杂的联动。
6. 数据上云与远程监控系统搭建
6.1 通信协议选择:MQTT vs. HTTP
将振动数据从边缘的ESP32发送到云端或本地服务器,主要有两种协议选择:MQTT和HTTP。
MQTT(消息队列遥测传输)是物联网领域的明星协议,采用发布/订阅模式,非常轻量,带宽占用低,适合持续、小批量的数据传输。对于VIBERAIL项目,你可以让ESP32作为一个MQTT客户端,将提取的特征值(如OVL、峰值频率)以JSON格式,定期(如每10秒)发布到一个像viberail/device01/vibration这样的主题。服务器端(如部署在云端的Node.js服务、或本地的Home Assistant)订阅该主题即可接收数据。MQTT还支持“遗嘱消息”,可以在设备意外离线时通知服务器,提高了系统的可靠性。对于需要实时监控和快速响应的场景,MQTT是首选。
HTTP/HTTPS的方式更传统、更通用。ESP32可以周期性地向一个预定义的RESTful API端点发起POST请求,携带JSON格式的数据。这种方式更易于与现有的Web服务集成,并且可以利用HTTPS提供传输层安全。缺点是开销比MQTT大(每次通信都要建立TCP连接、发送HTTP头),对于电池供电的设备不友好。它更适合于非实时、数据上报间隔较长(如每分钟或每小时一次)的场景,或者需要与特定云平台(其只提供了HTTP API)对接的情况。
我的选择建议是:对于大多数DIY和工业监测场景,优先使用MQTT。你可以在本地局域网搭建一个Mosquitto MQTT Broker(代理),成本为零。云端也有许多免费的公共Broker(如HiveMQ Cloud的免费套餐)或云服务商提供的MQTT服务(如阿里云物联网平台、AWS IoT Core)。它的实时性和低功耗优势明显。
6.2 云端数据可视化与持久化方案
数据上传只是第一步,在云端对数据进行可视化展示和持久化存储,才能发挥其长期价值。
一个简单而强大的组合是:Node-RED + InfluxDB + Grafana。
- Node-RED:一个基于流的低代码编程工具。你可以用它来订阅MQTT主题,接收来自ESP32的数据。然后,在Node-RED中可以对数据进行简单的清洗、转换(例如,将字符串JSON解析为数值),再将其写入时序数据库。
- InfluxDB:一个专门为时间序列数据优化的数据库。它非常适合存储带时间戳的传感器读数,查询和聚合速度极快。你可以创建一个名为
vibration的measurement,里面包含device_id,overall_level,peak_freq等字段。 - Grafana:一个功能强大的数据可视化平台。它可以连接InfluxDB作为数据源,然后让你轻松地创建仪表盘。你可以绘制总振级随时间变化的趋势图,设置报警线;可以绘制实时频谱图(需要上传原始频谱数据);还可以将多个设备的振动状态在一个面板上进行对比。
整个流程可以部署在一台树莓派、旧电脑上,甚至利用Docker容器在NAS上运行。这构成了一个完整的、私有化的物联网监控系统。
另一种更“云原生”的方案是直接使用物联网云平台,如阿里云物联网平台或AWS IoT。这些平台提供了设备管理、消息路由、规则引擎、数据存储和可视化的一站式服务。你只需要在ESP32上集成平台提供的SDK,按照平台规范上报数据,就可以在平台的控制台上看到数据图表,并配置报警规则。优点是省去了自己搭建和维护后端服务的麻烦,缺点是可能会有一定的费用,并且数据存储在第三方平台。
实操心得:在数据上报的JSON格式设计上,我强烈建议包含以下字段:
timestamp(设备端生成的时间戳,ISO 8601格式)、device_id(设备唯一标识)、feature_set(包含所有特征值的对象,如{"ovl": 1.23, "kurtosis": 3.45, "peak_freq_hz": [50.1, 100.2]})。这样设计,后端在解析和存储时非常清晰。另外,务必考虑网络不稳定的情况,在ESP32端实现一个简单的发送队列和重试机制,避免数据丢失。
7. 项目实战:从零构建一个电机振动监测节点
7.1 硬件清单与电路连接
让我们以一个具体的案例来串联所有知识:监测一台小型交流风扇电机的振动状态。
硬件清单:
- ESP32开发板:如ESP32 DevKit C V4,这是最通用的选择。
- 振动传感器:选用一款常见的IEPE压电加速度传感器,量程±50g,频率响应0.5Hz~10kHz,自带3.5mm插头。配套一个IEPE恒流源调理模块(将恒流源供电转换为单端电压输出)。
- 电平转换与滤波电路(可选但推荐):由于IEPE模块输出可能是±5V或±10V,而ESP32 ADC只能接受0-3.3V输入,需要一个电阻分压电路(如用10kΩ和20kΩ电阻分压,将±10V缩放到0-3.3V)。同时,在ADC输入引脚前加入一个RC低通滤波(1kΩ电阻串联,0.1uF电容对地),截止频率约1.6kHz,作为初步的抗混叠滤波。
- 电源:USB供电或5V直流电源适配器。
- 连接线:杜邦线、3.5mm音频线(连接传感器与调理模块)。
电路连接步骤:
- 将IEPE传感器通过音频线连接到调理模块的输入。
- 调理模块的
VCC和GND接5V电源正负极。其OUT信号线接电平转换电路的输入端。 - 电平转换电路的输出端(即分压后的信号)连接到ESP32的一个ADC引脚,例如
GPIO34。同时,在该引脚与ESP32的GND之间,并联一个0.1uF的陶瓷电容。 - 确保ESP32、调理模块、传感器共地。
7.2 固件开发、配置与部署流程
- 环境准备:使用PlatformIO IDE(基于VSCode)或Arduino IDE。安装ESP32开发板支持包。从GitHub克隆
shamanakin/VIBERAIL项目代码。 - 项目配置:打开项目,找到主要的配置文件(通常是
config.h或viberail_config.h)。你需要修改以下关键参数:ADC_PIN: 设置为你的信号输入引脚,如34。SAMPLING_RATE: 根据电机转速设定。假设电机转速3000 RPM(50Hz),关心其10倍频以内的振动(500Hz),根据奈奎斯特定理,采样率至少1000Hz。为留有余量,设置为2000。FFT_SIZE: 设置为256。这样频率分辨率为2000/256≈7.8Hz。HPF_CUTOFF_HZ和LPF_CUTOFF_HZ: 分别设置为5.0和800.0。MQTT_BROKER: 设置为你的MQTT Broker地址,如本地192.168.1.100。MQTT_TOPIC: 设置为home/vibration/motor_fan。
- 核心代码理解与修改:浏览主循环
loop()或主任务函数。理解数据采集、处理、发布的流程。你可能需要调整特征提取的逻辑,例如,只上报总振级和峭度值。在setup()函数中,确保Wi-Fi连接和MQTT初始化的代码正确,并添加了重连逻辑。 - 编译与烧录:连接ESP32到电脑,选择正确的串口和开发板类型,编译并上传固件。
- 测试与验证:打开串口监视器,查看日志输出。你应该能看到Wi-Fi连接成功、MQTT连接成功的信息,以及周期性的振动特征值打印。用手轻轻敲击或晃动传感器,观察打印出的总振级数值是否相应变化。
7.3 系统联调与效果评估
固件运行正常后,进行系统联调:
- 服务器端部署:在局域网的另一台电脑或树莓派上,启动Mosquitto MQTT Broker。使用Node-RED,拖入一个
mqtt in节点,配置连接到Broker,并订阅home/vibration/motor_fan主题。再拖入一个debug节点,连接到mqtt in节点,部署后,你应该能在Node-RED的调试侧边栏看到ESP32发来的JSON数据。 - 数据存储与可视化:在Node-RED中,添加一个
function节点,将JSON消息中的ovl和kurtosis字段提取出来,并添加当前时间戳,构造出InfluxDB的行协议格式字符串。然后使用node-red-contrib-influxdb节点,将数据写入已安装好的InfluxDB。最后,在Grafana中配置InfluxDB数据源,创建一个新的Dashboard,添加一个Graph面板,查询vibrationmeasurement中ovl字段,就能看到电机振动总级随时间变化的曲线了。 - 效果评估:让风扇电机在正常状态下运行一段时间,记录特征值的基线。然后,人为制造一个“故障”,比如在电机风扇叶片上贴一小块胶带(模拟不平衡),观察
ovl值和频谱中1倍转频(50Hz)的幅值是否显著升高。再观察峭度值的变化。通过这个实验,你可以验证整个监测链路是否有效,并为后续设置报警阈值积累经验数据。
整个项目从硬件连接到云端可视化,形成了一个完整的闭环。通过这个实践,你不仅掌握了VIBERAIL框架的使用,更深入理解了振动监测系统从物理信号到数字洞察的全过程。
