//--------градусник----------- #include // подключаем библиотеку градусника https://github.com/AlexGyver/GyverLibs/releases/download/microDS18B20/microDS18B20.zip #define DS_PIN1 6 // Создаем пин для термометра MicroDS18B20 sensor(6); // Создаем термометр без адресации //--------таймер-------------- #define period1 300 // создаем два таймера для #define period2 1000 // для пищульки //---------дисплей---------- #include "GyverTM1637.h" // подключаем библиотеку дисплея https://github.com/AlexGyver/GyverLibs/releases/download/GyverTM1637/GyverTM1637.zip #define CLK 5 #define DIO 4 GyverTM1637 disp(CLK, DIO); // ноги дисплея //---------память------------- #include // библиотека ПЗУ //----------модуль часов------ #include // подключаем библиотеку часов DS3231 clock; RTCDateTime dt; //----------- шина------------ #include // шина I2C //------------кнопки---------- #include "GyverButton.h" // подключаем библиотеку кнопок https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip GButton butt1(9); // кнопка вкл/откл будильника GButton butt2(10); // кнопка выбор времени будильника GButton butt3(11); // кнопка + GButton butt4(12); // кнопка — //---------переменные---------- int alarm_m, alarm_h; // переменные опроса времени будильника byte z, menu, mode, dark, w = 0, x = 0, ton, on = 0; // разные переменные uint8_t temp; // вывод °C volatile int count = 0; // переменная-счётчик секунд uint32_t tmr; // переменная-счетчик интервала bool flag; void setup() { Wire.begin(); // запус шины I2C clock.begin(); // запуск платы часов pinMode(2, INPUT_PULLUP); // вход секундных импульсов pinMode(A0, INPUT); // вход фотодатчика pinMode(13, OUTPUT); // выход светодиода pinMode(7, OUTPUT); // выход пищульки pinMode(3, INPUT); // вход контроля питания alarm_m = EEPROM.read(0); alarm_h = EEPROM.read(1); // ЧТЕНИЕ EEPROM attachInterrupt(0, buttonTick, FALLING); // ловим 0 clock.setOutput(DS3231_1HZ); // активация секундных импульсов butt1.setTickMode(AUTO); // опрос кнопки вкл будилька butt2.setTickMode(AUTO); // опрос кнопки установки будильника butt3.setTickMode(AUTO); // порос кнопки + butt4.setTickMode(AUTO); // опрос кнопки — //Serial.begin(9600); } void loop() { if (digitalRead(3) == LOW) { // контроль за питанием x = 0; z = map(analogRead(A0), 100 , 1000 , 1, 7); // опрос фоторезистора (0 - 7 минимум - максимум) } else { z = 1; // минимальная яркость x = 2; // показ времени на 1 сек } disp.brightness(z); // яркость dt = clock.getDateTime(); // опрос часов alarm(); // вкл или откл будильника if (butt1.isClick()) { // ПРИ НАЖАТИИ НА КНОПКУ МЕНЮ ПРЕРЫВАЕТСЯ СИГНАЛ БУДИЛНИКА ton = 1; } if (dt.hour * 100 + dt.minute != alarm_h * 100 + alarm_m) { // совпадение времени будильника ton = 0; } if (on == 1) { pic(); } while (x == 0) { // ЦИКЛ С ГЛАВНЫМ МЕНЮ НА ДИСПЛЕЕ if (count > 7) { // ставим 57 при заливке в реальные часы menu++; count = 0; delay(2); if (menu > 1) { menu = 0; } } if (menu == 0) { // показ времени disp.displayClock(dt.hour, dt.minute); point_(); } if (menu == 1) { // ВЫВОД ТЕМПЕРАТУРЫ sensor.requestTemp(); // Запрашиваем преобразование температуры delay(100); // Ожидаем окончания преобразования float temp; // температура будет с десятыми градуса temp = sensor.getTemp(); // получаем температуру disp.clear(); // очищаем дисплей int t; // задаём временную переменную t = round(temp); // t станет целым disp.display(0, t / 10); // выводм десятки градусов disp.display(1, t % 10); // выводм единицы градусов disp.displayByte(2, _degree); // выводим знак градуса disp.displayByte(3, _C); // выводим знак Цельсия disp.point(0); // выкл точки if (count > 1) { count = 0; menu = 0; } } if (butt2.isHolded()) { pisk(); // писк x = 1; } break; } while (x == 1) { // ЦИКЛ С МЕНЮ установки будильника НА ДИСПЛЕЕ if (mode == 0) { alarm_bud(); } if (butt2.isClick()) { pisk(); // писк count = 0; mode++; delay(2); if (mode > 2) { mode = 0; } } if (mode == 1) { // установка минут будильника if (digitalRead(2) == HIGH || butt4.isHold() || butt3.isHold()) { alarm_bud(); } else { alarm_hor(); } if (butt3.isClick() && x == 1) { pisk(); // писк count = 0; alarm_m++; // МИНУТЫ БУДИЛЬНИКА + delay(50); } if (alarm_m > 59) { alarm_m = 0; } if (butt4.isClick() && x == 1) { pisk(); // писк count = 0; alarm_m--; // МИНУТЫ БУДИЛЬНИКА - delay(50); } if (alarm_m < 0) { alarm_m = 59; } if (butt3.isStep() && x == 1) { count = 0; alarm_m++; // МИНУТЫ БУДИЛЬНИКА + delay(50); } if (alarm_m > 59) { alarm_m = 0; } if (butt4.isStep() && x == 1) { count = 0; alarm_m--; // МИНУТЫ БУДИЛЬНИКА - delay(50); } if (alarm_m < 0) { alarm_m = 59; } } if (mode == 2) { // установка часов будильника if (digitalRead(2) == HIGH || butt4.isHold() || butt3.isHold()) { alarm_bud(); } else { alarm_min(); } if (butt3.isClick() && x == 1) { pisk(); // писк count = 0; alarm_h++; // часы БУДИЛЬНИКА + delay(50); } if (alarm_h > 23) { alarm_h = 0; } if (butt4.isClick() && x == 1) { pisk(); // писк count = 0; alarm_h--; // часы БУДИЛЬНИКА - delay(50); } if (alarm_m < 0) { alarm_h = 23; } if (butt3.isStep() && x == 1) { count = 0; alarm_h++; // часы БУДИЛЬНИКА + delay(50); } if (alarm_h > 23) { alarm_h = 0; } if (butt4.isStep() && x == 1) { count = 0; alarm_h--; // часы БУДИЛЬНИКА - delay(50); } if (alarm_m < 0) { alarm_h = 23; } } if (w == 0) { // ПРИ ВЫХОДЕ ИЗ МЕНЮ ОБНОВЛЕНИЕ EEPROM EEPROM.update(0, alarm_m); EEPROM.update(1, alarm_h); } if (count > 10) { count = 0; x = 0; } if (butt2.isHolded()) { pisk(); // писк x = 0; } } while (x == 2) { // ЦИКЛ при пропадании питания if (count > 8) { // ставим 58 при заливке в реальные часы dark ++; count = 0; delay(2); if (dark > 1) { dark = 0; } } if (dark == 0) { // показ времени byte date_d[] = {0x0f, 0x0f, 0x0f, 0x0f}; disp.display(date_d); // выводим пустой экран point_(); } if (dark == 1) { // показ времени на 1 сек disp.displayClock(dt.hour, dt.minute); point_(); if (count >= 1) { count = 0; dark = 0; } } break; } } void buttonTick() { // считаем секунды count++; if (count > 60) { count = 0; } } void point_() { //МИГАНИЕ ДВОЕТОЧИЯ if (digitalRead(2) == HIGH) { disp.point(1); } else { disp.point(0); } } void alarm() { // вкл или откл будильника if (butt1.isHolded()) { digitalWrite(13, !digitalRead(13)); //инвертируем состояние пина if (digitalRead(13) == HIGH) { on = 1; // БУДИЛЬНИК ВКЛЮЧЕН } if (digitalRead(13) == LOW) { on = 0; // БУДИЛЬНИК ВЫКЛЮЧЕН } } } void pic() { // СИГНАЛ БУДИЛЬНИКА, 7 ЦИФРОВОЙ ВЫХОД if (ton == 0 && (dt.hour * 100 + dt.minute == alarm_h * 100 + alarm_m)) { if (millis() - tmr >= (flag ? period1 : period2)) { tmr = millis(); flag = !flag; pisk(); // писк } } } void alarm_bud() { // вывод значения будильника byte dat = alarm_h, mon = alarm_m; byte date_a[] = {dat / 10, dat % 10, mon / 10, mon % 10}; disp.display(date_a); // выводим будильник массивом disp.point(1); // вкл точки } void alarm_hor() { // вывод часов будильника byte dat = alarm_h, mon = alarm_m; byte date_h[] = {dat / 10, dat % 10, 0x0f, 0x0f}; disp.display(date_h); // выводим только часы будильника массивом disp.point(1); // вкл точки } void alarm_min() { // вывод минут будильника byte dat = alarm_h, mon = alarm_m; byte date_m[] = {0x0f, 0x0f, mon / 10, mon % 10}; disp.display(date_m); // выводим только минуты будильника массивом disp.point(1); // вкл точки } void pisk() { digitalWrite(7, 1); delay (100); // писк noTone(7); }