智能笔筒硬件软件设计
一、项目概述
设计一个多功能智能笔筒,具备自动分类、数量统计、防丢提醒、环境监测等功能。
二、硬件设计
2.1 核心硬件清单
| 模块 | 型号 | 数量 | 功能 |
|---|---|---|---|
| 主控芯片 | STM32F103C8T6 | 1 | 核心控制器 |
| 称重传感器 | HX711模块 | 1 | 检测笔的重量 |
| 颜色传感器 | TCS34725 | 1 | 识别笔的颜色 |
| 红外传感器 | TCRT5000 | 4 | 检测笔的存在 |
| 显示屏 | OLED 0.96寸 | 1 | 显示信息 |
| 蓝牙模块 | HC-05/HC-06 | 1 | 手机连接 |
| 蜂鸣器 | 有源蜂鸣器 | 1 | 提醒功能 |
| LED灯 | WS2812 RGB | 4 | 氛围灯/指示 |
| 按键 | 轻触开关 | 3 | 功能选择 |
| 电源 | 18650电池+充电模块 | 1 | 供电 |
2.2 电路连接图
┌─────────────────────────────────────────┐
│ 智能笔筒系统框图 │
├─────────────────────────────────────────┤
│ 1. 主控:STM32F103C8T6 │
│ 2. 传感器模块: │
│ - HX711 (PB12, PB13) │
│ - TCS34725 (I2C: PB6, PB7) │
│ - TCRT5000×4 (PA0-PA3) │
│ 3. 显示模块: │
│ - OLED (I2C: PB6, PB7) │
│ 4. 通信模块: │
│ - HC-05 (USART1: PA9, PA10) │
│ 5. 输出模块: │
│ - 蜂鸣器 (PB8) │
│ - WS2812×4 (PB9) │
│ 6. 输入模块: │
│ - 按键×3 (PC13, PC14, PC15) │
│ 7. 电源模块: │
│ - 18650电池 │
│ - TP4056充电模块 │
└─────────────────────────────────────────┘
2.3 PCB设计要点
- 尺寸:根据笔筒大小设计(建议10×10cm)
- 层数:双面板即可
- 接口:所有传感器使用排针连接
- 电源:5V和3.3V稳压电路
- 布局:传感器朝上,主控在底部
三、软件设计
3.1 系统架构
┌─────────────────────────────────────────┐
│ 软件系统架构 │
├─────────────────────────────────────────┤
│ 应用层:用户界面、蓝牙通信、数据存储 │
│ 业务层:笔识别、分类算法、提醒逻辑 │
│ 驱动层:传感器驱动、显示驱动、通信驱动 │
│ 硬件层:STM32 HAL库、外设初始化 │
└─────────────────────────────────────────┘
3.2 主程序框架
// main.c
#include "main.h"
#include "sensors.h"
#include "display.h"
#include "bluetooth.h"
#include "storage.h"
// 全局变量
PenInfo pens[MAX_PENS]; // 笔信息数组
uint8_t pen_count = 0; // 当前笔数量
SystemState sys_state = STATE_NORMAL;
int main(void) {
// 1. 硬件初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
// 2. 外设初始化
OLED_Init();
HX711_Init();
TCS34725_Init();
Buzzer_Init();
WS2812_Init();
Bluetooth_Init();
// 3. 系统初始化
Load_Pen_Data(); // 从EEPROM加载数据
Show_Welcome_Screen();
// 4. 主循环
while (1) {
// 4.1 检测笔状态
Check_Pen_Status();
// 4.2 更新显示
Update_Display();
// 4.3 处理蓝牙命令
Process_Bluetooth_Data();
// 4.4 检查提醒
Check_Reminders();
// 4.5 处理按键
Process_Buttons();
HAL_Delay(100); // 100ms循环
}
}
3.3 核心功能模块
3.3.1 笔识别模块
// pen_detection.c
typedef struct {
uint8_t id; // 笔ID
uint8_t type; // 笔类型(铅笔/钢笔/马克笔)
uint32_t color; // 颜色值(RGB)
uint32_t weight; // 重量(mg)
uint8_t slot; // 所在槽位
time_t last_used; // 最后使用时间
} PenInfo;
uint8_t Detect_Pen(void) {
uint8_t new_pen_count = 0;
// 1. 红外检测
for (int i = 0; i < 4; i++) {
if (IR_Detect(i)) {
new_pen_count++;
}
}
// 2. 重量检测
uint32_t total_weight = HX711_Get_Weight();
uint8_t weight_count = total_weight / AVERAGE_PEN_WEIGHT;
// 3. 取两者最大值
pen_count = (new_pen_count > weight_count) ? new_pen_count : weight_count;
return pen_count;
}
void Classify_Pen(uint8_t slot) {
// 1. 颜色识别
RGBColor color = TCS34725_GetColor();
// 2. 重量测量
uint32_t weight = HX711_Get_Slot_Weight(slot);
// 3. 分类判断
PenType type = Classify_By_Features(color, weight);
// 4. 保存信息
Save_Pen_Info(slot, type, color, weight);
}
3.3.2 显示模块
// display.c
void Update_Display(void) {
OLED_Clear();
switch (display_mode) {
case MODE_HOME:
Show_Home_Screen();
break;
case MODE_STATISTICS:
Show_Statistics();
break;
case MODE_SETTINGS:
Show_Settings();
break;
}
}
void Show_Home_Screen(void) {
// 显示笔数量
OLED_ShowString(10, 0, "智能笔筒");
OLED_ShowString(10, 16, "笔数量:");
OLED_ShowNum(70, 16, pen_count, 2);
// 显示分类
OLED_ShowString(10, 32, "铅笔:");
OLED_ShowNum(50, 32, pencil_count, 2);
OLED_ShowString(80, 32, "钢笔:");
OLED_ShowNum(110, 32, pen_count, 2);
// 显示时间
OLED_ShowString(10, 48, Get_Time_String());
}
3.3.3 蓝牙通信模块
// bluetooth.c
void Bluetooth_Init(void) {
// 初始化串口
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&huart1);
}
void Process_Bluetooth_Data(void) {
uint8_t rx_data[50];
if (HAL_UART_Receive(&huart1, rx_data, 1, 10) == HAL_OK) {
switch (rx_data[0]) {
case 'S': // 获取状态
Send_Status();
break;
case 'L': // 获取笔列表
Send_Pen_List();
break;
case 'F': // 查找笔
Find_Pen(rx_data[1]);
break;
case 'A': // 设置提醒
Set_Reminder(rx_data[1]);
break;
}
}
}
void Send_Status(void) {
char buffer[100];
sprintf(buffer, "STATUS:%d,%d,%d,%d",
pen_count, pencil_count, pen_count, marker_count);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100);
}
3.3.4 提醒模块
// reminder.c
void Check_Reminders(void) {
// 1. 检查笔是否丢失
if (Check_Pen_Lost()) {
Trigger_Alarm(ALARM_LOST);
}
// 2. 检查长时间未使用
if (Check_Unused_Pen()) {
Trigger_Alarm(ALARM_UNUSED);
}
// 3. 检查低电量
if (Get_Battery_Level() < 20) {
Trigger_Alarm(ALARM_LOW_BATTERY);
}
}
void Trigger_Alarm(AlarmType type) {
switch (type) {
case ALARM_LOST:
Buzzer_Beep(3, 200, 100); // 响3次
WS2812_SetColor(255, 0, 0); // 红色
Send_Notification("有笔丢失!");
break;
case ALARM_UNUSED:
Buzzer_Beep(1, 500, 0); // 响1次
WS2812_SetColor(255, 255, 0); // 黄色
Send_Notification("有笔长时间未使用");
break;
}
}
3.4 手机APP设计(Android示例)
// MainActivity.java
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter bluetoothAdapter;
private BluetoothSocket bluetoothSocket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化蓝牙
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 连接笔筒
connectToPenHolder();
}
private void connectToPenHolder() {
// 搜索设备
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
for (BluetoothDevice device : pairedDevices) {
if (device.getName().equals("SmartPenHolder")) {
// 连接设备
ConnectThread connectThread = new ConnectThread(device);
connectThread.start();
break;
}
}
}
private void updatePenInfo() {
// 发送获取状态命令
String command = "S";
bluetoothSocket.getOutputStream().write(command.getBytes());
// 接收数据
byte[] buffer = new byte[1024];
int bytes = bluetoothSocket.getInputStream().read(buffer);
String response = new String(buffer, 0, bytes);
// 解析并显示
String[] parts = response.split(",");
runOnUiThread(() -> {
penCountText.setText("笔数量: " + parts[0]);
pencilCountText.setText("铅笔: " + parts[1]);
penCountText.setText("钢笔: " + parts[2]);
});
}
}
参考代码 智能笔筒硬件软件设计 www.youwenfan.com/contentcnt/160847.html
四、功能特性
4.1 核心功能
- 自动分类:识别铅笔、钢笔、马克笔等
- 数量统计:实时显示各类笔的数量
- 防丢提醒:笔被拿走时提醒
- 使用记录:记录每支笔的使用频率
- 低电量提醒:电池电量不足时提醒
- 蓝牙连接:手机APP远程查看
4.2 扩展功能
- 语音提醒:加入语音模块
- 无线充电:加入Qi无线充电
- 环境监测:加入温湿度传感器
- 自动排序:机械臂自动整理
- 云端同步:数据上传到云端
五、制作步骤
5.1 硬件组装
- 3D打印笔筒外壳
- 焊接电路板
- 安装传感器(红外、颜色、重量)
- 固定显示屏和按键
- 安装电池和充电模块
5.2 软件烧录
- 安装开发环境(Keil MDK)
- 编译代码
- 通过ST-Link下载程序
- 测试各模块功能
5.3 手机APP开发
- Android Studio开发环境
- 设计UI界面
- 实现蓝牙通信
- 测试连接功能
六、成本估算
| 项目 | 单价(元) | 数量 | 小计(元) |
|---|---|---|---|
| STM32F103C8T6 | 15 | 1 | 15 |
| HX711模块 | 8 | 1 | 8 |
| TCS34725 | 25 | 1 | 25 |
| TCRT5000 | 2 | 4 | 8 |
| OLED显示屏 | 12 | 1 | 12 |
| HC-05蓝牙模块 | 15 | 1 | 15 |
| WS2812 LED | 2 | 4 | 8 |
| 蜂鸣器 | 1 | 1 | 1 |
| 18650电池 | 10 | 1 | 10 |
| 充电模块 | 5 | 1 | 5 |
| PCB打样 | 30 | 1 | 30 |
| 总计 | 137元 |
七、测试方案
- 单元测试:测试每个传感器
- 集成测试:测试整体功能
- 压力测试:长时间运行测试
- 用户体验测试:实际使用测试
八、项目文件结构
Smart_Pen_Holder/
├── Hardware/
│ ├── Schematic/ # 原理图
│ ├── PCB/ # PCB设计文件
│ └── 3D_Model/ # 外壳3D模型
├── Software/
│ ├── STM32_Firmware/ # 单片机固件
│ │ ├── Core/
│ │ ├── Drivers/
│ │ ├── Sensors/
│ │ ├── Display/
│ │ └── Bluetooth/
│ └── Android_App/ # 手机APP
│ ├── app/
│ ├── src/
│ └── res/
└── Documentation/
├── User_Manual.pdf # 用户手册
└── Technical_Spec.pdf # 技术规格
智能笔筒设计方案,包含硬件选型、电路设计、软件编程和手机APP开发。