Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Relay{
- private:
- byte _pin;
- public:
- boolean status;
- Relay(byte pin = 0){
- if (pin !=0){init(pin);}
- }
- void init(byte pin){
- _pin = pin;
- pinMode(_pin,OUTPUT);
- }
- void set(boolean val){
- if (status != val)
- {
- digitalWrite(_pin,val);
- status = val;
- }
- }
- void flip(){
- if(status == HIGH){
- set(LOW);
- } else {
- set(HIGH);
- }
- }
- };
- class Sensor{
- private:
- byte _pin;
- public:
- int pVal,val;
- Sensor(byte pin = 0){
- if (pin !=0){init(pin);}
- }
- void init(byte pin){
- _pin = pin;
- pinMode(_pin,INPUT);
- }
- int get(){
- pVal = val;
- val = digitalRead(_pin);
- return val;
- }
- };
- class TimerRelay : public Relay
- {
- public:
- boolean isNeed;
- byte factor;
- unsigned long timer;
- unsigned long minTime;
- unsigned long maxTime;
- TimerRelay(byte pin,byte _factor,unsigned long _minTime,unsigned long _maxTime):Relay(pin){
- factor = _factor;
- isNeed = LOW;
- minTime = _minTime;
- maxTime = _maxTime;
- }
- void setTimer(unsigned long lightTime){// в методо передаем длительность сколько работал свет
- unsigned long temp;
- temp = lightTime*factor;
- Serial.print("temp1 ");
- Serial.println(temp);
- if (temp>maxTime){temp = maxTime;}
- if (temp<minTime){temp = minTime;}
- Serial.print("temp2 ");
- Serial.println(temp);
- temp = temp+millis();
- if (temp>timer){timer = temp;}
- Serial.print("temp3 ");
- Serial.println(temp);
- }
- };
- class SmartRoom{
- private:
- byte _doorPin;//пин дверей
- byte _relayPin;//пин реле
- byte _pirPin;//пин PIR датчика
- public:
- boolean needLight;
- unsigned long lightPeriod;// сколько было включено время
- unsigned long doorDelay;//делей ожидания датчика движения после закрытия двери в миллисекундах
- unsigned long doorTimer;//время в после которого отлавливать движение
- unsigned long doorTime[2]; //время в которое открылась/закрылась дверь в милисекундах с запуска кода
- unsigned long lightTime[2]; //время в которое включился/выключился свет в милисекундах с запуска кода
- Relay light;//создаем объект реле для света
- Sensor pir;//создаем объект сенсора для пир датчика
- Sensor door;//создаем объект сенсора для датчика дверей
- //constructor
- SmartRoom(byte pirPin, byte relayPin, byte doorPin, unsigned long _doorDelay){//пин PIR датчика, пин реле света, пин датчика двери, пин реле вытяжки, множитель времени в течении которого работает вытяжка = время которое был включен свет*fanFactor
- _doorPin = doorPin;
- _relayPin = relayPin;
- _pirPin = pirPin;
- doorDelay = _doorDelay;
- needLight = LOW;
- door.init(_doorPin);
- pir.init(_pirPin);
- light.init(_relayPin);//инициализируем реле света на нужный пин
- light.set(LOW);
- }
- boolean getDoorStatus(){
- door.get();//считываем состояние двери во временную переменную
- if (door.val != door.pVal){//чекаем изменилось ли состояние двери
- doorTime[door.val] = millis();//запоминаем время в которое закрыли дверь
- doorTimer = doorTime[1] + doorDelay;
- }
- return door.val;
- }
- boolean getPirStatus(){
- if (pir.get() == HIGH ) {
- if (getDoorStatus() == HIGH && millis()>doorTimer)
- {
- needLight = HIGH;
- } else {
- needLight = LOW;
- }
- }
- //pirStatus = digitalRead(_pirPin);
- return pir.val;
- }
- void setLight(boolean state){
- if (state != light.status) {//сверили новый статус со старым
- lightTime[state] = millis();//запомнили время активации определенного статуса(в массиве 0 -время деактивации, 1 - время активации)
- if (state == LOW) {
- lightPeriod = lightTime[0] - lightTime[1];//если выключился свет вычисляем сколько времени в миллисекундах был включен свет
- }
- light.set(state);//если изменился применили
- }
- }
- };
- //определяем переменные
- SmartRoom toilet(2,11,5,30000);//byte pirPin, byte relayPin, byte doorPin, unsigned long _doorDelay
- SmartRoom bathroom(3,10,6,30000);//byte pirPin, byte relayPin, byte doorPin, unsigned long _doorDelay
- unsigned long fanTimer = 0;//время в которое нужно отключить вытяжку после выключения света, в милисекундах
- boolean fanOff = LOW;//нужно ли выключать вытяжку
- byte fanPin = 9;//подключаем вытяжку на 9 пин
- TimerRelay fan(fanPin,2,30000,1800000);// byte pin,byte _factor,unsigned long _minTime,unsigned long _maxTime
- //начало программы
- void setup()
- {
- Serial.begin(9600);
- }
- void loop()
- {
- //контроллер туалетной комнаты
- toilet.getDoorStatus();//чекаем датчики
- if(toilet.getPirStatus() == HIGH){//Если PIR датчик сработал - включаем свет
- toilet.setLight(HIGH);
- fan.set(HIGH);
- fan.isNeed = HIGH;
- } else if(!toilet.needLight && toilet.light.status == HIGH ){//Если пир датчик в состоянии LOW, проводим проверку, нужно ли выключать свет
- toilet.setLight(LOW);//вырубаем свет
- fan.setTimer(toilet.lightPeriod);
- fan.isNeed = LOW;
- }
- //\контроллер туалетной комнаты
- //контроллер ванной комнаты
- bathroom.getDoorStatus();//чекаем датчики
- if(bathroom.getPirStatus() == HIGH){//Если PIR датчик сработал - включаем свет
- bathroom.setLight(HIGH);
- fan.set(HIGH);
- fan.isNeed = HIGH;
- } else if(!bathroom.needLight && bathroom.light.status == HIGH ){//Если пир датчик в состоянии LOW, проводим проверку, нужно ли выключать свет
- bathroom.setLight(LOW);//вырубаем свет
- fan.setTimer(bathroom.lightPeriod);
- fan.isNeed = LOW;
- }
- if(!fan.isNeed && millis()>fan.timer){//если запрошено отключение вытяжки и настало время ее выключения - выключаем
- fan.set(LOW);
- fan.isNeed = HIGH;// и сбрасываем запрос на отключение
- }
- delay(10);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement