eleqian 发表于 2014-5-18 21:06:25

用STC15F104E做的LED小台灯(USB供电+3级触摸调光+掉电记忆)

本帖最后由 eleqian 于 2014-5-18 21:06 编辑

之所以做这个东西,是因为晚上关灯后电脑打字看不清键盘,盲打一时难以达到,于是买了个USB供电的LED灯。
虽然只有3个LED,但在漆黑的晚上还是觉得太亮,然后自己动手改装成可调光的了,用了几个月挺方便。

主要特点:
3级亮度(就是亮1、2、3个LED,非PWM无闪烁)
触摸控制(本来是做电容式的,实际上需要触碰到电极)
掉电状态记忆(比如亮2个LED,拔掉电再插上还是亮2个)
低功耗(手上只有104E用的空闲模式,如果用104W可以在掉电模式定时唤醒)

操作方法:
每次触摸切换灯状态(关 - 1个亮 - 2个亮 - 3个亮 - 关),长触摸直接关。

电路很简单,上图:

LED功率不大直接用IO驱动的,如果是大功率LED可以加MOS管驱动,这里简单起见没加。
触摸按键是经典的RC充放电(姑且认为是吧),R5起到一定保护作用。

触摸按键代码参考了论坛一个帖子,当时没记链接,抱歉:
// 测量引脚电平上升时间
static uint8_t Touch_Mes(void)
{
    uint8_t i;

    KEY_TOUCH = 0;// 拉低TOUCH口

    // 确保TOUCH口已经拉低,i控制溢出
    for (i = 255; i != 0; i--);
    for (i = 1; KEY_TOUCH && i; i++);

    TH0 = 0;      // 初始化TH0为0
    TL0 = 0;      // 初始化TL0为0
    TR0 = 1;      // 启动定时器
    KEY_TOUCH = 1;// 释放TOUCH口,此时TOUCH会慢慢升高电平
    // 等待电平升高到单片机所认为的高电平,i控制溢出
    for (i = 1; !KEY_TOUCH && i; i++);
    TR0 = 0;      // 停止计数器

    return TL0;
}

掉电记忆使用Flash一个扇区模拟EEPROM,有简易的磨损均衡算法:
// 保存配置
static void SaveCfg(void)
{
    uint16_t i;
    uint8_t dat;

    // 每次从扇区前面往后存,直到扇区全满时擦除重来
    for (i = 0; i < IAP_SEC_SIZE; i++) {
      dat = IAP_ReadByte(IAP_ADDR_BASE + i);
      if (dat == 0xff) {
            IAP_ProgramByte(IAP_ADDR_BASE + i, gLightStatus);
            return;
      }
    }

    // 扇区全满
    IAP_EraseSector(IAP_ADDR_BASE);
    IAP_ProgramByte(IAP_ADDR_BASE, gLightStatus);
}

// 读取配置
static void LoadCfg(void)
{
    uint16_t i;
    uint8_t dat;

    // 从扇区后面往前查找最近的配置
    for (i = IAP_SEC_SIZE; i > 0; i--) {
      dat = IAP_ReadByte(IAP_ADDR_BASE + i - 1);
      if (dat < LED_STATUS_MAX) {
            gLightStatus = dat;
            return;
      }
    }

    gLightStatus = LED_STATUS_1;
}

再贴几张实物照片:



直接飞线的看起来有点乱,触摸位置就是尾部粘的那块铝箔。

最关键的,原理图和源码工程:

饭桶 发表于 2014-5-18 21:16:32

触摸设计的不错      

wangpengcheng 发表于 2014-5-18 21:20:48

不错哦!

深圳-蓝天 发表于 2014-5-18 21:22:19

赞!学习了......

dlmaowf 发表于 2014-5-18 21:24:54

学习了{:victory:}

sgzzour 发表于 2014-5-18 21:25:26

赞一个,触摸部分真心不错。

cbailjc 发表于 2014-5-18 21:32:41

我用stm8s003也做了个触摸,效果很烂,虽然可以开关,但是跟几毛钱的触摸芯片比起来差太多

eleqian 发表于 2014-5-18 21:44:28

cbailjc 发表于 2014-5-18 21:32
我用stm8s003也做了个触摸,效果很烂,虽然可以开关,但是跟几毛钱的触摸芯片比起来差太多 ...

stm8s用触摸库我觉得挺方便的,只测试了下灵敏度还不错

aammoo 发表于 2014-5-18 23:02:42

直接接个拨动开关多省事

颜靖峰 发表于 2014-5-19 19:14:34

触碰正解啊,我需要。

ayumi8 发表于 2014-5-23 14:29:44

非常感谢 非好好的 一个小玩意

shejian001 发表于 2014-5-25 12:32:24

B不错,很实用。

judge 发表于 2014-5-25 16:08:28

谢谢分享

HYLG 发表于 2014-5-25 16:24:21

很实用的小东西。谢谢楼主分享。

xxzzhy 发表于 2014-5-25 16:49:52

有创意。我也整个玩玩。

roberzhao 发表于 2015-12-24 10:08:38

好,真牛,有时间 也搞个玩下

runapp 发表于 2015-12-26 23:01:09

这个厉害,不过还是希望能有pwm的。但是又担心频率上不去对眼睛有伤害

kkey 发表于 2015-12-31 02:12:18

PWM频率高一点应该看不到闪

wkman 发表于 2015-12-31 08:26:56

{:titter:}{:lol:} 偶还是喜欢遥控灯,,,懒得起来,冬天冷啊,,,{:titter:}

tangly2017 发表于 2019-8-26 09:55:15

下载了,好好学习,谢谢楼主的分享
页: [1]
查看完整版本: 用STC15F104E做的LED小台灯(USB供电+3级触摸调光+掉电记忆)