写在前面:本文章用来记录自己设计制作家用厕位感应器的经过,中篇主要是项目实践部分。
我在做项目时,一般都按照先硬件后软件、先电源后局部的逻辑去设计。
硬件部分:
首先是电源部分,先分析下总电源和各个电路部分所需的电源:
室内室外系统,各自由一个交流220v转直流5v的手机充电器提供总电源。单片机和2.4G模块都需要使用3.3v的直流电,由于功耗不是太大,使用单片机最小系统开发板上的LDO线性稳压器来供电即可。另外就是室内红外检测电路使用直流5V进行供电,室外LED指示灯使用直流5V进行供电,因为这两个部分的功耗相对来说较大,避免LDO驱动能力不足,故都直接采用5v系统。
有了稳定的电源系统做基础,接下来就要设计各个部分电路了。
室内外进行通信都要使用到的2.4G模块,我使用的是成都泽耀nRF24L01P的无线模块的样品,它的使用手册上给出了电路推荐图:
除了电源和地之外,其他的引脚都直接接到STC8的io引脚上,由于mcu系统和无线模块系统都是3.3v,不需要再进行电平匹配,直接连接即可。具体某个引脚管什么用,可以参考手册进行研究,如果没有时间,直接使用官方例程,定义对应引脚即可上手操作。
接下来再分析室内检测使用红外检测人体的部分,这个部分是系统的关键,它是一切有效信号的来源。简单来讲,这部分电路就是使用了一个红外发射管和一个红外接收管,由单片机控制发射管周期性发出调制信号,使用调制红外信号的好处是通信距离远。若有人体等障碍物,调制红外信号就会被反射回来,被红外接收管接收到,发出有人的信号给单片机。若前方没有人,则调制红外信号被反射回来的光很少很弱,红外接收管几乎接收不到,发出无人的信号给单片机。除此之外,我在一些公厕发现,人家用的小便感应器,中间会有个红色的指示灯在闪动,不太清楚人家为啥都加个红色的指示灯,我为了便于查看红外发射管的工作频率和工作状态,故选择往红外发射管回路上并联一个红色的LED灯珠,这样当红灯闪时,就证明红外发射管在发射红外光。
红外发射电路比较简单,通过一个9013三极管控制红外和led工作,由单片机发出pwm信号去控制三极管的基极。红外发射管我用的型号是IR204C-A,最大工作电流100mA。其中R1的阻值可以做适当的调整,要是红外发射距离短,就把阻值调小点,把红外的功耗提上去就行。
红外接收电路,我用的是IRM-3638T接收头,这个是一个38KHZ解调的红外接收头,其中2脚为地,3脚是电源,不知道为啥它手册上有个R4电阻,大家有没有知道它的作用,为啥不直接接上电源?下面是一个电容,提高稳定性。1脚是信号输出,它输出的5V或0v的高低电平,但是单片机的IO是3.3v的电平,故采用一个上拉电阻和二极管进行电平匹配。
室内就这样了,接下来讨论室外的LED指示电路。
一个LED亮度不够,我采用5个LED并联的方式,使用一个三极管进行控制,单片机控制基极,控制是否点亮LED。其中红LED表示有人,绿LED表示无人,由两个IO分别控制。
接下来就是单片机最小系统板了。由一个LDO稳压电路,一个工作指示灯电路和单片机最小系统组成。其他的引脚对应选用io,引脚足够。
硬件部分做好后,就开始上软件代码了。
软件部分:
首先是单片机的底层驱动部分,我是用的stc官方给的lib库,格式有点像ST的风格,再结合上例程部分,上手很快。主要使用到的也就是GPIO的驱动功能,来控制io和检测输入io的信号电平。另外,还使用了定时器部分,主要是用来实现PWM输出功能。
2.4g无线模块通信部分,我是直接使用的芯片提供的51单片机例程,搬过来把io定义下,它内部我简单看了下,就是一个模拟spi通信的功能。平时芯片是接收模式,需要发送数据时,切换为发送模式,调用发送函数即可,发送完立即切换为接收模式。接收到数据帧后,进行数据的判断,确认信号是否有效,以及是否需要做出应答。
PWM输出是通过定时器,输出占空比为50%、频率为38khZ的波形。我在网上查到,这个占空比好像越小越好,越小的话,红外发射管工作的时间短,这样功率可以达到最大值,这点解释我没看明白,大家有没有懂得?我没搞懂,就按照50%的占空比做的,实际效果理想,也就没有再深究。
这个pwm我做的是开400ms,然后关100ms,这样通过红led可以发现是一闪一闪的,也就是周期性的工作。然后另一个定时器,1s去查询下输入io,有没有检测到反射的红外信号,若连续5次都检测到,则认为有人,否则认为没人。当状态发生改变后,去通过无线发出信号,告诉室外的系统。室外的系统收到信号后,进行指示灯的切换。
软件控制逻辑不复杂,在此不再展开详细讨论,若由需要,联系我可以提供源码进行讨论。
接下来就是焊板,优化程序,然后安装测试了。
效果展示部分:
整体安装效果: