STM32智能标本喷洒系统开源,给在国外的中国用户设计
这是一个真实交付到日本的嵌入式小项目:基于 STM32F103C8T6 的三通道智能标本喷洒系统。客户用来给植物/昆虫标本定时喷雾保湿,系统支持三路独立控制、OLED 菜单、按键 + 旋转编码器调节。本文把硬件方案、核心代码和 Gerber 全部开源,供大家参考复刻。
一、项目背景
这套系统最初是 2024 年底接到的海外客单,最终交付到了日本客户手中。整个 BOM 成本控制在 130 元左右,属于典型的“小而美”出海电子设计。
它的核心需求很简单:
- 同时对 3 个标本盒 进行喷雾保湿
- 每路可独立设置:喷雾时间、间隔时间、含水率、标本重量
- 本地 OLED 菜单 + 按键 + 旋转编码器 调节参数
- 一键启动/停止,状态实时显示
二、系统框图

系统以 STM32F103C8T6 为主控,通过 GPIO 驱动三路继电器,进而控制三个 5V 喷雾泵。人机交互部分使用 0.96 寸 IIC OLED、5 个独立按键和 EC11 旋转编码器。整机由 5V/3A 适配器供电。
三、硬件清单
| 元器件 | 数量 | 说明 |
|---|---|---|
| STM32F103C8T6 最小系统板 | 1 | 主控 MCU,72MHz Cortex-M3 |
| 0.96 寸 OLED 显示屏 | 1 | IIC 接口,128×64 分辨率 |
| EC11 旋转编码器 | 1 | 参数快速调节 |
| 独立按键 | 5 | 通道选择、模式切换、启动/停止 |
| 5V 继电器模块 | 1 | 三路低电平触发,驱动喷雾泵 |
| 5V 喷雾器模块 | 3 | USB 微型喷雾泵,三通道独立 |
| 5V/3A 电源适配器 | 1 | 整机供电 |
| 外壳 + 亚克力支架 | 1 | 结构固定 |
IO 资源分配
// 按键:PA1、PA3、PA5、PA6、PA7
// 旋转编码器:PB14(A)、PB13(B)、PB12(SW)
// 继电器输出:PA0(通道1)、PA2(通道2)、PA4(通道3)
// OLED:SCL-PB1、SDA-PB0
四、软件设计
4.1 主循环
main.c 主要负责:
- 初始化延时、串口、GPIO、定时器、OLED
- 扫描按键与旋转编码器
- 切换页面与设置模式
- 进入运行状态后,由定时器中断接管喷雾逻辑
#include "stm32f10x.h"
#include "delay.h"
#include "usart1.h"
#include "timer.h"
#include "timer2.h"
#include "oled.h"
#include "show.h"
#include "key.h"
#include "sw.h"
int main(void)
{
u8 key;
Delay_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Usart1_Init(9600);
SW_Init(); // 继电器 GPIO 初始化
KEY_Init(); // 按键 GPIO 初始化
TIM1_ENABLE(); // 编码器扫描定时器
TIM2_ENABLE(); // 喷雾控制定时器
OLED_Init();
OLED_Clear();
page_one(); // 进入参数设置页面
while (1)
{
key = KEY_Scan(0);
if (key == KEY0_PRES) { /* 选择通道1 / 复位 */ }
else if (key == KEY1_PRES) { /* 选择通道2 / 复位 */ }
else if (key == KEY2_PRES) { /* 选择通道3 / 复位 */ }
else if (key == KEY3_PRES) { /* 切换速度档 / 总开关 */ }
else if (key == KEY4_PRES) { /* 进入运行页面 */ }
else if (key == SW_PRES) { /* 切换模式页 */ }
Delay_Ms(100);
}
}
4.2 喷雾控制核心逻辑
喷雾周期由 TIM2 中断实现,每 5ms 进一次中断。核心变量:
one_weight / two_weight / three_weight:标本重量one_hanshuilv / ...:目标含水率(0~1)one_penwutime / ...:喷雾时间,由公式自动换算one_jiangetime / ...:间隔时间(分钟)
// 喷雾时间计算:根据重量和含水率换算
one_penwutime = one_weight / (float)(1 - one_hanshuilv) * one_hanshuilv * 200;
运行状态下的状态机:
if (one_work_time == 0) one_status = 0;
else if (one_work_time <= one_penwutime + 1 && one_kaiguan)
one_status = 1; // 正在喷雾
else if (one_work_time > one_penwutime + 1 &&
one_work_time < one_jiangetime * 60 && one_kaiguan)
one_status = 0; // 间隔等待
else if (one_work_time >= one_jiangetime * 60 && one_kaiguan)
{
one_work_time = 0;
one_status = 1; // 开始下一轮喷雾
}
// 根据 status 驱动继电器
if (one_status == 0) WATER1_OFF;
else WATER1_ON;
4.3 继电器驱动
三路继电器分别接到 PA0、PA2、PA4,低电平触发:
#define WATER1_ON GPIO_SetBits(GPIOA, GPIO_Pin_0)
#define WATER1_OFF GPIO_ResetBits(GPIOA, GPIO_Pin_0)
#define WATER2_ON GPIO_SetBits(GPIOA, GPIO_Pin_2)
#define WATER2_OFF GPIO_ResetBits(GPIOA, GPIO_Pin_2)
#define WATER3_ON GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define WATER3_OFF GPIO_ResetBits(GPIOA, GPIO_Pin_4)
五、原理图与 PCB
5.1 原理图

5.2 PCB 版图

PCB 采用单面板设计,尺寸紧凑,预留了 STM32 最小系统板、OLED、继电器、按键和编码器的接口。
六、功能特点
| 功能 | 说明 |
|---|---|
| 三通道独立 | 每路可独立设置喷雾时间、间隔、含水率、重量 |
| 自动换算 | 输入重量和含水率后,系统自动计算喷雾时长 |
| 本地显示 | 0.96 寸 OLED 菜单,运行状态一目了然 |
| 便捷操作 | 5 按键 + EC11 旋转编码器,参数调节效率高 |
| 一键启停 | KEY3 控制总开关,KEY4 进入运行界面 |
| 成本可控 | 整机 BOM 约 130 元,适合小批量复制 |
七、项目总结
这个项目虽然硬件简单,但完整覆盖了嵌入式小产品的常见要素:
- GPIO 控制:按键输入、继电器输出
- 定时器中断:周期性任务调度
- 人机交互:OLED 菜单 + 编码器
- 电源与结构:适配器供电、外壳固定
- 交付闭环:原理图、PCB、Gerber、源码、BOM 齐全
对于想接海外小单或者做独立硬件产品的同学来说,这类“控制器 + 执行器 + 本地交互”的模板非常实用。
资料下载
完整资料包含:
- STM32 工程源码(Keil / HAL 风格标准库工程)
- 原理图 PDF
- PCB 版图 PDF
- Gerber 压缩包
- 硬件清单 BOM
资料链接见博客侧边栏头像下方的 资料链接(下载图标)处。
通过网盘分享的文件:Post37嵌入式-STM32智能标本喷洒系统(首次远渡重洋出国,定时喷雾) 链接: https://pan.baidu.com/s/1BwkkAZhkzo4Oa0z8CrH80g?pwd=gi4j 提取码: gi4j


