fork(4) download
  1. #include <Lm335.h> // Библиотека аналогового датчика температуры https://g...content-available-to-author-only...b.com/Leo-NVKZ/Lm335
  2. #include <Wire.h> // Библиотека шины
  3. #include <LiquidCrystal_I2C.h> // Библиотека дисплея
  4. #include <OneWire.h> // Библиотека цифрового датчика температуры
  5. #include <EEPROM.h> // Библиотека памяти
  6.  
  7. LiquidCrystal_I2C lcd(0x3F, 16, 2); // Установка адреса и размерности дисплея
  8.  
  9. byte i; // для цифрового датчика температуры
  10. byte DataDig[12]; // Данные для цифрового датчика температуры
  11. byte AddrDig[8] = {0x28, 0xFF, 0xA3, 0x40, 0x62, 0x16, 0x3, 0x9B}; // Адрес для цифрового датчика температуры
  12.  
  13. int TempDig; // Переменная температуры цифрового датчика
  14.  
  15. int TempSens; // Переменная температуры выбранного датчика
  16. int TempSensMin; // Границы рабочей зоны выбранного датчика
  17. int TempSensMax;
  18.  
  19. int Sett = 0; // Включаем нумерацию настроечных параметров
  20. int nz = 0; // Переменная отсчета задержек для меню.
  21. int memread = 0; // Ключ для чтения данных из EEPROM
  22. int KluchPauza = 0; // Ключ для паузы
  23. int NParam; // Переменная для выбора параметра
  24.  
  25. const int KolNactr = 4; // Количество элементов массивов настроек
  26. // (количество настраиваемых параметров)
  27. int Parametr[KolNactr]; // Массив для значений параметров настроек
  28.  
  29. /*
  30.   """Настройки"""
  31.  
  32.   0. Температура включения реле цифрового датчика
  33.   1. Температура выключения реле цифрового датчика
  34.   2. Температура включения реле аналогового датчика
  35.   3. Температура выключения реле аналогового датчика
  36. */
  37.  
  38. // Массив названий параметров, названия можно писать свои в количестве, указанном выше,
  39. // длиной до 10 символов включительно. Язык английский.
  40. String NameParametr[KolNactr] =
  41. {
  42. "TempOnDig",
  43. "TempOffDig",
  44. "TempOnAn ",
  45. "TempOffAn "
  46. };
  47.  
  48. boolean DigitalSens; // Переменная значений по отключению Цифрового датчика
  49. //boolean AnalogSens; // Переменная значений по отключению аналогового датчика
  50.  
  51. unsigned long timezad; // Переменная значений по отключению аналогового датчика
  52.  
  53. OneWire ds(2); // Устанока пина 2 для цифрового датчика температуры
  54. int const Left = 3; // Кнопка настроек влево
  55. int const Esc = 4; // Кнопка настроек выход
  56. int const Enter = 5; // Кнопка настроек ввод
  57. int const Right = 6; // Кнопка настроек вправо
  58. int const Upravl = 7; // номер пина для управления симистором
  59. int const LedOn = 9; // номер пина светодиод включения процесса основного режима работы
  60. int const LedNagr = 10; // номер пина светодиод включения нагрева
  61. int const Muz = 11; // номер пина динамик
  62. const int datchik_1 = 0; // Определяем аналоговый пин для подключения датчикa
  63. int temper_out; // Температура, округленная до целых значений, градусов по Цельсию
  64. double U_vcc = 5.02; // Здесь указываем точное напряжение питания датчика
  65. double volt; // Напряжение на датчике - для его настройки, В
  66. double temper;
  67.  
  68. // Создаем объект для аналогового датчика
  69. Lm335 lm3351(datchik_1, U_vcc); // Создаем объект для датчика 1
  70.  
  71. void setup() {
  72. pinMode (Left, INPUT); // Кнопка настроек влево
  73. pinMode (Esc, INPUT); // Кнопка настроек выход
  74. pinMode (Enter, INPUT); // Кнопка настроек ввод
  75. pinMode (Right, INPUT); // Кнопка настроек вправо
  76. pinMode (Upravl, OUTPUT); // пин управления симистором
  77. pinMode (LedOn, OUTPUT); // пин светодиода запущенного процесса
  78. pinMode (LedNagr, OUTPUT); // пин светодиода запущенного процесса
  79. pinMode (Muz, OUTPUT); // пин динамика
  80. digitalWrite (Upravl, 0); // отключаем симистор
  81. digitalWrite (LedOn, 0); // светодиод работы отключен
  82. digitalWrite (LedNagr, 0); // светодиод нагрева отключен
  83. noTone(Muz); //Звук отключен
  84.  
  85. lcd.init(); // Инициализация дисплея
  86. lcd.backlight(); // Подсветка дисплея
  87.  
  88. // данные самодельных символов для дисплея:
  89.  
  90. byte lcd_gradus[8] = {0x00, 0x10, 0x06, 0x09, 0x08, 0x09, 0x06, 0x00};
  91.  
  92. // Создание самодельных символов для дисплея
  93.  
  94. lcd.createChar(0, lcd_gradus); // градус
  95.  
  96.  
  97. Wire.begin();
  98.  
  99. //Serial.begin(9600);
  100.  
  101. }
  102.  
  103. void loop() {
  104.  
  105. if (KluchPauza == 0) // Пауза перед запуском программы
  106. {
  107. Serial.println("pause");
  108. delay (500);
  109. Musik();
  110. KluchPauza = 1;
  111.  
  112. }
  113.  
  114. if (memread == 0) // Один раз считываем данные настроек из памяти и выводим неизменяемые символы на дисплей
  115. {
  116. Serial.println("memread");
  117. for (int i = 0; i < KolNactr; ++i) // Цикл считывания данных из EEPROM
  118. {
  119. Parametr[i] = EEPROM.read(i);
  120. }
  121.  
  122. DigitalSens = EEPROM.read(KolNactr);
  123.  
  124. memread = 1;
  125.  
  126.  
  127.  
  128. DisplayConst();
  129. }
  130.  
  131. if (digitalRead(Enter) == 1) // Если кнопка ввода нажата
  132. {
  133. beep(700, 200);
  134. beep(800, 200);
  135. beep(900, 200);
  136. noTone(Muz);
  137. Nastroyka(); // Переходим в меню настройки
  138. }
  139.  
  140. DatchikDig (); // Работаем с датчиками температуры
  141.  
  142.  
  143.  
  144. // Начинаем выводить данные на дисплей
  145.  
  146. lcd.setCursor(3, 0);
  147. lcd.print(TempDig);
  148.  
  149. lcd.setCursor(3, 1);
  150. lcd.print(temper_out);
  151.  
  152. lcd.setCursor(11, 0);
  153. lcd.print(Parametr[0]);
  154.  
  155. lcd.setCursor(14, 0);
  156. lcd.print(Parametr[1]);
  157.  
  158. lcd.setCursor(11, 1);
  159. lcd.print(Parametr[2]);
  160.  
  161. lcd.setCursor(14, 1);
  162. lcd.print(Parametr[3]);
  163.  
  164. if (DigitalSens == false)
  165. {
  166. lcd.setCursor(7, 0);
  167. lcd.print("OFF");
  168. lcd.setCursor(7, 1);
  169. lcd.print(" ON");
  170. }
  171. else
  172. {
  173. lcd.setCursor(7, 0);
  174. lcd.print(" ON");
  175. lcd.setCursor(7, 1);
  176. lcd.print("OFF");
  177. }
  178.  
  179. if (digitalRead(Left) == 1) // Запускаем режим работы
  180. {
  181. beep(700, 100);
  182. beep(700, 100);
  183. beep(800, 100);
  184. beep(800, 100);
  185. beep(900, 200);
  186. noTone(Muz);
  187. work ();
  188. }
  189. }
  190.  
  191. void DatchikDig () // Функция получения данных с датчиков температуры
  192. {
  193. byte present = 0;
  194.  
  195. ds.reset(); // Очищаем цифровой датчик
  196. ds.select(AddrDig);
  197. ds.write(0x44, 1); // start conversion, with parasite power on at the end
  198. delay(1000); // maybe 750ms is enough, maybe not
  199. // we might do a ds.depower() here, but the reset will take care of it.
  200. present = ds.reset();
  201. ds.select(AddrDig); // выбираем цифровой датчик
  202. ds.write(0xBE); // Считываем данные с цифрового датчика
  203.  
  204. for ( i = 0; i < 9; i++) // Записываем данные с цифрового датчика
  205.  
  206. {
  207. DataDig[i] = ds.read();
  208. }
  209.  
  210. int16_t raw = (DataDig[1] << 8) | DataDig[0]; // Извлекаем данные о температуре с цифрового датчика
  211. raw = raw & ~7; // Определяем точность для температуры 0,5 градусов
  212. TempDig = (int)raw / 16.0; // Пересчитываем в градусы Цельсия
  213.  
  214. lm3351.datchikVozdAnalog(); // Вызов метода определения параметров для аналогового датчика
  215. temper_out = lm3351.temp335_out; // Получаем температуру, округленную до целых значений
  216. temper = lm3351.temp335; // Получаем температуру с датчика 1
  217.  
  218. }
  219.  
  220. void Nastroyka() // Функция выбора меню на дисплее
  221. {
  222. lcd.clear(); // Очистка дисплея
  223. while (nz < 5) // Цикл ожидания, выполняется 1 раз при входе
  224. {
  225. delay (200);
  226. ++nz;
  227. }
  228. int Kluch_5 = 1;
  229. int menu = 0;
  230.  
  231. while (Kluch_5 = 1)
  232. {
  233. lcd.setCursor(0, 0);
  234. lcd.print("Parametrs");
  235. lcd.setCursor(0, 1);
  236. lcd.print("Datchik");
  237.  
  238. delay (100);
  239.  
  240. if (digitalRead(Esc) == 1) // Если нажата кнопка выхода из режима выбора настроек
  241. {
  242. // Serial.println("Esc");
  243. beep(900, 200);
  244. beep(800, 200);
  245. beep(700, 200);
  246. noTone(Muz);
  247. lcd.clear(); // Очистка дисплея
  248. Kluch_5 = 0;
  249. nz = 0;
  250. memread = 0;
  251. break;
  252. }
  253.  
  254. if (menu == 0)
  255. {
  256. lcd.setCursor(10, 0);
  257. lcd.print("<");
  258. lcd.setCursor(10, 1);
  259. lcd.print(" ");
  260. }
  261.  
  262. else
  263. {
  264. lcd.setCursor(10, 1);
  265. lcd.print("<");
  266. lcd.setCursor(10, 0);
  267. lcd.print(" ");
  268. }
  269.  
  270. if (digitalRead(Right) == 1) // Если кнопка вправо нажата
  271. {
  272. menu = 1;
  273. }
  274.  
  275. if (digitalRead(Left) == 1) // Если кнопка влево нажата
  276. {
  277. menu = 0;
  278. }
  279.  
  280. Serial.println(menu);
  281. if (digitalRead(Enter) == 1) // Если кнопка ввода нажата
  282. {
  283.  
  284. if (menu == 1)
  285. {
  286. Datchik ();
  287. }
  288.  
  289. else
  290. {
  291. Nastr_Parametr ();
  292. }
  293. }
  294. }
  295. }
  296.  
  297. void Nastr_Parametr () // Функция настройки параметров с кнопок и сохранения их в EEPROM
  298. {
  299. lcd.clear(); // Очистка дисплея
  300.  
  301. int Kluch = 1; // Задаем значение, не позволяющее покинуть функцию без команды
  302. int nastr = 0; // Включаем нумерацию настроечных параметров
  303. int nastr_d = nastr + 1;
  304. int nz = 0; // Счетчик для циклов ожидания, выполняющихся 1 раз
  305.  
  306. while (Kluch = 1) // Цикл выбора параметра
  307. {
  308.  
  309. while (nz < 5) // Цикл ожидания, выполняется 1 раз при входе
  310. {
  311. delay (100);
  312. ++nz;
  313. }
  314.  
  315. delay (100); // Ожидание - выполняется каждый раз
  316.  
  317. if (digitalRead(Right) == 1) // Изменяем значение номера выбираемого параметра:
  318. {
  319. ++nastr; // увеличиваем
  320.  
  321. }
  322.  
  323. if (digitalRead(Left) == 1)
  324. {
  325. --nastr; // уменьшаем
  326.  
  327. }
  328.  
  329. if (nastr < 0) // Ограничиваем выбор настроек заданным их количеством
  330. {
  331. nastr = KolNactr - 1;
  332.  
  333. }
  334.  
  335. if (nastr > KolNactr - 1)
  336. {
  337. nastr = 0;
  338. }
  339.  
  340. nastr_d = nastr + 1;
  341.  
  342. if (nastr == KolNactr - 1)
  343. {
  344. nastr_d = 0;
  345. }
  346.  
  347. lcd.setCursor(0, 0); // Вывод на экран названия настройки
  348.  
  349. lcd.print(NameParametr[nastr]); // в соответствии с ее номером в массиве названий
  350.  
  351. lcd.setCursor(10, 0);
  352.  
  353. lcd.print("<");
  354.  
  355. lcd.setCursor(0, 1);
  356.  
  357. lcd.print(NameParametr[nastr_d]);
  358.  
  359. lcd.setCursor(12, 0);
  360.  
  361. if (Parametr[nastr] < 10) // Прописываем пустое место перед единицами
  362. {
  363. lcd.print(" ");
  364. }
  365.  
  366. if (Parametr[nastr] >= 10 && Parametr[nastr] < 100) // Пустое место перед десятками
  367. {
  368. lcd.print(" ");
  369. }
  370.  
  371. lcd.print(Parametr[nastr]); // выводим значение сохраненного параметра
  372.  
  373. lcd.setCursor(12, 1);
  374.  
  375. if (Parametr[nastr_d] < 10) // Прописываем пустое место перед единицами
  376. {
  377. lcd.print(" ");
  378. }
  379.  
  380. if (Parametr[nastr_d] >= 10 && Parametr[nastr_d] < 100) // Пустое место перед десятками
  381. {
  382. lcd.print(" ");
  383. }
  384.  
  385. lcd.print(Parametr[nastr_d]);
  386.  
  387. if (digitalRead(Esc) == 1) // Если нажата кнопка выхода из режима выбора настроек
  388. {
  389. lcd.clear(); // Очистка дисплея
  390. Kluch = 0;
  391. nz = 0;
  392. break;
  393. }
  394.  
  395. if (digitalRead(Enter) == 1) // Если нажата кнопка выбора настроечного параметра
  396. {
  397. int Kluch_2 = 1; // Задаем значение, не позволяющее покинуть цикл без команды
  398. nz = 0; // Обнуляем счетчик цикла ожидания
  399. lcd.setCursor(10, 0);
  400. lcd.print(" ");
  401. lcd.setCursor(15, 0);
  402. lcd.print("<");
  403.  
  404. while (Kluch_2 == 1) // Цикл выбора значения параметра
  405. {
  406.  
  407.  
  408. lcd.setCursor(12, 0);
  409.  
  410. if (Parametr[nastr] < 10) // Прописываем пустое место перед единицами
  411. {
  412. lcd.print(" ");
  413. }
  414.  
  415. if (Parametr[nastr] >= 10 && Parametr[nastr] < 100) // Пустое место перед десятками
  416. {
  417. lcd.print(" ");
  418. }
  419.  
  420. lcd.print(Parametr[nastr]); // выводим значение сохраненного параметра
  421.  
  422. while (nz < 5) // Цикл ожидания, выполняется 1 раз
  423. {
  424. delay (100);
  425. ++nz;
  426. }
  427.  
  428. delay (100); // Ожидание, отвечает за скорость смены значений
  429.  
  430. if (digitalRead(Right) == 1) // Если кнопка вправо нажата, увеличиваем значение параметра
  431. {
  432. ++Parametr[nastr];
  433. }
  434.  
  435. if (digitalRead(Left) == 1) // То же для кнопки влево
  436. {
  437. --Parametr[nastr];
  438. }
  439.  
  440. if (Parametr[nastr] < 50) // Задаем границы для значений параметров, в том числе
  441. { // обусловленные возможностями ячейки памяти (256)
  442. Parametr[nastr] = 100;
  443. }
  444.  
  445. if (Parametr[nastr] > 100)
  446. {
  447. Parametr[nastr] = 50;
  448. }
  449.  
  450. if (digitalRead(Enter) == 1) // Если в этом режиме нажата кнопка Ввод,
  451. { // сохраняем значение параметра в EEPROM
  452. EEPROM.write(nastr, Parametr[nastr]);
  453. lcd.setCursor(15, 0);
  454. lcd.print("+");
  455. delay (500);
  456. lcd.setCursor(15, 0);
  457. lcd.print(" "); // Стираем значок
  458. Kluch_2 = 0;
  459. nz = 0;
  460. memread = 0;
  461. continue;
  462. }
  463.  
  464. if (digitalRead(Esc) == 1) // Если нажата кнопка выхода, выходим в предыдущее меню
  465. { // выбора номера параметра,
  466. lcd.setCursor(15, 0);
  467. lcd.print(" "); // попутно стирая на дисплее значок
  468. Kluch_2 = 0;
  469. nz = 0;
  470. continue;
  471. }
  472. }
  473. }
  474. delay (200);
  475. }
  476. }
  477. void Datchik () // Функция отключения датчиков
  478. {
  479. lcd.clear(); // Очистка дисплея
  480. while (nz < 7) // Цикл ожидания, выполняется 1 раз при входе
  481. {
  482. delay (200);
  483. ++nz;
  484. }
  485. int Kluch_6 = 1;
  486. //int menu = 0;
  487.  
  488. while (Kluch_6 = 1)
  489. {
  490. lcd.setCursor(0, 0);
  491.  
  492. if (DigitalSens == false)
  493. {
  494. lcd.print("Analog");
  495. }
  496. else
  497. {
  498. lcd.print("Digital");
  499. }
  500.  
  501. if (timezad + 1000 < millis())
  502. {
  503. //lcd.setCursor(14, 1);
  504. // lcd.print(" ");
  505. lcd.setCursor(14, 0);
  506. lcd.print(" ");
  507. }
  508.  
  509. delay (300);
  510.  
  511. if (digitalRead(Esc) == 1) // Если нажата кнопка выхода из режима выбора настроек
  512. {
  513. lcd.clear(); // Очистка дисплея
  514. Kluch_6 = 0;
  515. nz = 0;
  516. memread = 0;
  517. break;
  518. }
  519.  
  520. if ((digitalRead(Right) == 1) || (digitalRead(Left) == 1)) // Если кнопка вправо или влево нажата
  521. {
  522. DigitalSens = !DigitalSens;
  523. }
  524.  
  525. if (digitalRead(Enter) == 1) // Если кнопка ввода нажата
  526. {
  527. lcd.setCursor(14, 0);
  528. lcd.print("+");
  529. timezad = millis();
  530. EEPROM.write(KolNactr, DigitalSens);
  531.  
  532. memread = 0;
  533. }
  534. }
  535. }
  536.  
  537. void work()
  538. {
  539. int kluch_7 = 1;
  540.  
  541. while (kluch_7 == 1)
  542. {
  543. digitalWrite (LedOn, 1); // Светодиод основного режима включен
  544.  
  545. DatchikDig (); // считываем данные с датчиков температуры
  546.  
  547. lcd.setCursor(3, 0); // Выводим данные о температуре на дисплей
  548. lcd.print(TempDig);
  549.  
  550. lcd.setCursor(3, 1);
  551. lcd.print(temper_out);
  552.  
  553. if (DigitalSens == false) // Если выбран аналоговый датчик, работаем с ним
  554. {
  555. TempSens = temper_out;
  556. TempSensMin = Parametr[2];
  557. TempSensMax = Parametr[3];
  558. }
  559. else
  560. {
  561. TempSens = TempDig;
  562. TempSensMin = Parametr[0];
  563. TempSensMax = Parametr[1];
  564. }
  565.  
  566. if (TempSens <= TempSensMin)
  567. {
  568. digitalWrite (Upravl, 1); // включаем симистор
  569. digitalWrite (LedNagr, 1); // светодиод нагрева включен
  570. }
  571.  
  572. if (TempSens >= TempSensMax)
  573. {
  574. digitalWrite (Upravl, 0); // выключаем симистор
  575. digitalWrite (LedNagr, 0); // светодиод нагрева выключен
  576. }
  577.  
  578.  
  579. if (TempSens >= (TempSensMax + 5))
  580. {
  581. Alarm();
  582. }
  583.  
  584. if (digitalRead(Right) == 1)
  585. {
  586. digitalWrite (Upravl, 0); // выключаем симистор
  587. digitalWrite (LedNagr, 0); // светодиод нагрева выключен
  588. digitalWrite (LedOn, 0); // Светодиод основного режима отключен
  589. beep(900, 100);
  590. beep(900, 100);
  591. beep(800, 100);
  592. beep(800, 100);
  593. beep(700, 200);
  594. noTone(Muz);
  595. break;;
  596. }
  597. }
  598. }
  599.  
  600. void DisplayConst()
  601. {
  602. // Выводим на дисплей неизменяемые символы.
  603. lcd.setCursor(0, 0);
  604. lcd.print("D: ");
  605. lcd.setCursor(5, 0);
  606. lcd.write(byte(0));
  607. lcd.print(" ");
  608. lcd.setCursor(10, 0);
  609. lcd.print(" ");
  610. lcd.setCursor(13, 0);
  611. lcd.print("-");
  612.  
  613. lcd.setCursor(0, 1);
  614. lcd.print("A: ");
  615. lcd.setCursor(5, 1);
  616. lcd.write(byte(0));
  617. lcd.print(" ");
  618. lcd.setCursor(10, 1);
  619. lcd.print(" ");
  620. lcd.setCursor(13, 1);
  621. lcd.print("-");
  622. }
  623.  
  624. void beep(int ton, int time)
  625. {
  626. tone(Muz, ton, time);
  627. delay(time + 20);
  628. }
  629.  
  630. void Musik()
  631. {
  632. beep(440, 500);
  633. beep(440, 500);
  634. beep(440, 500);
  635. beep(349, 350);
  636. beep(523, 150);
  637. beep(440, 500);
  638. beep(349, 350);
  639. beep(523, 150);
  640. beep(440, 650);
  641. noTone(Muz);
  642. }
  643.  
  644. void Alarm ()
  645. {
  646. beep(700, 400);
  647. beep(900, 400);
  648. noTone(Muz);
  649. }
  650.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:1:150: fatal error: Lm335.h: No such file or directory
 #include <Lm335.h>             // Библиотека аналогового датчика температуры https://github.com/Leo-NVKZ/Lm335
                                                                                                                                                      ^
compilation terminated.
stdout
Standard output is empty