智能笔筒硬件软件设计

智能笔筒硬件软件设计

一、项目概述

设计一个多功能智能笔筒,具备自动分类、数量统计、防丢提醒、环境监测等功能。


二、硬件设计

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设计要点

  1. 尺寸:根据笔筒大小设计(建议10×10cm)
  2. 层数:双面板即可
  3. 接口:所有传感器使用排针连接
  4. 电源:5V和3.3V稳压电路
  5. 布局:传感器朝上,主控在底部

三、软件设计

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 核心功能

  1. 自动分类:识别铅笔、钢笔、马克笔等
  2. 数量统计:实时显示各类笔的数量
  3. 防丢提醒:笔被拿走时提醒
  4. 使用记录:记录每支笔的使用频率
  5. 低电量提醒:电池电量不足时提醒
  6. 蓝牙连接:手机APP远程查看

4.2 扩展功能

  1. 语音提醒:加入语音模块
  2. 无线充电:加入Qi无线充电
  3. 环境监测:加入温湿度传感器
  4. 自动排序:机械臂自动整理
  5. 云端同步:数据上传到云端

五、制作步骤

5.1 硬件组装

  1. 3D打印笔筒外壳
  2. 焊接电路板
  3. 安装传感器(红外、颜色、重量)
  4. 固定显示屏和按键
  5. 安装电池和充电模块

5.2 软件烧录

  1. 安装开发环境(Keil MDK)
  2. 编译代码
  3. 通过ST-Link下载程序
  4. 测试各模块功能

5.3 手机APP开发

  1. Android Studio开发环境
  2. 设计UI界面
  3. 实现蓝牙通信
  4. 测试连接功能

六、成本估算

项目 单价(元) 数量 小计(元)
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元

七、测试方案

  1. 单元测试:测试每个传感器
  2. 集成测试:测试整体功能
  3. 压力测试:长时间运行测试
  4. 用户体验测试:实际使用测试

八、项目文件结构

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开发。

 

专注于matlab/simulink,电子电路,编程