站内搜索
发作品签到
冬季电加热发热片激光剑手把路亚竿鱼竿
专业版

冬季电加热发热片激光剑手把路亚竿鱼竿

简介

针对冬季钓鱼戴手套操作不灵活,不戴手套又会特别冷导致手僵硬。特意开发此套件

简介:针对冬季钓鱼戴手套操作不灵活,不戴手套又会特别冷导致手僵硬。特意开发此套件
发热片暖冬开源挑战赛

开源协议

GPL 3.0

创建时间:2025-10-14 20:10:36更新时间:2025-12-01 10:45:06

描述

视频链接:

B站视频--功能演示及介绍

项目简介

冬季玩路亚,戴手套不方便操作,不戴手套手很快就冻僵了。为了解决这个烦恼,特意做了一款可以电加热的路亚竿手柄。

项目功能

为了做小体积,把所有东西都装到手把节中,主控采用了STC8G1K08A

整个系统采用两节18650供电,并通过78L05降压提供5V给主控供电

通过一个NTC来获取实时温度

通过PID算法输出PWM信号控制MOS管来实现恒温

外部通过一个按键提供交互,上电默认无输出,长按开关机,短按切换温度,一共预设三个档位,40/50/60

通过一个分压电路配合单片机内部1.19V的基准电压实时获取电池电压,当电压低于7.2V限制最低档运行,低于6V关闭输出,保护电池不会过放

外接一个WS2812B的三色LED灯珠用来显示档位和运行状态,配合透明玻纤竿稍可以让整个杆子发光。

项目参数

  • 本设计设计ADC测量电池电压,在低电压情况下强制关闭输出保护电池;
  • 本设计采用NTC测量实时温度,并通过简单算法实现恒温
  • 选用WS2812B可编程LED显示状态

原理解析(硬件说明)

项目实现
主控STC8G1K08A
image.png

系统5V供电
image.png

按键上拉,按下下拉
image.png

ADC测量电池电压
image.png

NTC测量实时温度
image.png

2812BRGB LED灯显示状态
image.png

调温MOS
image.png

项目功能

简单测试例程,PID调温暂时没有测试

#include "intrins.h"

// 定义IO口
sbit KEY = P5^4;      // 按键输入P5.4
sbit WS2812B = P5^5;  // WS2812B数据线P5.5
// P3.3将用作CCP/PWM输出,由硬件控制

// 档位定义
#define GEAR_1 0
#define GEAR_2 1
#define GEAR_3 2

// 颜色定义 (GRB格式)
#define COLOR_GREEN 0x00FF00  // 绿色
#define COLOR_YELLOW 0xFFFF00 // 黄色  
#define COLOR_RED 0xFF0000    // 红色

// PWM周期定义 (基于65535)
#define PWM_PERIOD 1000  // PWM周期

// 全局变量
unsigned char current_gear = GEAR_1;  // 当前档位
bit key_flag = 0;                     // 按键标志
unsigned int key_count = 0;           // 按键计时

// 函数声明
void Delay_us(unsigned int us);
void Delay_ms(unsigned int ms);
void GPIO_Init(void);
void CCP_PWM_Init(void);
void Timer0_Init(void);
void WS2812B_WriteByte(unsigned char dat);
void WS2812B_WriteColor(unsigned long color);
void Key_Scan(void);
void Set_Gear(unsigned char gear);

// 微秒延时函数
void Delay_us(unsigned int us)
{
    while(us--)
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
}

// 毫秒延时函数  
void Delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 1000; j++);
}

// GPIO初始化
void GPIO_Init(void)
{
    // P3.3设置为CCP/PWM输出
    // STC8G的P3.3可以作为CCP1/PCA1/PWM输出
    P3M0 |= 0x08;  // P3.3推挽输出
    P3M1 &= ~0x08;
    
    // P5.5推挽输出(WS2812B)
    P5M0 |= 0x20;
    P5M1 &= ~0x20;
    
    // P5.4准双向口(按键输入,内部上拉)
    P5M0 &= ~0x10;
    P5M1 &= ~0x10;
    P5 |= 0x10;   // 设置上拉
}

// CCP/PWM初始化 - 使用PCA模块的CCP功能
void CCP_PWM_Init(void)
{
    // PCA模块初始化
    CCON = 0x00;    // 清除CF标志,停止PCA计数器
    CMOD = 0x02;    // PCA时钟源 = Fosc/2,禁止PCA溢出中断
    
    // PCA模块0用于PWM输出(对应P3.3)
    CCAPM1 = 0x42;  // PCA模块1工作于8位PWM模式,无中断
    
    // 设置PWM周期和初始占空比
    CH = 0;
    CL = 0;
    
    // 初始占空比30%
    CCAP1H = (unsigned char)(PWM_PERIOD * 0.30);
    CCAP1L = CCAP1H;
    
    // 启动PCA计数器
    CR = 1;  // 启动PCA计数器
}

