fork(8) download
  1. #include <Wire.h> // Библиотека шины
  2. #include <LiquidCrystal_I2C.h> // Библиотека дисплея
  3. #include <dht11.h> // Библиотека датчика температуры и влажности воздуха
  4. #include <OneWire.h> // Библиотека датчика температуры почвы
  5. #include "Sodaq_DS3231.h" // Библиотека часов реального времени
  6.  
  7. LiquidCrystal_I2C lcd(0x3f,20,4); // Установка адреса и размерности дисплея
  8.  
  9. int VlazhnVozd; // Переменная влажности воздуха
  10. int TempVozd; // Переменная температуры воздуха
  11. int VlazhPoch = 0; // влажность почвы
  12. dht11 DHT; // переменная типа DHT для датчика температуры и влажности воздуха
  13. int chk; // Переменная проверки датчика температуры и влажности воздуха
  14. byte i; // для датчика температуры почвы
  15. byte DataVozd[12]; // Данные для датчика температуры почвы
  16. byte AddrVozd[8] = {0x28, 0xFF, 0x32, 0xD1, 0x64, 0x15, 0x1, 0xB7}; // Адрес для датчика температуры почвы
  17. int TempPochv; // Переменная температуры почвы
  18. char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  19. int FlagNaborVoda = 0; // Флажок, определяющий, что вода в этот час уже набиралась
  20. int FlagPoliva = 0; // Флажок, определяющий, что полив в этот час уже был
  21. unsigned long Vremya = 0; // Переменная для определения времени подсветки дисплея
  22. int MotorTest = 0; // Переменная для включения теста моторов
  23. int Konts; // переменная для определения концевика
  24.  
  25.  
  26.  
  27. // """Настройки"""
  28.  
  29. //DateTime dt(2016, 9, 29, 9, 10, 0, 4); // установка часов
  30. int VremNaborVoda = 310 ; // длительность набора воды в поливочный бак (сек.)
  31. int ChasNaborVoda = 10; // час, в который надо включить набор воды (часов)
  32. int VremPoliva = 35; // длительность набора воды в поливочный бак, достаточное, чтобы вода перелилась и начался полив (сек.)
  33. int ChasPoliva = 19; // час, в который надо поливать (часов)
  34. int ChasPoliva_2 = 22; // час, в который надо поливать второй раз (часов) - не менее, чем через 2 часа после первого полива!
  35. int VrOtkrTyl = 14; // время открытия окна по тылу (секунд)
  36. int VrZakrTyl = 10; // время закрытия окна по тылу (секунд)
  37. int VrOtkrFas = 18; // время открытия окна по фасаду (секунд)
  38. int VrZakrFas = 13; // время закрытия окна по фасаду (секунд)
  39. int TempOtkrOkon = 25; // температура открытия окон (градусов)
  40. int TempZakrOkon = 20; // температура закрытия окон (градусов)
  41. int TempPodPoch_on = 16; // температура включения подогрева почвы (градусов)
  42. int TempPodPoch_off = 18; // температура отключения подогрева почвы (градусов)
  43. int TempPodVozd_on = 16; // температура включения подогрева воздуха (градусов)
  44. int TempPodVozd_off = 18; // температура отключения подогрева воздуха (градусов)
  45.  
  46. // """Переменные для пинов"
  47.  
  48. OneWire ds(2); // Устанока пина 2 для датчика температуры почвы
  49. #define DHT11_PIN 3 // Установка пина 3 для датчика температуры и влажности воздуха
  50. int const MotorTyl_1 = 4; // номер пина мотора открывания форточки тыла 1
  51. int const MotorTyl_2 = 5; // номер пина мотора открывания форточки тыла 2
  52. int const MotorFas_1 = 6; // номер пина мотора открывания форточки фасада 1
  53. int const MotorFas_2 = 7; // номер пина мотора открывания форточки фасада 2
  54. int const KnopkaLeft = 8; // Кнопка настроек влево
  55. int const KnopkaEsc = 9; // Кнопка настроек выход
  56. int const KnopkaEnter = 10; // Кнопка настроек ввод
  57. int const KnopkaRight = 11; // Кнопка настроек вправо
  58. int const KontsTylOtkr = 22; // номер пина концевого выключателя открывания форточки тыла
  59. int const KontsTylZakr = 24; // номер пина концевого выключателя закрывания форточки тыла
  60. int const SensorVoda = 26; // номер пина сенсора уровня воды в поливочном баке
  61. int const KontsFasOtkr = 28; // номер пина концевого выключателя открывания форточки фасада
  62. int const KontsFasZakr = 30; // номер пина концевого выключателя закрывания форточки фасада
  63. int const OtklObogr = 32; // номер пина ручного выключателя автоматического обогрева (теплого пола и обогревателя воздуха)
  64. int const OtkrOkon = 34; // номер пина ручного выключателя ОТКРЫТИЯ окон и отключения автоматического управления окнами
  65. int const ZakrOkon = 36; // номер пина ручного выключателя ЗАКРЫТИЯ окон и отключения автоматического управления окнами
  66. int const KnopkaNabor = 38; // номер пина для кнопки ручного набора воды в поливочный бак
  67. int const KnopkaPoliv = 40; // номер пина кнопки включения полива
  68. int const Poliv_x2 = 42; // номер пина переключателя полива (1 или 2 раза)
  69. int const Podsvetka = 44; // номер пина кнопки включения подсветки дисплея
  70. int const Rele_1 = 46; // номер пина реле №1
  71. int const ReleNasos_2 = 48; // номер пина реле №2 включения насоса
  72. int const ReleTeplPol_3 = 50; // номер пина реле №3 включения теплого пола
  73. int const ReleObogr_4 = 52; // номер пина реле №4 включения обогревателя воздуха
  74. int const VlazhPochPin = 14; // пин датчика влажности почвы
  75.  
  76. int FuncOkon (int Motor) // Функция управления моторами
  77. {
  78. if (Motor==MotorTyl_1) { Konts=KontsTylOtkr; } // Задаем какой концевик должен сработать
  79. if (Motor==MotorTyl_2) { Konts=KontsTylZakr; }
  80. if (Motor==MotorFas_1) { Konts=KontsFasOtkr; }
  81. if (Motor==MotorFas_2) { Konts=KontsFasZakr; }
  82.  
  83. digitalWrite(Motor,1);
  84. int n = 0;
  85.  
  86. while ( n<(VrOtkrTyl*10)) // Стеклоподъемник работает не более отведенного времени (защита от несработки концевика)
  87.  
  88. {
  89. delay (100);
  90. ++n;
  91.  
  92. if (digitalRead (Konts) == 1) // Если концевик сработал
  93.  
  94. {
  95. break;
  96. }
  97. }
  98. digitalWrite(Motor,0); // Останавливаем мотор
  99. }
  100.  
  101. void setup() {
  102.  
  103. // """НАЗНАЧЕНИЕ ПИНОВ"""
  104.  
  105. pinMode (MotorTyl_1, OUTPUT); // пин мотора открывания форточки тыла 1 - выход
  106. pinMode (MotorTyl_2, OUTPUT); // пин мотора открывания форточки тыла 2 - выход
  107. pinMode (MotorFas_1, OUTPUT); // пин мотора открывания форточки фасада 1 - выход
  108. pinMode (MotorFas_2, OUTPUT); // пин мотора открывания форточки фасада 2 - выход
  109. pinMode (KnopkaLeft, INPUT); // Кнопка настроек влево
  110. pinMode (KnopkaEsc, INPUT); // Кнопка настроек выход
  111. pinMode (KnopkaEnter, INPUT); // Кнопка настроек ввод
  112. pinMode (KnopkaRight, INPUT); // Кнопка настроек вправо
  113. pinMode (KontsTylOtkr, INPUT); // пин концевого выключателя открывания форточки тыла - вход
  114. pinMode (KontsTylZakr, INPUT); // пин концевого выключателя закрывания форточки тыла - вход
  115. pinMode (SensorVoda, INPUT); // пин сенсора уровня воды в поливочном баке - вход
  116. pinMode (KontsFasOtkr, INPUT); // пин концевого выключателя открывания форточки фасада - вход
  117. pinMode (KontsFasZakr, INPUT); // пин концевого выключателя закрывания форточки фасада - вход
  118. pinMode (OtklObogr, INPUT); // пин ручного выключателя автоматического обогрева (теплого пола и обогревателя воздуха) - вход
  119. pinMode (OtkrOkon, INPUT); // пин ручного выключателя ОТКРЫТИЯ окон и отключения автоматического управления окнами - вход
  120. pinMode (ZakrOkon, INPUT); // пин ручного выключателя ЗАКРЫТИЯ окон и отключения автоматического управления окнами - вход
  121. pinMode (KnopkaNabor, INPUT); // пин для кнопки ручного набора воды в поливочный бак - вход
  122. pinMode (KnopkaPoliv, INPUT); // пин кнопки включения полива - вход
  123. pinMode (Poliv_x2, INPUT); // пин переключателя полива (1 или 2 раза) - вход
  124. pinMode (Podsvetka, INPUT); // пин кнопки включения подсветки дисплея - вход
  125. pinMode (Rele_1, OUTPUT); // пин реле №1 - выход
  126. pinMode (ReleNasos_2, OUTPUT); // пин реле №2 включения насоса - выход
  127. pinMode (ReleTeplPol_3, OUTPUT); // пин реле №3 включения теплого пола - выход
  128. pinMode (ReleObogr_4, OUTPUT); // пин реле №4 включения обогревателя воздуха - выход
  129.  
  130. digitalWrite (Rele_1,1); // Резервное реле отключено
  131. digitalWrite (ReleNasos_2,1); // Насос отключен
  132. digitalWrite (ReleTeplPol_3,1); // Подогрев почвы отключен
  133. digitalWrite (ReleObogr_4,1); // Обогреватель воздуха отключен
  134. digitalWrite (MotorTyl_1, 1); // Пины управления моторами отключены
  135. digitalWrite (MotorTyl_2, 1);
  136. digitalWrite (MotorFas_1, 1);
  137. digitalWrite (MotorFas_2, 1);
  138.  
  139.  
  140. // """ДИСПЛЕЙ"""
  141.  
  142. lcd.init(); // Инициализация дисплея
  143. lcd.backlight(); // Подсветка дисплея
  144.  
  145.  
  146. // данные самодельных символов для дисплея:
  147.  
  148. byte lcd_ch[8] = {0x00,0x00,0x11,0x11,0x0F,0x01,0x01,0x00};
  149. byte lcd_z[8] = {0x00,0x00,0x0E,0x11,0x06,0x11,0x0E,0x00};
  150. byte lcd_d[8] = {0x00,0x00,0x06,0x0A,0x0A,0x0A,0x1F,0x00};
  151. byte lcd_v[8] = {0x00,0x00,0x1E,0x11,0x1E,0x11,0x1E,0x00};
  152. byte lcd_gradus[8] = {0x00,0x10,0x06,0x09,0x08,0x09,0x06,0x00};
  153. byte lcd_l[8] = {0x00,0x00,0x07,0x09,0x09,0x09,0x19,0x00};
  154. byte lcd_g[8] = {0x00,0x00,0x15,0x15,0x0E,0x15,0x15,0x00};
  155. byte lcd_p[8] = {0x1F,0x11,0x11,0x11,0x11,0x11,0x11,0x00};
  156.  
  157.  
  158. // Создание самодельных символов для дисплея
  159.  
  160. lcd.createChar(0, lcd_ch); // буква ч
  161. lcd.createChar(1, lcd_z); // буква з
  162. lcd.createChar(2, lcd_d); // буква д
  163. lcd.createChar(3, lcd_v); // буква в
  164. lcd.createChar(4, lcd_gradus); // градус
  165. lcd.createChar(5, lcd_l); // буква л
  166. lcd.createChar(6, lcd_g); // буква ж
  167. lcd.createChar(7, lcd_p); // буква п
  168.  
  169.  
  170. // Вывод на дисплей неизменяемых символов:
  171.  
  172. lcd.setCursor(0, 0);
  173. lcd.print("Bo");
  174. lcd.write(byte(1));
  175. lcd.write(byte(2));
  176. lcd.print("yx:");
  177.  
  178. lcd.setCursor(0, 1);
  179. lcd.print("t=");
  180. lcd.setCursor(4, 1);
  181. lcd.write(byte(4));
  182. lcd.setCursor(6, 1);
  183. lcd.write(byte(3));
  184. lcd.write(byte(5));
  185. lcd.print("a");
  186. lcd.write(byte(6));
  187. lcd.print(".=");
  188. lcd.setCursor(15, 1);
  189. lcd.print("%");
  190.  
  191. lcd.setCursor(0, 2);
  192. lcd.write(byte(7));
  193. lcd.print("o");
  194. lcd.write(byte(0));
  195. lcd.write(byte(3));
  196. lcd.print("a:");
  197. lcd.setCursor(13, 2);
  198. lcd.write(byte(7));
  199. lcd.print("o");
  200. lcd.write(byte(2));
  201. lcd.print(":");
  202.  
  203. lcd.setCursor(0, 3);
  204. lcd.print("t=");
  205. lcd.setCursor(4, 3);
  206. lcd.write(byte(4));
  207. lcd.setCursor(6, 3);
  208. lcd.write(byte(3));
  209. lcd.write(byte(5));
  210. lcd.print("a");
  211. lcd.write(byte(6));
  212. lcd.print(".=");
  213. lcd.setCursor(15, 3);
  214. lcd.print("%");
  215.  
  216.  
  217.  
  218. Wire.begin();
  219. rtc.begin();
  220. //rtc.setDateTime(dt); //установка часов
  221.  
  222. //Serial.begin(9600);
  223.  
  224.  
  225.  
  226. }
  227.  
  228.  
  229. void loop()
  230. {
  231.  
  232. ds.reset(); // Очищаем датчик температуры почвы
  233. ds.select(AddrVozd); // выбираем датчик температуры почвы
  234. ds.write(0x44); // Запускаем на датчике температуры почвы процесс измерения и устанавливаем питание от внешнего источника
  235.  
  236. chk = DHT.read(DHT11_PIN); // Считываем данные с датчика температуры и влажности воздуха
  237.  
  238. switch (chk) // Проверка данных на ошибки. Если они есть, присваиваем значения 99.
  239.  
  240. {
  241. case DHTLIB_OK:
  242. break;
  243. default: TempVozd = 99;
  244. VlazhnVozd = 99;
  245. break;
  246. }
  247.  
  248. //if (TempVozd != 99) // Если с данными все в порядке, присваиваем переменным значения.
  249.  
  250. // {
  251. VlazhnVozd = DHT.humidity,1;
  252. TempVozd = DHT.temperature,1;
  253. // }
  254.  
  255. //delay(3000); // ЭТО ВРЕМЕННО!!!!
  256.  
  257. ds.reset(); // Очищаем датчик почвы
  258. ds.select(AddrVozd); // выбираем датчик почвы
  259. ds.write(0xBE); // Считываем данные с датчика почвы
  260.  
  261. for ( i = 0; i < 9; i++) // Записываем данные с датчика почвы
  262.  
  263. {
  264. DataVozd[i] = ds.read();
  265. }
  266.  
  267. int16_t raw = (DataVozd[1] << 8) | DataVozd[0]; // Извлекаем данные о температуре почвы
  268. raw = raw & ~7; // Определяем точность для температуры почвы 0,5 градусов
  269.  
  270. TempPochv = (float)raw / 16.0; // Пересчитываем в градусы Цельсия
  271.  
  272. VlazhPoch = analogRead(VlazhPochPin); // считывание данных с датчика влажности почвы
  273. VlazhPoch = (1000-VlazhPoch)/8; // вычисление влажности почвы
  274.  
  275. DateTime now = rtc.now(); //получение даты - времени
  276.  
  277. // Выводим данные на дисплей
  278.  
  279. lcd.setCursor(14,0);
  280. int timehour = now.hour();
  281.  
  282. if (timehour < 10)
  283.  
  284. {
  285. lcd.print("0");
  286. lcd.print(timehour);
  287. }
  288. else
  289. {
  290. lcd.print(timehour);
  291. }
  292.  
  293. lcd.print(":");
  294. lcd.setCursor(17,0);
  295.  
  296. int timemin = now.minute();
  297.  
  298. if (timemin < 10)
  299.  
  300. {
  301. lcd.print("0");
  302. lcd.print(timemin);
  303. }
  304. else
  305. {
  306. lcd.print(timemin);
  307. }
  308.  
  309. //lcd.print(now.minute(), DEC);
  310.  
  311. lcd.setCursor(2,1); // установка курсора
  312. lcd.print(TempVozd);
  313. lcd.setCursor(2,3);
  314. lcd.print(TempPochv);
  315. lcd.setCursor(13,1);
  316. lcd.print(VlazhnVozd);
  317. lcd.setCursor(13,3);
  318. lcd.print(VlazhPoch);
  319.  
  320. // ***Управление насосом:***
  321. // 1. Набор воды (возможен только при неполном баке):
  322.  
  323. // 1.1 Вручную:
  324.  
  325. // 1.1.1 Набор воды вручную:
  326.  
  327. if (digitalRead(SensorVoda)==0 && digitalRead(KnopkaNabor)==1) // Если бак неполон и кнопка набора воды нажата
  328.  
  329. {
  330.  
  331. NaborVoda (); // Процедура набора воды
  332.  
  333. }
  334.  
  335. // 1.2 Автоматически (по времени):
  336.  
  337. if (FlagNaborVoda == 0 && digitalRead (SensorVoda) == 0)
  338.  
  339. {
  340. if (timehour == ChasNaborVoda)
  341.  
  342. {
  343. NaborVoda (); // Процедура набора воды
  344. FlagNaborVoda = 1; // Ставим флажок, что воду больше пока набирать не надо
  345. }
  346.  
  347. }
  348.  
  349. if (timehour == (ChasNaborVoda + 1))
  350.  
  351. {
  352. FlagNaborVoda = 0; // Прошло время, можно набирать снова
  353. }
  354.  
  355. // 2.Полив
  356.  
  357. if (timehour == ChasPoliva && FlagPoliva == 0)
  358.  
  359. {
  360. Poliv (); // Процедура полива
  361. FlagPoliva = 1; // Установим флажок, что больше пока поливать не надо
  362. }
  363.  
  364. // 2.1 Полив вручную:
  365.  
  366. if (digitalRead (SensorVoda) == 1 && digitalRead (KnopkaPoliv) == 1) // Если бак полон и кнопка полива нажата
  367.  
  368. {
  369. //Serial.println (digitalRead(SensorVoda));
  370. //Serial.println (digitalRead(KnopkaPoliv));
  371. Poliv (); // Процедура полива
  372. }
  373.  
  374. if (timehour == (ChasPoliva + 1))
  375.  
  376. {
  377. FlagPoliva = 0; // Можно опять поливать
  378. }
  379.  
  380. // 3. Двойной полив:
  381.  
  382. // 3.1 Набираем воду:
  383.  
  384. if (digitalRead (Poliv_x2) == 1 && timehour == (ChasPoliva + 1))
  385.  
  386. {
  387. if (FlagNaborVoda == 0 && digitalRead (SensorVoda) == 0)
  388.  
  389. {
  390. NaborVoda (); // Процедура набора воды
  391. FlagNaborVoda = 1; // Ставим флажок, что воду больше пока набирать не надо
  392. }
  393. }
  394.  
  395. if (timehour == (ChasPoliva + 2))
  396.  
  397. {
  398. FlagNaborVoda = 0; // Прошло время, можно набирать снова
  399. }
  400.  
  401. // 3.2 Поливаем:
  402.  
  403. if (timehour == ChasPoliva_2 && FlagPoliva == 0)
  404.  
  405. {
  406. Poliv (); // Процедура полива
  407. FlagPoliva = 1; // Установим флажок, что больше пока поливать не надо
  408. }
  409. if (timehour == (ChasPoliva_2 + 1))
  410.  
  411. {
  412. FlagPoliva = 0; // Можно опять поливать
  413. }
  414.  
  415. // 4. Форточки:
  416.  
  417. // 4.1 Автоматическое открытие - закрытие:
  418.  
  419. if (digitalRead(OtkrOkon) == 0 && digitalRead(ZakrOkon) == 0) // Если отключено ручное открытие-закрытие окон
  420.  
  421. {
  422. lcd.setCursor(10,0); // установка курсора
  423. lcd.print("A");
  424. if (TempVozd == TempOtkrOkon && digitalRead(KontsTylOtkr) == 0)
  425.  
  426. {
  427. FuncOkon(MotorTyl_1);
  428. }
  429.  
  430. if (TempVozd == TempOtkrOkon && digitalRead(KontsFasOtkr) == 0)
  431.  
  432. {
  433. FuncOkon(MotorFas_1);
  434. }
  435.  
  436. if (TempVozd == TempZakrOkon && digitalRead(KontsTylZakr) == 0)
  437.  
  438. {
  439. FuncOkon(MotorTyl_2);
  440. }
  441.  
  442. if (TempVozd == TempZakrOkon && digitalRead(KontsFasZakr) == 0)
  443.  
  444. {
  445. FuncOkon(MotorFas_2);
  446. }
  447. }
  448.  
  449. // 4.2 Ручное открытие окон и отключение автоматического открытия-закрытия:
  450.  
  451. if (digitalRead(OtkrOkon) == 1) // Если включено ручное открытие окон
  452.  
  453. {
  454. lcd.setCursor(10,0); // установка курсора
  455. lcd.print("P");
  456. if (digitalRead(KontsTylOtkr) == 0)
  457.  
  458. {
  459. FuncOkon(MotorTyl_1);
  460. }
  461.  
  462. if (digitalRead(KontsFasOtkr) == 0)
  463.  
  464. {
  465. FuncOkon(MotorFas_1);
  466. }
  467. }
  468.  
  469. if (digitalRead(ZakrOkon) == 1) // Если включено ручное закрытие окон
  470.  
  471. {
  472. lcd.setCursor(10,0); // установка курсора
  473. lcd.print("P");
  474.  
  475. if (digitalRead(KontsTylZakr) == 0)
  476.  
  477. {
  478. FuncOkon(MotorTyl_2);
  479. }
  480.  
  481. if (digitalRead(KontsFasZakr) == 0)
  482.  
  483. {
  484. FuncOkon(MotorFas_2);
  485. }
  486. }
  487.  
  488. // 5.Подогрев почвы и воздуха:
  489.  
  490. if ( digitalRead (OtklObogr) == 1 ) // Если автоматика отключена
  491.  
  492. {
  493. digitalWrite (ReleTeplPol_3, 1); // Выключаем реле теплого пола
  494. digitalWrite (ReleObogr_4, 1); // Выключаем реле обогревателя воздуха
  495. lcd.setCursor(10,2); // Отображаем Р на дисплее, символизируещее ручное управление, отключение автоматики
  496. lcd.print("P");
  497. lcd.setCursor(17,2); // Отображаем на дисплее отключение подогрева пола
  498. lcd.print("OFF");
  499. }
  500.  
  501. else // Если автоматика не отключена
  502.  
  503. {
  504. lcd.setCursor(10,2); // Отображаем А на дисплее
  505. lcd.print("A");
  506.  
  507. if ( TempPochv <= TempPodPoch_on) // Если температура почвы меньше заданной
  508.  
  509. {
  510. digitalWrite (ReleTeplPol_3, 0); // Включаем реле теплого пола
  511. lcd.setCursor(17,2); // Отображаем это на дисплее
  512. lcd.print("ON ");
  513. }
  514.  
  515. if ( TempPochv >= TempPodPoch_off ) // Если температура почвы больше заданной
  516.  
  517. {
  518. digitalWrite (ReleTeplPol_3, 1); // Выключаем реле теплого пола
  519. lcd.setCursor(17,2); // Отображаем это на дисплее
  520. lcd.print("OFF");
  521. }
  522.  
  523. if ( TempVozd <= TempPodVozd_on ) // Если температура почвы меньше заданной
  524.  
  525. {
  526. digitalWrite (ReleObogr_4, 0); // Включаем реле обогревателя воздуха
  527. }
  528.  
  529. if ( TempVozd >= TempPodVozd_off ) // Если температура почвы больше заданной
  530.  
  531. {
  532. digitalWrite (ReleObogr_4, 1); // Выключаем реле обогревателя воздуха
  533. }
  534.  
  535. }
  536.  
  537. // Кнопка включения подсветки дисплея
  538.  
  539. if ( (millis() - Vremya) > 15000 || millis() < Vremya)
  540.  
  541. {
  542. lcd.noBacklight(); // Подсветка дисплея отключается
  543. }
  544.  
  545. if ( digitalRead(Podsvetka) == 1)
  546.  
  547. {
  548. lcd.backlight(); // Подсветка дисплея
  549. Vremya = millis();
  550. }
  551. }
  552.  
  553.  
  554. void NaborVoda () // Процедура набора воды
  555. {
  556. digitalWrite (ReleNasos_2,0); // Включаем насос
  557. int n = 0;
  558.  
  559. while ( n<VremNaborVoda) // Насос работает не более отведенного времени (защита от несработки датчика уровня)
  560.  
  561. {
  562. delay (1000);
  563. ++n;
  564.  
  565. if (digitalRead (SensorVoda) == 1) // Если датчик уровня воды сработал
  566.  
  567. {
  568. break;
  569. }
  570.  
  571. }
  572.  
  573. digitalWrite (ReleNasos_2,1); // Насос отключить
  574. }
  575.  
  576.  
  577. void Poliv () // Процедура полива
  578. {
  579. digitalWrite (ReleNasos_2,0); // Включаем насос
  580. delay (VremPoliva*1000);
  581. digitalWrite (ReleNasos_2,1); // Насос отключить
  582. }
  583.  
  584. /*
  585. void TestMotor ()
  586. {
  587.   MotorTest = 1;
  588.   lcd.clear(); // Очистка дисплея
  589.   lcd.backlight(); // Подсветка дисплея
  590.   lcd.setCursor(5, 0); // Вывод на дисплей неизменяемых символов:
  591.   lcd.print("Motors test");
  592.   lcd.setCursor(0, 1);
  593.   lcd.print("Motors select:");
  594.   lcd.setCursor(0, 2);
  595.   lcd.print("Motors status:");
  596.   lcd.setCursor(0, 3);
  597.   lcd.print("TO:");
  598.   lcd.setCursor(5, 3);
  599.   lcd.print("TC:");
  600.   lcd.setCursor(10, 3);
  601.   lcd.print("FO:");
  602.   lcd.setCursor(15, 3);
  603.   lcd.print("FC:");
  604.  
  605.   while ( MotorTest == 1)
  606.  
  607.   {
  608.   if (digitalRead(OtkrOkon) == 0 && digitalRead(ZakrOkon) == 0) // Если переключатель в среднем положении
  609.  
  610.   {
  611.   lcd.setCursor(15, 1);
  612.   lcd.print("OFF ");
  613.   }
  614.  
  615.   if (digitalRead(KnopkaNabor) == 0 && digitalRead(KnopkaPoliv) == 0) // Если ни одна из кнопок не нажата
  616.  
  617.   {
  618.   lcd.setCursor(15, 2);
  619.   lcd.print("STOP ");
  620.   }
  621.  
  622.   lcd.setCursor(3, 3);
  623.   lcd.print(digitalRead(KontsTylOtkr));
  624.   lcd.setCursor(8, 3);
  625.   lcd.print(digitalRead(KontsTylZakr));
  626.   lcd.setCursor(13, 3);
  627.   lcd.print(digitalRead(KontsFasOtkr));
  628.   lcd.setCursor(18, 3);
  629.   lcd.print(digitalRead(KontsFasZakr));
  630.  
  631.   if (digitalRead(OtkrOkon) == 1) // Включено окно тыла
  632.  
  633.   {
  634.   lcd.setCursor(15, 1);
  635.   lcd.print("Tyl ");
  636.   lcd.print(digitalRead(KontsTylOtkr));
  637.   lcd.setCursor(8, 3);
  638.   lcd.print(digitalRead(KontsTylZakr));
  639.   lcd.setCursor(13, 3);
  640.   lcd.print(digitalRead(KontsFasOtkr));
  641.   lcd.setCursor(18, 3);
  642.   lcd.print(digitalRead(KontsFasZakr));
  643.  
  644.   if (digitalRead(KnopkaPoliv) == 1 && digitalRead(KontsTylOtkr) == 0)
  645.  
  646.   {
  647.   digitalWrite (MotorTyl_1, 1);
  648.   lcd.setCursor(15, 2);
  649.   lcd.print("OPEN ");
  650.   lcd.setCursor(3, 3);
  651.  
  652.   while (digitalRead(KnopkaPoliv) == 1)
  653.  
  654.   {
  655.   if (digitalRead(KontsTylOtkr) == 1)
  656.  
  657.   {
  658.   break;
  659.   }
  660.   delay (100);
  661.   }
  662.  
  663.   digitalWrite (MotorTyl_1, 0);
  664.   }
  665.  
  666.   if (digitalRead(KnopkaNabor) == 1 && digitalRead(KontsTylZakr) == 0)
  667.  
  668.   {
  669.   digitalWrite (MotorTyl_2, 1);
  670.   lcd.setCursor(15, 2);
  671.   lcd.print("CLOSE");
  672.  
  673.   while (digitalRead(KnopkaNabor) == 1)
  674.  
  675.   {
  676.   if (digitalRead(KontsTylZakr) == 1)
  677.  
  678.   {
  679.   break;
  680.   }
  681.  
  682.   delay (100);
  683.   }
  684.  
  685.   digitalWrite (MotorTyl_2, 0);
  686.   }
  687.   }
  688.  
  689.   if (digitalRead(ZakrOkon) == 1) // Включено окно фасада
  690.  
  691.   {
  692.   lcd.setCursor(15, 1);
  693.   lcd.print("Fasad");
  694.   lcd.setCursor(3, 3);
  695.   lcd.print(digitalRead(KontsTylOtkr));
  696.   lcd.setCursor(8, 3);
  697.   lcd.print(digitalRead(KontsTylZakr));
  698.   lcd.setCursor(13, 3);
  699.   lcd.print(digitalRead(KontsFasOtkr));
  700.   lcd.setCursor(18, 3);
  701.   lcd.print(digitalRead(KontsFasZakr));
  702.  
  703.   if (digitalRead(KnopkaPoliv) == 1 && digitalRead(KontsFasOtkr) == 0)
  704.  
  705.   {
  706.   lcd.setCursor(15, 2);
  707.   lcd.print("OPEN ");
  708.   digitalWrite (MotorFas_1, 1);
  709.  
  710.   while (digitalRead(KnopkaPoliv) == 1)
  711.  
  712.   {
  713.   if (digitalRead(KontsFasOtkr) == 1)
  714.  
  715.   {
  716.   break;
  717.   }
  718.  
  719.   delay (100);
  720.   }
  721.   digitalWrite (MotorFas_1, 0);
  722.   }
  723.  
  724.   if (digitalRead(KnopkaNabor) == 1 && digitalRead(KontsFasZakr) == 0)
  725.  
  726.   {
  727.   digitalWrite (MotorFas_2, 1);
  728.   lcd.setCursor(15, 2);
  729.   lcd.print("CLOSE");
  730.  
  731.   while (digitalRead(KnopkaNabor) == 1)
  732.  
  733.   {
  734.   if (digitalRead(KontsFasZakr) == 1)
  735.  
  736.   {
  737.   break;
  738.   }
  739.  
  740.   delay (100);
  741.   }
  742.  
  743.   digitalWrite (MotorFas_2, 0);
  744.   }
  745.   }
  746.   }
  747. */
  748. /* if (digitalRead(KnopkaNabor) == 1 && digitalRead(KnopkaPoliv) == 1) // Если нажать одновременно кнопки полива и набора воды
  749.  
  750.   {
  751.   delay (5000); // и удерживать их более 5 сек
  752.  
  753.   if (digitalRead(KnopkaNabor) == 1 && digitalRead(KnopkaPoliv) == 1) // Если по прошествии 5 сек кнопки все еще нажаты, включается тестовая программа
  754.  
  755.   {
  756.  
  757.   }
  758.   }*/
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:1:64: fatal error: Wire.h: No such file or directory
compilation terminated.
stdout
Standard output is empty