如何实现楼梯踏步灯用两个反射感应开关控制两台led编程控制器

发布日期:2023-01-06
如何实现楼梯踏步灯用两个反射感应开关控制两台led编程控制器

电工优优今天要和大家分享的如何实现楼梯踏步灯用两个反射感应开关控制两台led编程控制器相关信息,接下来我将从如何设计楼梯踏步,如何计算楼梯踏步,如何分楼梯踏步这几个方面来介绍。

 楼梯上下口各设置一个感应开关,有人上时,灯从下往上亮,有人下时,灯从上往下亮,同时有人,灯从两边往中间亮。感谢平台好友的指导。需要什么设备来实现这个控制系统?

用单片机系统就可以实现这样的功能。前提是你需要懂单片机的知识,会使用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;

}

以上就是"电工优优"为大家介绍的如何设计楼梯踏步的相关信息,想了解更多"如何实现楼梯踏步灯用两个反射感应开关控制两台led编程控制器,如何设计楼梯踏步,如何计算楼梯踏步,如何分楼梯踏步"相关知识,请收藏电工无忧吧。