// 定时器0初始化(用于按键扫描)
void Timer0_Init(void)
{
    AUXR |= 0x80;   // 定时器0为1T模式
    TMOD &= 0xF0;   // 设置定时器0为16位自动重装
    TL0 = 0xCD;     // 设置定时初值
    TH0 = 0xD4;     // 10ms@11.0592MHz
    TR0 = 1;        // 启动定时器0
    ET0 = 1;        // 使能定时器0中断
    EA = 1;         // 开总中断
}

// WS2812B写一个字节
void WS2812B_WriteByte(unsigned char dat)
{
    unsigned char i;
    for(i = 0; i < 8; i++)
    {
        if(dat & 0x80)
        {
            WS2812B = 1;
            _nop_(); _nop_(); _nop_(); _nop_();
            _nop_(); _nop_(); _nop_(); _nop_();
            WS2812B = 0;
            _nop_(); _nop_();
        }
        else
        {
            WS2812B = 1;
            _nop_(); _nop_();
            WS2812B = 0;
            _nop_(); _nop_(); _nop_(); _nop_();
            _nop_(); _nop_(); _nop_(); _nop_();
        }
        dat <<= 1;
    }
}

// WS2812B写颜色(GRB格式)
void WS2812B_WriteColor(unsigned long color)
{
    unsigned char i;
    // 发送GRB数据,24位
    for(i = 0; i < 24; i++)
    {
        if(color & 0x800000)
        {
            WS2812B = 1;
            _nop_(); _nop_(); _nop_(); _nop_();
            _nop_(); _nop_(); _nop_(); _nop_();
            WS2812B = 0;
            _nop_(); _nop_();
        }
        else
        {
            WS2812B = 1;
            _nop_(); _nop_();
            WS2812B = 0;
            _nop_(); _nop_(); _nop_(); _nop_();
            _nop_(); _nop_(); _nop_(); _nop_();
        }
        color <<= 1;
    }
}

// 按键扫描
void Key_Scan(void)
{
    static unsigned char key_state = 0;
    
    switch(key_state)
    {
        case 0: // 等待按键按下
            if(KEY == 0)
            {
                key_state = 1;
                key_count = 0;
            }
            break;
            
        case 1: // 消抖确认
            if(KEY == 0)
            {
                key_count++;
                if(key_count >= 2) // 20ms消抖
                {
                    key_state = 2;
                    key_flag = 1;  // 按键有效
                }
            }
            else
            {
                key_state = 0;
            }
            break;
            
        case 2: // 等待按键释放
            if(KEY == 1)
            {
                key_state = 0;
            }
            break;
    }
}

// 设置档位
void Set_Gear(unsigned char gear)
{
    current_gear = gear;
    
    switch(gear)
    {
        case GEAR_1: // 一档:绿色,PWM 30%
            CCAP1H = (unsigned char)(PWM_PERIOD * 0.30);
            CCAP1L = CCAP1H;
            WS2812B_WriteColor(COLOR_GREEN);
            break;
            
        case GEAR_2: // 二档:黄色,PWM 60%
            CCAP1H = (unsigned char)(PWM_PERIOD * 0.60);
            CCAP1L = CCAP1H;
            WS2812B_WriteColor(COLOR_YELLOW);
            break;
            
        case GEAR_3: // 三档:红色,PWM 90%
            CCAP1H = (unsigned char)(PWM_PERIOD * 0.90);
            CCAP1L = CCAP1H;
            WS2812B_WriteColor(COLOR_RED);
            break;
    }
    
    // WS2812B复位
    WS2812B = 0;
    Delay_us(50);
}

// 定时器0中断服务函数(10ms按键扫描)
void Timer0_ISR() interrupt 1
{
    Key_Scan();  // 每10ms执行一次按键扫描
}

// 主函数
void main(void)
{
    // 初始化
    GPIO_Init();
    CCP_PWM_Init();  // 初始化CCP/PWM
    Timer0_Init();
    
    // 上电默认一档
    Set_Gear(GEAR_1);
    
    while(1)
    {
        // 检测按键标志
        if(key_flag)
        {
            key_flag = 0;
            
            // 循环切换档位
            current_gear++;
            if(current_gear > GEAR_3)
            {
                current_gear = GEAR_1;
            }
            
            Set_Gear(current_gear);
        }
        
        // 主循环其他任务
        Delay_ms(10);
    }
}

组装流程

image.png

image.png

image.png

image.png

image.png

image.png

实物图

image.png

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
暂无数据
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航