引言
本项目设计了一个基于STM32的新型故障提示器,能够实时监测多种设备的运行状态,并在检测到异常时及时通过蜂鸣器、LED指示灯、OLED显示屏等进行多重报警提示。系统通过传感器采集电压、电流、温度、振动等数据,采用简单的故障判断算法对数据进行分析,一旦超出正常范围就触发报警。该系统适用于工业设备、发电机组等场合的实时监控。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列)
- 多通道 ADC 模块(如 ADS1115,用于高精度数据采集)
- 温度传感器(如 DS18B20 或 NTC 热敏电阻)
- 电压传感器(如电压分压电路,用于监测输入电压)
- 电流传感器(如 ACS712,用于监测电流)
- 振动传感器(如 SW-420 振动传感器,用于检测异常震动)
- 蜂鸣器(用于声音报警)
- RGB LED(用于视觉报警)
- OLED 显示屏(用于显示故障信息)
- USB-TTL 串口调试工具
2. 软件工具
- STM32CubeMX:用于初始化 STM32 外设。
- Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
- ST-Link 驱动程序:用于下载程序到 STM32。
项目实现
1. 硬件连接
- 多通道 ADC 模块连接:将 ADS1115 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于读取多种传感器的数据。
- 温度传感器连接:将 DS18B20 的数据引脚连接到 STM32 的 GPIO(如 PA0),并使用 4.7kΩ 上拉电阻。
- 电压传感器连接:将电压分压电路的输出连接到 STM32 的 ADC 引脚(如 PA1)。
- 电流传感器连接:将 ACS712 电流传感器的输出引脚连接到 STM32 的 ADC 引脚(如 PA2)。
- 振动传感器连接:将 SW-420 振动传感器的输出引脚连接到 STM32 的 GPIO(如 PA3)。
- 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO(如 PA4)。
- RGB LED 连接:将 RGB LED 的 R、G、B 引脚分别连接到 STM32 的 GPIO(如 PA5、PA6、PA7)。
- OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7)。
2. STM32CubeMX 配置
- 打开 STM32CubeMX,选择你的开发板型号。
- 配置系统时钟为 HSI,确保系统稳定运行。
- 配置 GPIO 引脚用于蜂鸣器、振动传感器和 RGB LED 控制。
- 配置 I2C,用于与 ADS1115、DS18B20 和 OLED 显示屏通信。
- 配置 ADC 用于电压和电流数据采集。
- 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序
在生成的项目基础上,编写故障检测、报警提示、数据采集与显示的代码。以下是新型故障提示器的基本代码示例:
#include "stm32f1xx_hal.h"
#include "ads1115.h"
#include "ds18b20.h"
#include "oled.h"
// 定义故障阈值
#define TEMP_THRESHOLD_HIGH 75.0 // 温度上限
#define VOLTAGE_THRESHOLD_HIGH 12.5 // 电压上限
#define VOLTAGE_THRESHOLD_LOW 10.0 // 电压下限
#define CURRENT_THRESHOLD_HIGH 2.0 // 电流上限
#define VIBRATION_THRESHOLD 2000 // 振动阈值
// 定义引脚
#define BUZZER_PIN GPIO_PIN_4
#define BUZZER_PORT GPIOA
#define RGB_LED_RED_PIN GPIO_PIN_5
#define RGB_LED_GREEN_PIN GPIO_PIN_6
#define RGB_LED_BLUE_PIN GPIO_PIN_7
#define RGB_LED_PORT GPIOA
#define VIBRATION_PIN GPIO_PIN_3
#define VIBRATION_PORT GPIOA
// 函数声明
void System_Init(void);
void Check_Faults(float temperature, float voltage, float current, uint16_t vibration);
void Trigger_Alarm(uint8_t alarm_type);
void Clear_Alarm(void);
void Display_Status(float temperature, float voltage, float current);
float Read_Voltage(void);
float Read_Current(void);
uint16_t Read_Vibration(void);
// 全局变量
float voltage = 0;
float current = 0;
float temperature = 0;
uint16_t vibration = 0;
void System_Init(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_ADC1_Init();
OLED_Init();
ADS1115_Init();
DS18B20_Init();
OLED_ShowString(0, 0, "Fault Detector Ready");
}
// 读取电压
float Read_Voltage(void)
{
return ADS1115_ReadVoltage(0); // 假设 ADC 通道 0 读取电压
}
// 读取电流
float Read_Current(void)
{
return ADS1115_ReadVoltage(1) / 0.185; // 假设 0.185V/A 转换比例
}
// 读取振动
uint16_t Read_Vibration(void)
{
return HAL_GPIO_ReadPin(VIBRATION_PORT, VIBRATION_PIN) == GPIO_PIN_SET ? 3000 : 0;
}
// 检查故障状态
void Check_Faults(float temperature, float voltage, float current, uint16_t vibration)
{
if (temperature > TEMP_THRESHOLD_HIGH)
{
Trigger_Alarm(1); // 温度报警
}
else if (voltage < VOLTAGE_THRESHOLD_LOW || voltage > VOLTAGE_THRESHOLD_HIGH)
{
Trigger_Alarm(2); // 电压报警
}
else if (current > CURRENT_THRESHOLD_HIGH)
{
Trigger_Alarm(3); // 电流报警
}
else if (vibration > VIBRATION_THRESHOLD)
{
Trigger_Alarm(4); // 振动报警
}
else
{
Clear_Alarm();
}
}
// 触发报警
void Trigger_Alarm(uint8_t alarm_type)
{
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET);
switch (alarm_type)
{
case 1: // 温度报警
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_RED_PIN, GPIO_PIN_SET);
OLED_ShowString(0, 2, "Overheat Alarm");
break;
case 2: // 电压报警
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_BLUE_PIN, GPIO_PIN_SET);
OLED_ShowString(0, 2, "Voltage Alarm");
break;
case 3: // 电流报警
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_GREEN_PIN, GPIO_PIN_SET);
OLED_ShowString(0, 2, "Current Alarm");
break;
case 4: // 振动报警
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_RED_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_BLUE_PIN, GPIO_PIN_SET);
OLED_ShowString(0, 2, "Vibration Alarm");
break;
}
}
// 清除报警
void Clear_Alarm(void)
{
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_RED_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_GREEN_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(RGB_LED_PORT, RGB_LED_BLUE_PIN, GPIO_PIN_RESET);
OLED_ShowString(0, 2, "System Normal ");
}
// 显示状态
void Display_Status(float temperature, float voltage, float current)
{
OLED_Clear();
OLED_ShowString(0, 0, "Temp:");
OLED_ShowFloat(64, 0, temperature, 2);
OLED_ShowString(0, 1, "Volt:");
OLED_ShowFloat(64, 1, voltage, 2);
OLED_ShowString(0, 2, "Curr:");
OLED_ShowFloat(64, 2, current, 2);
}
int main(void)
{
System_Init();
while (1)
{
// 读取各传感器数据
temperature = DS18B20_ReadTemperature();
voltage = Read_Voltage();
current = Read_Current();
vibration = Read_Vibration();
// 显示当前状态
Display_Status(temperature, voltage, current);
// 显示当前状态
Display_Status(temperature, voltage, current);
// 检查并处理故障状态
Check_Faults(temperature, voltage, current, vibration);
HAL_Delay(1000); // 每秒更新一次状态
}
}
4. 各模块代码
DAC 和电流电压读取
以下是 ADS1115 ADC 模块用于读取电压和电流的代码示例:
#include "ads1115.h"
// 初始化 ADS1115
void ADS1115_Init(void)
{
// 配置 ADS1115 初始化参数,设置增益和采样率
}
// 读取 ADC 的通道电压值
float ADS1115_ReadVoltage(uint8_t channel)
{
int16_t raw_value = ADS1115_ReadChannel(channel);
float voltage = raw_value * 0.001; // 假设 ADC 增益为1,将读取值转换为电压
return voltage;
}
温度读取
以下是 DS18B20 温度传感器的读取代码示例:
#include "ds18b20.h"
// 初始化 DS18B20
void DS18B20_Init(void)
{
// 配置 GPIO 引脚,初始化 DS18B20 通信
}
// 读取温度值
float DS18B20_ReadTemperature(void)
{
// 从 DS18B20 读取温度值,并转换为摄氏度
return 25.0; // 假设读取到的温度为 25.0°C
}
OLED 显示处理
OLED 显示屏用于实时显示电压、电流和温度:
#include "oled.h"
// 初始化 OLED
void OLED_Init(void)
{
// OLED 初始化代码
}
// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, char *str)
{
// 在 OLED 上显示指定位置的字符串
}
// 显示浮点数
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t decimal_places)
{
// 显示带小数点的数值
}
// 清屏
void OLED_Clear(void)
{
// 清除 OLED 上的显示内容
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
问题讨论,stm32的资料领取可以私信!
5. 系统工作原理
-
数据采集与监测:通过多通道 ADC 模块(ADS1115)实时监测输入电压、电流,并使用温度传感器(DS18B20)获取环境温度数据。振动传感器用于检测异常震动,以监控设备状态。
-
故障判断:通过软件设定的阈值,实时对采集的数据进行分析判断。例如,当温度超过设定的高温阈值时,系统将触发过热报警;当电压超出正常工作范围时,触发电压异常报警;当检测到过高的电流或异常震动时,也会相应触发报警。
-
多重报警提示:当检测到故障时,系统通过蜂鸣器发出声音报警,RGB LED 提供视觉报警,OLED 显示屏显示具体的故障信息。多重报警方式确保在不同环境中都能及时提醒用户设备状态异常。
-
状态显示与数据上传:OLED 显示屏实时显示当前的温度、电压和电流数值,方便用户随时查看设备状态。该系统可以扩展 Wi-Fi 模块或串口通信功能,将实时数据上传到远程服务器,便于远程监控。
6. 常见问题与解决方法
1. 温度检测不准确
- 问题原因:DS18B20 传感器连接不稳定或数据读取时序不正确。
- 解决方法:检查 DS18B20 的引脚连接,特别是上拉电阻的连接是否牢固,确保读取数据的时序符合 DS18B20 的通信要求。
2. 电压或电流读数异常
- 问题原因:ADC 模块的增益设置不正确或传感器校准不准确。
- 解决方法:确保 ADS1115 的增益设置适合测量的电压范围,并在使用前对电流传感器进行校准。
3. 振动检测过于敏感
- 问题原因:振动传感器的阈值设置过低,导致误报警。
- 解决方法:根据实际环境调节振动传感器的灵敏度,通过调整软件中的阈值来减少误报警。
4. 蜂鸣器报警无法关闭
- 问题原因:可能是故障状态未清除,导致系统持续发出报警。
- 解决方法:确保在检测到正常状态后调用
Clear_Alarm()
函数以停止蜂鸣器报警,并检查系统逻辑是否存在问题。
7. 扩展功能
-
远程监控:可以为系统添加 ESP8266 或 ESP32 Wi-Fi 模块,将采集到的温度、电压、电流和振动数据上传到服务器,通过手机或电脑远程监控设备状态。
-
数据存储:添加 SD 卡模块,将故障发生时的数据记录下来,便于后续的分析和设备维护。
-
蓝牙控制:添加蓝牙模块,用户可以通过手机 APP 连接设备,远程调整报警阈值或手动触发故障检测。
结论
通过本项目,我们设计了一个基于 STM32 的新型故障提示器,成功实现了对多种设备状态的实时监测和故障报警。系统通过传感器采集环境和设备的状态信息,并根据预设的阈值进行故障判断,利用蜂鸣器、LED 和 OLED 显示屏进行多重提示。该系统适用于各种需要监测设备状态的场合,为工业设备监控、家用电器保护等提供了高效、智能的解决方案。项目的开放性和可扩展性也使其具备了进一步升级的可能性,是一个非常有价值的嵌入式开发案例。