Врядли это подойдет под понятие простого но коментировать лень. Код автоматически управляет светом по датчику движения.
#define out_lamp 13
#define in_door 12
#define in_mov 2
long int N;
char prev_door,status;
char moving,block,in_door_read;
static os_timer_t esp_timer_scan,esp_timer_wait; // глобально объявим таймер esp_timer
// sensors_param.cfgdes[0] режим работы 0 выкл, 1 вкл 2 автоматический
// sensors_param.cfgdes[1] время через которое будет автоматическое выключение
// valdes[0] status
// valdes[1] режим работы для обратной связи
// valdes[2] таймаут для обратной связи
void ICACHE_FLASH_ATTR block_off()
{
block=0;
}
void ICACHE_FLASH_ATTR scan_inp()
{
valdes[1]=sensors_param.cfgdes[0];
valdes[2]=sensors_param.cfgdes[1];
if (sensors_param.cfgdes[0]==0) // если выключено
{digitalWrite(out_lamp,0);
valdes[0]=0;
}
if (sensors_param.cfgdes[0]==1) // если режим включено
{digitalWrite(out_lamp,1);
valdes[0]=1;
}
if ((sensors_param.cfgdes[0]==2)&&(block==0)) // если режим автоматический
{
moving=digitalRead(in_mov);
if (moving==1)
{
N=0;
digitalWrite(out_lamp,1);
valdes[0]=1;
}
in_door_read=digitalRead(in_door);
if (in_door_read==1)
{
if (prev_door==0)
{
N=0;
digitalWrite(out_lamp,1);
valdes[0]=1;
}
}
prev_door=in_door_read;
}
}
void ICACHE_FLASH_ATTR
startfunc(){
sensors_param.cfgdes[0]=2; // автоматический
if (sensors_param.cfgdes[1]>1000) {sensors_param.cfgdes[1]=30;}
// выполняется один раз при старте модуля.
os_timer_disarm(&esp_timer_scan);
os_timer_setfn(&esp_timer_scan, (os_timer_func_t *)scan_inp, NULL); // таймер для опроса датчика 10 раз в секунду
os_timer_arm(&esp_timer_scan, 100, 1); // 100 миллисекунд. 1 - многократно. 0 -однократно.
}
void ICACHE_FLASH_ATTR
timerfunc(uint32_t timersrc) {
// выполнение кода каждую 1 секунду
if ((digitalRead(out_lamp))&&(sensors_param.cfgdes[0]==2)) // если лампа горит и режим работы автоматический
{N++; // подсчет секунд
if (N>=sensors_param.cfgdes[1]) // сравниваем с таймаутом
{
N=0;
digitalWrite(out_lamp,0);
valdes[0]=0;
block=1; // установка блокировки и таймера сброса блокировки
os_timer_disarm(&esp_timer_wait);
os_timer_setfn(&esp_timer_wait, (os_timer_func_t *)block_off, NULL); // read_esp -функцию, которую нужно вызвать по таймеру.
os_timer_arm(&esp_timer_wait, 500, 0); // 0.5 секунд. 1 - многократно. 0 -однократно.
}
}
if(timersrc%30==0){}
}
void webfunc(char *pbuf) {
os_sprintf(HTTPBUFF,"Это корридорный модуль<br>"); // вывод данных на главной модуля
os_sprintf(HTTPBUFF,"Он управляет светом в корридоре<br>");
os_sprintf(HTTPBUFF,"Code options 1 режим работы<br>");
os_sprintf(HTTPBUFF,"0 выкл 1 вкл 2 автоматический<br>");
os_sprintf(HTTPBUFF,"Code options 2 таймаут выключения<br>");
}