楼梯上下口各设置一个感应开关,有人上时,灯从下往上亮,有人下时,灯从上往下亮,同时有人,灯从两边往中间亮。感谢平台好友的指导。需要什么设备来实现这个控制系统?
用单片机系统就可以实现这样的功能。前提是你需要懂单片机的知识,会使用C语言编程。
你可以使用两个红外反射型光电二极管,用来检测是否有人通过,然后把检测到的开关信号送给单片机。单片机再通过继电器,可控硅等器件来控制LED灯或其它灯具实现你想要达到的目的。
如果你觉得用单片机太麻烦,你还可以用plc可编程控制器,就是成本高一些,并且你也会plc的编程。
控制器通过三极管输出控制LED灯带的电源,当上下楼梯的两个红外传感器检测到有人体靠近时,则按照时间先后依次输出导通LED,延时一段时间之后,再依次断开LED灯带。
通过我们自定义的中文编程指令实现起来比较麻烦,不易理解。
因此,直接修改控制器的程序实现了这一功能。
下图是客户用按键模拟测试该功能,当按键闭合时,三极管输出按顺序闭合,延时之后,按顺序反向断开。
正如题目所说,难度在于,当两边同时有人下来或上去时,需要从两边往中间亮,再从中间开始灭,这个需要用一些比较特殊的数据结构和算法。
通过三极管输出的LED指示灯可以很直观看到整个控制过程。
以下部分是实现该功能的单片机程序代码,用了一些算法。
U16 lednum;
U8 i,ni;
U8 j;
U16 offtimer;
U16 ontimer;
U8 pos;
U8 hasadd;
U8 triggerflag = 0;
U16 pertimer;
U32 flags;
U8 dectime;
if((g_sw_stRegs[0].m_uchState)
|| (g_sw_stRegs[1].m_uchState)){
switchtimer = 15;
}
if(g_tm_stTimerFlag.Bits.bTimer100ms){
if(switchtimer > 0){
switchtimer --;
}
}
if((g_sw_stRegs[0].m_uchTrigger)
&& (g_sw_stRegs[0].m_uchState))
{
triggerflag = 1;
}
if((g_sw_stRegs[1].m_uchTrigger)
&& (g_sw_stRegs[1].m_uchState))
{
triggerflag = 2;
}
if(CT_GET_VAR(100)
CT_WRITE_VAR(100, 1);
}
if(CT_GET_VAR(100) > 32){
CT_WRITE_VAR(100, 32);
}
if(CT_GET_VAR(101)
CT_WRITE_VAR(101, 1);
}
if(triggerflag > 0){
lednum =(U8)CT_GET_VAR(100);
pertimer = (U16)CT_GET_VAR(101);
for(i = 0; i
ni = i;
if(triggerflag == 2){
ni = lednum - 1 - i;
}
ontimer = (U16)i * pertimer;
offtimer = ontimer + (U16)lednum * pertimer + CT_GET_VAR(102);
CT_WRITE_VAR(160, ontimer);
CT_WRITE_VAR(161, offtimer);
pos = 0;
hasadd = FALSE;
for(j = 0; j
{
if(led_stcon[ni].ledslot[j].used == TRUE){
if((led_stcon[ni].ledslot[j].ontimer
&& (led_stcon[ni].ledslot[j].offtimer
{
led_stcon[ni].ledslot[j].offtimer = offtimer;
hasadd = TRUE;
break;
}
}else{
if(pos
pos = j + 1;
}
}
}
if(hasadd == FALSE){
if(pos > 0){
led_stcon[ni].ledslot[pos - 1].ontimer = ontimer;
led_stcon[ni].ledslot[pos - 1].offtimer = offtimer;
led_stcon[ni].ledslot[pos - 1].used = TRUE;
}
}
}
}
if(g_tm_stTimerFlag.Bits.bTimer100ms){
flags = 0;
for(i = 0; i
hasadd = FALSE;
ni = i;
for(j = 0; j
{
if(led_stcon[ni].ledslot[j].used == TRUE){
dectime = FALSE;
if(fnUser_AllZeros())
{
if(switchtimer == 0){
dectime = TRUE;
}
}else
{
dectime = TRUE;
}
if(dectime){
if(led_stcon[ni].ledslot[j].ontimer > 0){
led_stcon[ni].ledslot[j].ontimer --;
}
if(led_stcon[ni].ledslot[j].offtimer > 0)
{
led_stcon[ni].ledslot[j].offtimer --;
}
}
if(0 == led_stcon[ni].ledslot[j].ontimer){
if(0 == led_stcon[ni].ledslot[j].offtimer){
led_stcon[ni].ledslot[j].used = FALSE;
}else{
hasadd = TRUE;
}
}
}
}
CT_WRITE_VAR(120 + i, hasadd);
if(hasadd == TRUE){
flags |= (1
}
}
CT_WRITE_VAR(159, flags);
}
if(g_tm_stTimerFlag.Bits.bTimer1s)
{
fnUser_CalEnv();
}
if(g_user_stRegs.m_uchFlag)
{
for(i = 0; i
{
g_ct_uiVarComp[VARS_SYSTEM_OFFSET_INCOUNT + i] = g_user_stRegs.m_uchXTCount;
g_ct_uiVarComp[VARS_SYSTEM_OFFSET_INCOUNT + XRNUM + i] += g_user_stRegs.m_uchXTCount;
}
g_user_stRegs.m_uchFlag = FALSE;
}