搜索
bottom↓
回复: 119

继续试验:LED感光

[复制链接]

出0入0汤圆

发表于 2008-8-10 11:49:02 | 显示全部楼层 |阅读模式
看了《普通LED作为传感器 (附 原理图 源代码) 》URL:http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=859325&bbs_page_no=1&bbs_id=1000之后,动手试验了一下,根据我试验的结果,原帖中用AD转换的方法还是不好的,用电平判断会好很多。经过修改后,现在LED可以稳定感光了。

-------------------------------------------------------
原理图:
AVR M8,片内RC 8M,5V供电
用一个3mm透明红色LED作为感光LED:正极接PC.0,负极过330欧电阻接PC.1
用一个3mm透明红色LED作为指示LED:正极接PC.3,负极过330欧电阻到地
--------------------------------------------------------
实现效果:
用手或其他物体遮挡住感光LED(比如指触),让其接收环境光量减弱,指示LED就会点亮,正常暴露在环境下,指示LED熄灭。修改代码后,效果非常稳定可靠。
--------------------------------------------------------
代码逻辑:
这个已经有很多文章介绍过了:
1、用一个IO口给感光LED加反向偏置,然后撤销反偏,此时结电容上有电荷,并开始慢慢放电。
2、撤销反偏瞬间,将这个IO口设置为输入,这样可以读取到高电平,在结电容上的电荷放电到一定程度后,这个IO口可以读取到低电平
3、根据照射到感光LED的光线强弱,IO口从高电平到低电平的时间是不同的(光电效应导致放电速度不同),根据这个时间,即可判断出环境光强度

有很多代码在加反偏之前要加正偏,从原理分析并经过试验,我认为这主要是为了闪光提示,对实际的使用没有影响。我在代码中也注释掉了这段。
--------------------------------------------------------

出0入0汤圆

 楼主| 发表于 2008-8-10 11:51:44 | 显示全部楼层
经过测试,在我所处的环境光下,感光LED反偏放电时间在20ms左右,用手遮挡之后,放电时间达到40多ms,差别巨大,可以轻松判断出来。

源码如下:
#include <avr/io.h>

typedef unsigned char UCHAR;
typedef unsigned int UINT;
////////////////////////////////////////////////////////////////////////////
//
// 延时函数
//
void Delay100us(UCHAR c)
{
        while(c--)
        {
                UCHAR i;
                for(i=0;i<65;i++) asm("nop;");
        }
}
////////////////////////////////////////////////////////////////////////////
//
// LED感光操作
//
// LED正极接PC.0,负极过330欧电阻接PC.1
//
#define                LED_P_O()        DDRC|=0x01                //输出

#define                LED_P_H()        PORTC|=0x01        //高电平
#define                LED_P_L()        PORTC&=~0x01        //低电平

#define                LED_N_O()        DDRC|=0x02                //输出
#define                LED_N_I()        DDRC&=~0x02        //输入

#define                LED_N_H()        PORTC|=0x02        //高电平 或上拉
#define                LED_N_L()        PORTC&=~0x02        //低电平 或无上拉

#define                LED_N_S()        (PINC&0x02)        //状态

#define         LED_ON()                PORTC|=0b00001000
#define         LED_OFF()                PORTC&=~0b00001000

UINT LedScan(void)
{
        UINT i;
        //设置端口方向
        LED_P_O();  
    LED_N_O();

        //加正偏,这里我去掉了正偏逻辑
    //LED_P_H();
    //LED_N_L();
    //Delay100us(10);

        //加反偏
    LED_P_L();
    LED_N_H();
    Delay100us(10);
       
        //加零偏
    LED_P_L();

        //设置为输入
    LED_N_I();
    LED_N_L();

        //检测放电时间
        for(i=0;i<10000 && LED_N_S();i++) Delay100us(1);

        return i;
}
////////////////////////////////////////////////////////////////////////////
//
//    主函数
//
#define        SCANDIF        100
#define INITCNT        100
int main(void)
{
        UCHAR        i;
        UINT        GateValue,ScanValue;
   
        OSCCAL=0XA8;

        //指示LED位于PC.3
        DDRC=0b00001000;               

        //建立LED感应阈值
        LED_ON();
        GateValue=0;
        LedScan();                //空读一次
        for(i=0;i<INITCNT;i++)
        {
                GateValue += LedScan();
        }
        GateValue/=INITCNT;
        LED_OFF();

    while(1)
    {
        ScanValue = LedScan();

        if( ScanValue<GateValue+SCANDIF)
        {
                        LED_OFF();
                }
        else
        {
                        LED_ON();
        }
            Delay100us(100);
        }
}

WINAVR 00优化编译出716字节

出0入0汤圆

 楼主| 发表于 2008-8-10 11:54:53 | 显示全部楼层
试验注意事项:
   指示LED对于感光LED具有直接影响,因此实际设计时,位置要考虑好,我开始试验时总是一闪一闪的,原因就在于指示LED亮了之后,感光LED就会被指示LED照射,从而认为环境光线变强,造成误判断。我用黑色胶布裹住感光LED的侧面和底部,避免旁边的指示LED光线窜扰后,解决了这个问题。
   另外,这个LED并非感应手指,而是感应光线,因此手不一定要碰到LED,只要遮住了光源(比如窗户)到LED之间的路线就会动作。因此,这个玩意作为触摸开关还需要反复考虑逻辑,但是作为路灯自动开关之类的感应头,倒是不错。

出0入0汤圆

发表于 2008-8-10 12:53:33 | 显示全部楼层
请看论坛外文文献PDF

红色LED放电周期是200us左右,有光照(同款LED做背景灯,或强光(台灯15cm距离照射))则可以在200us内放电到逻辑0以下IO读取为零。无光照则远大于200us。
由于不能做到全黑,所以LED电容放电有周期现象。

通过监测5个放电周期,3个放电周期小于200us就判定为真零。

检测速度要快和稳定很多!

---个人失败经历-原因不详---
如果LED接线过长,且光照不强,容易检测是有人体‘感应’影响。即手从侧面(甚至背面接近也会有检测反应)

出0入0汤圆

发表于 2008-8-10 15:30:34 | 显示全部楼层
普通的LED也行么
头像被屏蔽

出0入0汤圆

发表于 2008-8-10 16:53:38 | 显示全部楼层
Cool !

出0入0汤圆

发表于 2008-8-10 19:19:38 | 显示全部楼层
超亮红色透明封装LED最好。

背景光最好是同一个发光波长LED。

出0入0汤圆

发表于 2008-8-10 19:35:16 | 显示全部楼层
又有人来玩这个了?
收藏做个参考,

之前也用51做过这个实验,能实现效果.

准备过几天做个矩阵式的来当触摸开关.

(原文件名:IMG_0842.jpg)

出0入0汤圆

发表于 2008-8-10 19:41:59 | 显示全部楼层
引用自
【3楼】 mljda 技术是人性
-----------------------------------------------------------------------------------------------------------------------
---个人失败经历-原因不详---
如果LED接线过长,且光照不强,容易检测是有人体‘感应’影响。即手从侧面(甚至背面接近也会有检测反应)
-----------------------------------------------------------------------------------------------------------------------

刚开始做实验时,直接插在面包板上,十几厘米的连接线. 手放过去就马上开始闪了..

出0入0汤圆

 楼主| 发表于 2008-8-10 19:48:03 | 显示全部楼层
谢谢3楼的提示,确实,这是一段试验代码,目的要找出各种情况下的放电时间,实际不需要检测这么久,只要到了指定时间还没有放电完毕即可认定结果并退出。

下面是试验电路,说明一下:
1、在旧板子上试验,垃圾器件比较多,实际有效的只是两个二极管,两个电阻
2、原先是为了模仿原帖,所以接在PORTC端口,以便进行AD转换,实际上不用
3、图中我装了一高一低,恰恰是大忌,低端的LED发光刚好照射高处LED的底部,不得不用黑胶布包裹起来。。。


(原文件名:IMG393.jpg)

出0入0汤圆

发表于 2008-8-10 19:54:31 | 显示全部楼层
NB,马上试试。

出0入0汤圆

发表于 2008-8-10 19:56:40 | 显示全部楼层
有什么实用的价值吗?

出0入0汤圆

发表于 2008-8-10 21:09:23 | 显示全部楼层
关键字 LedTouch,LightTalkII,LED通信,led按钮

论坛相关帖子都有实验记录!

实用,就是各自推广的问题了。

出0入0汤圆

 楼主| 发表于 2008-8-10 22:00:23 | 显示全部楼层
谢谢LS的,搜索到了你的帖子,用来做扫描仪确实不错!一管二用,呵呵。
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1337063&bbs_page_no=1&search_mode=1&search_text=LightTalkII&bbs_id=9999

我实验的录像:
点击此处下载 ourdev_373933.rar(文件大小:589K) (原文件名:MOV013.rar)

可以看到,无论是用手摸管还是手的影子遮住了管子,都能感应到(实际的感应值是不一样的),这个东东做触摸按钮,需要解决的问题还有不少,但是应该可以挖掘出更加有趣的应用。

出0入0汤圆

发表于 2008-8-10 22:20:14 | 显示全部楼层
做感应,也许它天生就不足。
头像被屏蔽

出0入0汤圆

发表于 2008-8-11 09:58:38 | 显示全部楼层
请问这东西晚上能用吗?

出0入0汤圆

发表于 2008-8-11 10:58:05 | 显示全部楼层
makeup!

出0入0汤圆

发表于 2008-8-11 11:29:40 | 显示全部楼层
假如用PB3作为检测,LED放电,LED反充,检测PB3
......
PORTB|=(1<<PB3); //反充
DDRB&=~(1<<PB3); //PB3方向
PORTB&=~(1<<PB3);//PB3无上拉
第2和第3次序不可颠倒,否则电荷被放掉再改为输入就检测不出。
另外就是LED放电时间不一致,即使是同一条包装的贴片LED也不同。成批应用比较麻烦

出0入0汤圆

发表于 2008-8-11 16:10:29 | 显示全部楼层
关注一下 看看是否有实用的价值

出0入0汤圆

发表于 2008-8-13 12:40:15 | 显示全部楼层
关注
头像被屏蔽

出0入0汤圆

发表于 2008-8-18 11:31:38 | 显示全部楼层
不行,不知道楼主是否发现这东西,对手有感应现象,手还没到那里,就发现有变化了
头像被屏蔽

出0入0汤圆

发表于 2008-8-18 11:50:53 | 显示全部楼层
我摸了PCB他就有反应,这是为什么

出0入0汤圆

发表于 2008-8-18 12:13:29 | 显示全部楼层
楼上是正常的。建议减小电阻,增加LED放电时间。

出0入0汤圆

发表于 2008-8-18 13:41:36 | 显示全部楼层
简单的说这个原理就是利用LED反向的结电容充电,在通过LED反向漏电进行放电,根据放电时间计算结电容,判断不同光线强度下的结电容大小。对不对?
头像被屏蔽

出0入0汤圆

发表于 2008-8-18 14:25:20 | 显示全部楼层
楼上的大哥,我已经将限流电阻减到200欧了,还是一摸PCB,LED的放电时间就改变?能否详细指导下?

出0入0汤圆

发表于 2008-8-18 15:29:22 | 显示全部楼层
请看论坛原理性文章。

只要不摸焊点是不会有问题的。

‘感应’干扰要自己慢慢摸。我也是半路出家,没有原则性建议。

出0入0汤圆

发表于 2008-8-18 22:49:42 | 显示全部楼层
关注...

出0入0汤圆

发表于 2009-3-7 21:31:07 | 显示全部楼层
不知道用51怎样?我用51,没有结果!不知道是啥原因?请高手指教!

出0入0汤圆

发表于 2009-3-8 12:50:57 | 显示全部楼层
呵呵,mljda 技术是人性是专家啊
不知生意如何了呢
呵呵

出0入45汤圆

发表于 2009-3-8 13:55:33 | 显示全部楼层
27楼XIAOHAO 你用什么的51,这个电路要求I/O口可以设置成高阻输入的,普通的51不能用,你可以用STC的12C系列的试

出0入0汤圆

发表于 2009-3-8 21:57:29 | 显示全部楼层
比较关注这个话题,从原理上讲,LED 感光是运用了半导体的光电效应原理,做起来有两种基本方法,一种就是楼上所说,先用 PN 结的结电容存储上电荷,然后通过光电效应产生的光电流进行释放,释放速度取决与光电流大小,光电流大小取决与外部光照强度;另一种方法是通过 A/D 直接测量光电效应产生的电压大小,该电压随环境光强度不同而不同,从 几十毫伏 到 一点几伏,变化范围很大;

通过其他帖子了解到的一款产品,叫 "light talk",感觉有点意思,淘宝网卖 300多吧,可以把 LED排 当扫描仪用,把画在纸上的图案扫描进去,再挥显出来,挺好玩的,不知到有谁做成了没有?

出0入0汤圆

发表于 2009-3-8 22:06:22 | 显示全部楼层
我分析它的原理,应该是这样的:

  假这个产品有 8 个LED并排成一排,我们编上号

  1 2 3 4 5 6 7 8

  在第1毫秒时间内,让 1 3 5 7 发光照射纸面, 2 4 6 8 做输入感应纸上的反射光强度,通过设定合适阀值把感应的光强量化成“黑”“白”像素,完成 4 个像素的扫描;
  
  <1> 2 <3> 4 <5> 6 <7> 8

  在第2毫秒时间内,让 2 4 6 8 发光照射纸面, 1 3 5 7 做输入感应纸上的反射光强度,通过设定合适阀值把感应的光强量化成“黑”“白”像素,完成 4 个像素的扫描;

  这样,2毫秒过去了,就完成了一列 8 个像素的扫描;
  
  继续扫描第二列,第三列,....

出0入0汤圆

发表于 2009-3-9 12:49:00 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-4-1 19:09:04 | 显示全部楼层
【29楼】 lyp103   我用的是AT89s52 用STC的?我对的印象不太好,酷似容易坏!所以就没有使用那个,还有什么芯片可以?能不能简单的介绍几个!谢啦!

出0入0汤圆

发表于 2009-6-23 11:34:28 | 显示全部楼层
俺用的透明白光LED,线也引得比较长,拿手捏住就显示放电时间为几毫秒了。
普通亮度放电200ms左右(亮光照射时为几十);拿手捂住竟然数到N秒以上~(囧~好慢)。

不过能判断有无光了,谢谢LZ的代码。

出0入0汤圆

发表于 2009-8-8 22:38:16 | 显示全部楼层
收藏收藏

出0入0汤圆

发表于 2009-9-4 22:33:05 | 显示全部楼层
留个记号

出0入10汤圆

发表于 2009-9-5 09:52:38 | 显示全部楼层
记下了

出0入0汤圆

发表于 2009-9-5 10:27:56 | 显示全部楼层
有点意思~ 回去试试

出0入0汤圆

发表于 2009-9-5 11:30:27 | 显示全部楼层
有意思,记号先

出0入0汤圆

发表于 2009-9-5 11:40:07 | 显示全部楼层
不错

出0入0汤圆

发表于 2009-9-5 13:01:49 | 显示全部楼层
呆会也做个玩玩看一下

出0入0汤圆

发表于 2009-9-26 00:49:34 | 显示全部楼层
好资料啊 mark

出0入0汤圆

发表于 2009-9-26 11:02:26 | 显示全部楼层
学习,学习

出0入0汤圆

发表于 2009-9-26 11:25:01 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-9-26 15:17:29 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-10-2 22:10:10 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-10-3 11:04:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-3 13:19:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-24 22:51:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-25 08:29:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-25 13:00:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-28 22:27:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-28 22:42:53 | 显示全部楼层
好玩的啊!

出100入0汤圆

发表于 2009-12-29 08:56:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-18 18:36:59 | 显示全部楼层
回复【楼主位】LRNAVR
-----------------------------------------------------------------------

敢问楼主  制作时有用到外部晶振没?

出0入0汤圆

发表于 2010-4-18 21:53:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-19 18:09:53 | 显示全部楼层
mark低先

出0入0汤圆

发表于 2010-4-19 18:25:31 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2010-4-19 18:30:14 | 显示全部楼层
太厉害了,大开眼界,在ouravr总是能让人_大开眼界

出0入0汤圆

发表于 2010-4-19 18:40:48 | 显示全部楼层
mark

出0入50汤圆

发表于 2010-4-21 17:10:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-21 20:53:41 | 显示全部楼层
代替光敏

出0入0汤圆

发表于 2010-4-26 20:05:14 | 显示全部楼层
回复【3楼】 mljda 技术是人性
可能是你的avr没有外接上拉电阻……虽然有内部上拉电阻,但驱动不够……引线过长是就需要上拉电阻了吧…只要是靠近IO口接led就有会有效果…

出0入0汤圆

发表于 2010-4-26 21:28:09 | 显示全部楼层
谁做过用LED点阵的啊?

出0入0汤圆

发表于 2010-4-27 11:36:27 | 显示全部楼层
mark.

出0入0汤圆

发表于 2010-4-27 11:39:41 | 显示全部楼层
有意思吗?

出0入0汤圆

发表于 2010-4-27 16:38:04 | 显示全部楼层
怎么没意思?收藏了。

出0入0汤圆

发表于 2010-7-6 02:10:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-6 02:31:29 | 显示全部楼层
记号~~

出0入0汤圆

发表于 2010-7-6 09:16:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-6 10:54:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-6 11:37:38 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-7-6 12:25:10 | 显示全部楼层
学习了~~~

出0入0汤圆

发表于 2010-10-15 15:53:18 | 显示全部楼层
收藏了

出0入0汤圆

发表于 2010-11-20 15:14:18 | 显示全部楼层
有没有人用stm8单片机实现过?

出0入0汤圆

发表于 2010-12-29 22:28:20 | 显示全部楼层
这样也行,学习!

出0入0汤圆

发表于 2010-12-30 09:10:55 | 显示全部楼层
,ark

出0入0汤圆

发表于 2010-12-30 11:28:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-30 17:43:16 | 显示全部楼层
mark

出0入16汤圆

发表于 2010-12-30 18:14:29 | 显示全部楼层
mark

出0入8汤圆

发表于 2010-12-30 19:08:02 | 显示全部楼层
记号记号~

出0入0汤圆

发表于 2011-1-13 11:07:16 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-1-28 10:16:31 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-1-29 21:03:40 | 显示全部楼层
收藏

出0入0汤圆

发表于 2011-1-31 11:41:03 | 显示全部楼层
哈哈  这个原理我研究过   上面说是电容放电但本人的观点是光感原理  ,把发光管正负极接到万用表的MV档   在有光线的地方量下,绿色的能达到1.2V  我经过反复试验  貌似用AD来采集光线和驱动发光,在加个放电电阻

出0入0汤圆

发表于 2011-3-25 12:37:57 | 显示全部楼层
今天让我服了

出0入0汤圆

发表于 2011-3-25 13:02:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-21 10:30:44 | 显示全部楼层
收藏

出0入0汤圆

发表于 2011-4-21 10:44:11 | 显示全部楼层
cool

出0入0汤圆

发表于 2011-4-21 12:33:24 | 显示全部楼层
呵呵,不错,做个小夜灯不错

出0入0汤圆

发表于 2011-4-21 18:47:08 | 显示全部楼层
收藏!有时间试试。

出0入0汤圆

发表于 2011-5-21 09:45:49 | 显示全部楼层
mark

出100入0汤圆

发表于 2011-5-21 10:50:06 | 显示全部楼层
记号~学习~~

出0入0汤圆

发表于 2011-5-21 13:15:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-22 15:00:28 | 显示全部楼层
MARK~

出0入0汤圆

发表于 2011-5-22 19:54:27 | 显示全部楼层
给力

出0入0汤圆

发表于 2011-5-22 21:48:45 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-5-23 10:58:16 | 显示全部楼层
good

出0入0汤圆

发表于 2011-6-2 20:27:54 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 13:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表