Алгоритм автоматического управления светом в санузле. Модель.
Oct 04, 2018 12:51
Пока ко мне едут датчики движения, релюшки и прочая электронная ерунда, решил смакетировать алгоритм управления светом в санузле. В качестве среды взял Лазаря. Для всяких мелких программулек - самое то. Это бесплатная и свободная кросс-платформенная реинкарнация Borland Delphi с Object Pascal и визуальной средой разработки. Правда я в свое время лет 10 на Delphi профессионально программировал и никаких трудностей с Лазарем у меня не возникло. В итоге настрогал программульку, которая эмулирует два датчика, содержит кнопки одновременного управления ими, показывает включен или нет свет:
Исходники для Лазаруса под катами. Подсветку синтаксиса делал вот этим он-лайн инструментиком. [main.pas]
private procedure SetSomebodyInside(AValue: boolean); private // last door status FDoorPrevOpened: boolean; // light on/off FLightOn: boolean; // somebody inside FSomebodyInside: boolean; // short auto-off timer FAutoOffShort: TTime; FAutoOffLong: TTime;
procedure LightOn(); procedure LightOff();
property SomebodyInside: boolean read FSomebodyInside write SetSomebodyInside; public
end;
var Form1: TForm1;
implementation
{$R *.lfm} uses DateUtils;
{ TForm1 }
procedure TForm1.Timer1Timer(Sender: TObject); var aTime: TTime; aDoorOpened, aMotion: boolean; begin // store time aTime := Time(); Panel1.Caption:= TimeToStr(aTime) ;
// check sensor status aDoorOpened := CheckBox1.Checked; aMotion := CheckBox2.Checked;
// дверь открыта if aDoorOpened then begin // была открыта ранее, статус двери не поменялся if FDoorPrevOpened then begin // если фиксируем движение - значит кто-то вошел - включаем свет if aMotion then LightOn() // никого нет или затаился с открытой дверью - если свет горит, то проверяем таймер автовыключения и выключаем свет, если время кончилось else if FLightOn and (FAutoOffShort <> 0) and (MilliSecondsBetween(FAutoOffShort, aTime) > StrToInt(Edit1.Text)) then LightOff(); end // была ранее закрыта, значит - открывают, включаем свет else LightOn(); // при открытой двери сбрасываем присутствие SomebodyInside:= false;
end else begin // дверь закрыта // была открыта ранее, значит дверь закрыли if FDoorPrevOpened then begin // если фиксируем движение - значит кто-то закрыл дверь изнутри SomebodyInside := aMotion; // включаем свет и перезапускаем таймеры if SomebodyInside then LightOn() else // никого нет - выключаемся LightOff(); end // была ранее тоже закрыта else begin // движение перезапускает таймеры и включает свет, если кто-то есть if aMotion then begin if FSomebodyInside then LightOn(); // а если никого не завфиксировали при закрытии двери - значит это кошка, не реагируем end else // иначе, если свет горел - то выключим по длинному таймеру if FLightOn and (FAutoOffLong <> 0) and (MilliSecondsBetween(FAutoOffLong, aTime) > StrToInt(Edit2.text)) then LightOff();
end; end; // запомним статус двери FDoorPrevOpened:=aDoorOpened;
end;
procedure TForm1.SetSomebodyInside(AValue: boolean); begin if FSomebodyInside=AValue then Exit; FSomebodyInside:=AValue;
CheckBox3.Checked:=FSomebodyInside;
end;
procedure TForm1.FormCreate(Sender: TObject); begin // sensor status FDoorPrevOpened:= CheckBox1.Checked; SomebodyInside:= false; // light on/off LightOff(); end;
procedure TForm1.Button1Click(Sender: TObject); begin CheckBox1.Checked:=true; CheckBox2.Checked:=false; end;
procedure TForm1.Button2Click(Sender: TObject); begin CheckBox1.Checked:=true; CheckBox2.Checked:=true; end;
procedure TForm1.Button3Click(Sender: TObject); begin CheckBox1.Checked:=false; CheckBox2.Checked:=true; end;
procedure TForm1.Button4Click(Sender: TObject); begin CheckBox1.Checked:=false; CheckBox2.Checked:=false; end;
procedure TForm1.LightOn(); begin // перезапускаем таймеры FAutoOffShort:= Time(); FAutoOffLong:= Time(); if not FLightOn then begin FLightOn:=true; // включаем свет Panel1.Color := clYellow; end; end;
procedure TForm1.LightOff(); begin // сбрасываем таймеры FAutoOffShort:= 0; FAutoOffLong:= 0; if FLightOn then begin FLightOn:=false; // выключаем свет Panel1.Color := clBlack; end; end;