Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. class Relay{
  2. private:
  3. byte _pin;
  4. public:
  5. boolean status;
  6. Relay(byte pin = 0){
  7. if (pin !=0){init(pin);}
  8. }
  9. void init(byte pin){
  10. _pin = pin;
  11. pinMode(_pin,OUTPUT);
  12. }
  13. void set(boolean val){
  14. if (status != val)
  15. {
  16. digitalWrite(_pin,val);
  17. status = val;
  18. }
  19. }
  20. void flip(){
  21. if(status == HIGH){
  22. set(LOW);
  23. } else {
  24. set(HIGH);
  25. }
  26. }
  27. };
  28. class Sensor{
  29. private:
  30. byte _pin;
  31. public:
  32. int pVal,val;
  33. Sensor(byte pin = 0){
  34. if (pin !=0){init(pin);}
  35. }
  36. void init(byte pin){
  37. _pin = pin;
  38. pinMode(_pin,INPUT);
  39. }
  40. int get(){
  41. pVal = val;
  42. val = digitalRead(_pin);
  43. return val;
  44. }
  45. };
  46.  
  47. class TimerRelay : public Relay
  48. {
  49. public:
  50. boolean isNeed;
  51. byte factor;
  52. unsigned long timer;
  53. unsigned long minTime;
  54. unsigned long maxTime;
  55. TimerRelay(byte pin,byte _factor,unsigned long _minTime,unsigned long _maxTime):Relay(pin){
  56. factor = _factor;
  57. isNeed = LOW;
  58. minTime = _minTime;
  59. maxTime = _maxTime;
  60. }
  61. void setTimer(unsigned long lightTime){// в методо передаем длительность сколько работал свет
  62. unsigned long temp;
  63. temp = lightTime*factor;
  64. Serial.print("temp1 ");
  65. Serial.println(temp);
  66. if (temp>maxTime){temp = maxTime;}
  67. if (temp<minTime){temp = minTime;}
  68. Serial.print("temp2 ");
  69. Serial.println(temp);
  70. temp = temp+millis();
  71. if (temp>timer){timer = temp;}
  72. Serial.print("temp3 ");
  73. Serial.println(temp);
  74. }
  75. };
  76.  
  77. class SmartRoom{
  78. private:
  79. byte _doorPin;//пин дверей
  80. byte _relayPin;//пин реле
  81. byte _pirPin;//пин PIR датчика
  82. public:
  83. boolean needLight;
  84. unsigned long lightPeriod;// сколько было включено время
  85. unsigned long doorDelay;//делей ожидания датчика движения после закрытия двери в миллисекундах
  86. unsigned long doorTimer;//время в после которого отлавливать движение
  87. unsigned long doorTime[2]; //время в которое открылась/закрылась дверь в милисекундах с запуска кода
  88. unsigned long lightTime[2]; //время в которое включился/выключился свет в милисекундах с запуска кода
  89. Relay light;//создаем объект реле для света
  90. Sensor pir;//создаем объект сенсора для пир датчика
  91. Sensor door;//создаем объект сенсора для датчика дверей
  92. //constructor
  93. SmartRoom(byte pirPin, byte relayPin, byte doorPin, unsigned long _doorDelay){//пин PIR датчика, пин реле света, пин датчика двери, пин реле вытяжки, множитель времени в течении которого работает вытяжка = время которое был включен свет*fanFactor
  94. _doorPin = doorPin;
  95. _relayPin = relayPin;
  96. _pirPin = pirPin;
  97. doorDelay = _doorDelay;
  98. needLight = LOW;
  99. door.init(_doorPin);
  100. pir.init(_pirPin);
  101. light.init(_relayPin);//инициализируем реле света на нужный пин
  102. light.set(LOW);
  103. }
  104. boolean getDoorStatus(){
  105. door.get();//считываем состояние двери во временную переменную
  106. if (door.val != door.pVal){//чекаем изменилось ли состояние двери
  107. doorTime[door.val] = millis();//запоминаем время в которое закрыли дверь
  108. doorTimer = doorTime[1] + doorDelay;
  109.  
  110. }
  111. return door.val;
  112. }
  113. boolean getPirStatus(){
  114. if (pir.get() == HIGH ) {
  115. if (getDoorStatus() == HIGH && millis()>doorTimer)
  116. {
  117. needLight = HIGH;
  118. } else {
  119. needLight = LOW;
  120. }
  121. }
  122. //pirStatus = digitalRead(_pirPin);
  123. return pir.val;
  124. }
  125. void setLight(boolean state){
  126. if (state != light.status) {//сверили новый статус со старым
  127. lightTime[state] = millis();//запомнили время активации определенного статуса(в массиве 0 -время деактивации, 1 - время активации)
  128. if (state == LOW) {
  129. lightPeriod = lightTime[0] - lightTime[1];//если выключился свет вычисляем сколько времени в миллисекундах был включен свет
  130. }
  131. light.set(state);//если изменился применили
  132. }
  133. }
  134.  
  135. };
  136. //определяем переменные
  137. SmartRoom toilet(2,11,5,30000);//byte pirPin, byte relayPin, byte doorPin, unsigned long _doorDelay
  138. SmartRoom bathroom(3,10,6,30000);//byte pirPin, byte relayPin, byte doorPin, unsigned long _doorDelay
  139. unsigned long fanTimer = 0;//время в которое нужно отключить вытяжку после выключения света, в милисекундах
  140. boolean fanOff = LOW;//нужно ли выключать вытяжку
  141. byte fanPin = 9;//подключаем вытяжку на 9 пин
  142. TimerRelay fan(fanPin,2,30000,1800000);// byte pin,byte _factor,unsigned long _minTime,unsigned long _maxTime
  143.  
  144. //начало программы
  145. void setup()
  146. {
  147. Serial.begin(9600);
  148. }
  149. void loop()
  150. {
  151. //контроллер туалетной комнаты
  152. toilet.getDoorStatus();//чекаем датчики
  153. if(toilet.getPirStatus() == HIGH){//Если PIR датчик сработал - включаем свет
  154. toilet.setLight(HIGH);
  155. fan.set(HIGH);
  156. fan.isNeed = HIGH;
  157. } else if(!toilet.needLight && toilet.light.status == HIGH ){//Если пир датчик в состоянии LOW, проводим проверку, нужно ли выключать свет
  158. toilet.setLight(LOW);//вырубаем свет
  159. fan.setTimer(toilet.lightPeriod);
  160. fan.isNeed = LOW;
  161. }
  162. //\контроллер туалетной комнаты
  163. //контроллер ванной комнаты
  164. bathroom.getDoorStatus();//чекаем датчики
  165. if(bathroom.getPirStatus() == HIGH){//Если PIR датчик сработал - включаем свет
  166. bathroom.setLight(HIGH);
  167. fan.set(HIGH);
  168. fan.isNeed = HIGH;
  169. } else if(!bathroom.needLight && bathroom.light.status == HIGH ){//Если пир датчик в состоянии LOW, проводим проверку, нужно ли выключать свет
  170. bathroom.setLight(LOW);//вырубаем свет
  171. fan.setTimer(bathroom.lightPeriod);
  172. fan.isNeed = LOW;
  173. }
  174. if(!fan.isNeed && millis()>fan.timer){//если запрошено отключение вытяжки и настало время ее выключения - выключаем
  175. fan.set(LOW);
  176. fan.isNeed = HIGH;// и сбрасываем запрос на отключение
  177. }
  178. delay(10);
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement