202509
systems

Flipper Zero 集成盖革计数器:嵌入式 C 实现实时辐射检测与警报

详细说明如何在 Flipper Zero 固件中集成盖革-穆勒管,实现辐射实时监测、SD 卡数据记录以及基于阈值的警报机制。

在嵌入式系统中,实时监测辐射水平是一个实用且重要的功能,尤其是在便携式设备如 Flipper Zero 上。Flipper Zero 是一款开源的多功能开发板,基于 STM32WB55 微控制器,支持自定义固件开发。本文聚焦于将盖革-穆勒管(Geiger-Muller tube)集成到 Flipper Zero 的固件中,使用嵌入式 C 语言实现辐射的实时检测、数据通过 SD 卡记录,以及基于阈值的警报系统。这种集成不仅适用于教育和业余爱好者,还可扩展到环境监测或紧急响应场景。

硬件集成基础

盖革-穆勒管是一种经典的辐射检测传感器,主要响应 β 和 γ 射线(α 射线通常需特殊设计才能检测)。典型管如 J305 类型,需要 400-500V 的高压供电,并通过脉冲输出信号表示辐射事件。Flipper Zero 的 GPIO 引脚(如 A7)可用于捕获这些脉冲,而高压部分需外部电路提供,例如使用 DC-DC 升压模块从 3.3V 升至所需电压。

连接方案简单:盖革管的输出引脚连接到 Flipper Zero 的 GPIO A7(配置为输入中断模式)。SD 卡槽已内置,支持 FAT 文件系统。电源管理至关重要,因为高压电路会增加功耗;建议使用外部电池供电,并监控电压以避免管子误触发。测试时,可短接 A4 到 A7 模拟脉冲,频率每秒变化,用于验证软件逻辑,而无需实际辐射源。

在实际部署中,选择低功耗管子,并添加屏蔽以减少电磁干扰。辐射阈值设定需参考标准:正常环境背景辐射约 0.1-0.2 μSv/h,高于 1 μSv/h 可能需警报。

嵌入式 C 软件实现:中断驱动的计数

Flipper Zero 的固件基于 C 语言,使用 libopencm3 或官方 SDK 开发。核心是中断服务程序(ISR)来处理盖革管脉冲。STM32 的 EXTI(外部中断)模块适合此任务。

首先,初始化 GPIO 和中断:

#include <furi.h>
#include <furi_hal.h>
#include <gpio.h>

#define GEIGER_PIN GPIOA, 7  // A7 引脚

void geiger_init() {
    nrf_gpio_cfg_input(GEIGER_PIN, NRF_GPIO_PIN_NOPULL);  // 输入,无上拉
    // 配置中断:下降沿触发(脉冲为负脉冲)
    nrf_gpiote_int_enable(GEIGER_PIN, NRF_GPIOTE_POLARITY_HITOLO, true);
    NVIC_EnableIRQ(GPIOTE_IRQn);  // 启用中断
}

中断处理函数中递增计数器,并记录时间戳:

volatile uint32_t count = 0;
volatile uint32_t last_time = 0;

void GPIOTE_IRQHandler(void) {
    if (nrf_gpiote_event_is_set(GEIGER_PIN)) {
        nrf_gpiote_event_clear(GEIGER_PIN);
        count++;
        last_time = furi_get_tick();  // 获取系统 tick
    }
}

实时检测依赖 CPS(每秒计数)和 CPM(每分钟计数)的计算。使用定时器每秒中断更新:

void timer_callback(FuriTimer* timer) {
    uint32_t now = furi_get_tick();
    uint32_t cps = (now - last_time > 1000) ? 0 : count;  // 简化 CPS
    count = 0;  // 重置计数
    // 转换为剂量率:μSv/h ≈ CPM * 0.0057(针对 J305 管校准因子)
    float dose = cps * 60 * 0.0057;
    
    // 更新 UI 或日志
    if (dose > THRESHOLD_HIGH) {  // e.g., 1.0 μSv/h
        buzzer_beep();  // 警报
        vibrate();
    }
}

定时器初始化:furi_timer_start(timer, 1000);(1 秒间隔)。这种中断驱动方式确保低延迟响应,即使在主循环处理 UI 时也不会丢失脉冲。注意:STM32 的 64MHz 时钟提供高精度时间戳,用于后续哈希随机数生成(如原子骰子应用)。

数据记录:SD 卡日志

Flipper Zero 支持 SD 卡通过 SPI 接口访问,使用 FATFS 库记录数据。辐射事件需持久化,便于后期分析或绘图。

实现日志函数:

#include <fatfs.h>

FIL file;
char filename[32];
uint32_t epoch = 0;

void log_init() {
    f_get_time(&ftime);  // 获取时间
    sprintf(filename, "/geiger-%04d-%02d-%02d--%02d-%02d-%02d.csv",
            year, month, day, hour, min, sec);
    f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE);
    f_puts("epoch,cps,dose_usv_h\n", &file);  // CSV 头
}

void log_data(uint32_t cps, float dose) {
    char buf[64];
    sprintf(buf, "%lu,%lu,%.2f\n", epoch++, cps, dose);
    f_puts(buf, &file);
    f_sync(&file);  // 确保写入
}

在定时器回调中调用 log_data(cps, dose);。文件名为时间戳格式,便于排序。SD 卡容量限制下,建议每分钟同步一次,或检测高辐射时立即写入。功耗优化:仅在记录模式启用日志,长按按钮切换(UI 通过 LVGL 或官方 GUI 实现)。

对于大容量记录,可添加压缩或仅存异常事件。但基础版已支持数小时连续监测,CSV 易导入 Excel 或 Python 绘图。

警报阈值与可落地参数

警报系统是安全核心。定义多级阈值:

  • 低警报:0.5 μSv/h(黄色 LED 闪烁)

  • 高警报:1.0 μSv/h(蜂鸣器 + 振动)

  • 紧急:10 μSv/h(连续警报 + 屏幕大字体显示)

在 C 代码中:

#define TH_LOW 0.5f
#define TH_HIGH 1.0f
#define TH_EMERG 10.0f

void check_alert(float dose) {
    if (dose > TH_EMERG) {
        // 紧急:全屏警报
        gui_draw_text(canvas, 10, 10, "EMERGENCY RADIATION!", 20, &font);
        buzzer_beep(1000, 500);  // 1kHz, 500ms
        notification_message(VIBRO_ON);
    } else if (dose > TH_HIGH) {
        notification_message(LED_YELLOW_BLINK);
        buzzer_beep(800, 200);
    } else if (dose > TH_LOW) {
        notification_message(LED_YELLOW_ON);
    }
}

阈值基于 IAEA 标准调整,针对盖革管校准(β/γ 灵敏度)。参数落地:

  • 采样率:1 秒 CPS 更新,平衡精度与功耗(STM32 低功耗模式下 <10mA)。

  • 滤波:使用移动平均平滑 CPS,避免噪声:avg_cps = 0.8 * avg_cps + 0.2 * new_cps;

  • 校准:用已知源(如烟雾探测器中的 Am-241)测试,调整转换因子(典型 0.0057 μSv/h per CPM)。

  • 回滚策略:若 SD 写入失败,回退到内存缓冲(环形队列 100 条记录)。中断优先级设高,确保不被 UI 阻塞。

  • 监控点:日志中添加电压、温度(若集成传感器);固件版本检查兼容性。

潜在风险与优化

集成风险包括高压安全(避免短路)和假阳性(宇宙射线或 EMI)。建议添加死时间补偿(管子脉冲后 100μs 忽略),公式:真实 CPS = 记录 CPS / (1 - 记录 CPS * 死时间)。

电源:Flipper Zero 电池续航约 8 小时监测;优化中断唤醒模式。扩展:集成 BLE 传输数据到手机,或与 GPS 模块结合定位辐射热点。

测试用例:环境背景(~10 CPM)、铀矿样品(数百 CPM)。应用如“原子骰子”利用辐射熵生成真随机数,哈希时间戳(CRC32 或 MD5)。

此集成展示了嵌入式 C 在硬件-软件协同中的威力。通过 Unleashed 或 Momentum 固件,可快速原型。开发者需注意辐射法规,仅用于合法教育目的。

(字数:约 1250 字)

参考:Flipper Zero 官方文档;第三方固件如 Unleashed(GitHub)。实际部署前,验证硬件兼容性。