====== Бионический будильник ====== **[[arduino-projects:start|Проекты на Arduino Uno и Slot Shield]]** Сейчас в моде всякие умные или бионические будильники. Они заранее плавно добавляют свет в спальне — пробуждение становится гораздо комфортней. {{ :arduino-projects:start:alarmclock5.png |}} В качестве источника света используем [[amp>product/troyka-rgb-led-4x4?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|RGB матрицу]] из 16 цветных светодиодов. У каждого из них есть свой контроллер, поэтому отдельными светодиодами можно управлять независимо от других. По сути это маленькая светодиодная лента, сложенная на дюймовом модуле. В остальном — это классический будильник на Ардуино. Управляющая плата — оригинальная [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Arduino Uno]]. За время отвечает модуль [[amp>product/troyka-rtc?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|часов реального времени]]. Для управления гаджетом используется [[amp>product/troyka-quad-switch?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|четырёхкнопочная клавиатура]]. * Платформы: [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Arduino Uno]], [[amp>product/arduino-leonardo?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Arduino Leonardo]], [[amp>product/iskra-neo?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Iskra Neo]] * Язык программирования: Arduino (C++) ===== Что потребуется ===== [[amp>collection/alarm-clock?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki | Полный сет]] компонентов проекта. В сет входят: * [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Arduino Uno]] * [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Troyka Slot Shield]] * четырёхразряный индикатор [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Quad Display]] * [[amp>product/troyka-quad-switch?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|четырёхкнопочная клавиатура]] * [[amp>product/troyka-rtc?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|часы реального времени]] и [[amp>product/battery-cr1225?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|батарейка CR1225]] * [[amp>product/troyka-buzzer?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|пьезопищалка]] * [[amp>product/troyka-rgb-led-4x4?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|RGB матрица 4×4]] ===== Видеоинструкция ===== {{youtube>eUlIHs75VaY?large}} ===== Как собрать ===== Установите [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Troyka Slot Shield]] на [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Arduino Uno]] {{ :arduino-projects:bionical-alarm:alarmclock0.png |}} Вставьте [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Quad Display]] в разъёмы ''E'' и ''F''. Пин ''CS'' подключу к ''10'' пину Arduino. {{ :arduino-projects:bionical-alarm:alarmclock1.png |}} Установите [[amp>product/troyka-quad-switch?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|четырёхкнопочную клавиатуру]] в слот ''C''. Сигнал первой кнопки подключите к пину ''0'', второй к ''1'', третьей к ''4'' и четвёртой к ''5''. {{ :arduino-projects:bionical-alarm:alarmclock2.png |}} [[amp>product/troyka-rtc?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|Часы реального времени]] вставьте в пины ''I²C'' разъёма ''B''. Вставьте батарейку [[amp>product/battery-cr1225?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|CR1225]] в держатель на лицевой панели модуля. {{ :arduino-projects:bionical-alarm:alarmclock3.png |}} Подключите [[amp>product/troyka-buzzer?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|пьезопищалку]] к пину ''7'' слота ''A''. {{ :arduino-projects:bionical-alarm:alarmclock4.png |}} Установите [[amp>product/troyka-rtc?utm_source=proj&utm_campaign=arduino-slot-proj-5&utm_medium=wiki|светодиодную матрицу]] в слот ''D'' и подключите к пину ''8''. {{ :arduino-projects:bionical-alarm:alarmclock5.png |}} ===== Скетч ===== Прошейте контроллер скетчем через [[articles:arduino-ide-install|Arduino IDE]]. // Подключаем библиотеку для работы с дисплеем #include // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(10); // библиотека для работы I²C #include // библиотека для работы с часами реального времени #include "TroykaRTC.h" // создаём объект для работы с часами реального времени RTC clock; // библиотека для работы с кнопками #include "TroykaButton.h" // библиотека для работы с RGB-матрицей #include // пины к которым подключены кнопки #define BUTTON_PIN_1 0 #define BUTTON_PIN_2 1 #define BUTTON_PIN_3 4 #define BUTTON_PIN_4 5 // пин к которому подключена пищалка #define BUZZER_PIN 7 // номер пина, к которому подключена RGB-матрица #define MATRIX_PIN 8 // количество светодиодов в матрице #define LED_COUNT 16 // создаём объект класса Adafruit_NeoPixel Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, MATRIX_PIN, NEO_GRB + NEO_KHZ800); // создаём объект для работы с кнопкой TroykaButton button1(BUTTON_PIN_1); TroykaButton button2(BUTTON_PIN_2); TroykaButton button3(BUTTON_PIN_3); TroykaButton button4(BUTTON_PIN_4); // создаем объект класса long для хранения счетчиков для света и звука unsigned long lightTime = 0; unsigned long buzzerTime = 0; // переменные для хранения времени будильника int hoursAlarm = 12; int minutesAlarm = 59; // переменные для хранения яркости цветов int r; int g; // переменная для переключения между установкой часов и установкой будильника boolean state = true; // переменная для переключения света boolean daylight = false; void setup() { // инициализация дисплея qd.begin(); // инициализация часов clock.begin(); // метод установки времени и даты в модуль вручную // clock.set(10,25,45,20,05,2019,MONDAY); // метод установки времени и даты автоматически при компиляции clock.set(__TIMESTAMP__); // что бы время менялось при прошивке или сбросе питания // закомментируйте оба метода clock.set(); // инициализация кнопок button1.begin(); button2.begin(); button3.begin(); button4.begin(); //инициализация выхода пищалки pinMode(BUZZER_PIN, OUTPUT); // инициализация RGB-матрицы matrix.begin(); // гасим LED матрицу colorWipe(matrix.Color(0, 0, 0)); } void loop() { // запрашиваем данные с часов clock.read(); // считываем показания часов и минут в переменные int hours = clock.getHour(); int minutes = clock.getMinute(); // считывание данных с кнопок button1.read(); button2.read(); button3.read(); button4.read(); // если кнопка «1» длительно зажата if (button1.isHold()) { // меняем состояние будильника state = !state; // в зависимости от текущего состояние будильника if (!state) { qd.displayDigits(QD_A, QD_L, QD_NONE, QD_NONE); } else { qd.displayDigits(QD_t, QD_I, QD_NONE, QD_NONE); } // ждём пару секунд delay(2000); } // в зависимости от текущего режима работы будильника // «текущее время / время подъема» // если режим «текущее время» if (state) { // в зависимости от состояние кнопок // увеличиваем / уменьшаем часы и минуты if (button1.isClick()) { clock.setHour(hours + 1); } else if (button2.isClick()) { clock.setHour(hours - 1); } else if (button3.isClick()) { clock.setMinute(minutes - 1); } else if (button4.isClick()) { clock.setMinute(minutes + 1); } // запрашиваем данные с часов clock.read(); // считываем показания часов и минут в переменные hours = clock.getHour(); minutes = clock.getMinute(); // выводим время на дисплей qd.displayScore(hours, minutes, true); } else { // если режим «время подъема» // в зависимости от состояние кнопок // увеличиваем / уменьшаем часы и минуты if (button1.isClick()) { hoursAlarm++; } else if (button2.isClick()) { hoursAlarm--; } else if (button3.isClick()) { minutesAlarm--; } else if (button4.isClick()) { minutesAlarm++; } // запускаем защиту от перехода через 0 parsingAlarmTime(); // выводим будильник на дисплей qd.displayScore(hoursAlarm, minutesAlarm); } // за 5 минут до подъема while (hours == hoursAlarm && minutes == minutesAlarm-5) { // запускаем "рассвет" daylight = true; break; } // защита от пограничного случая включения while (hours+1 == hoursAlarm && minutesAlarm == 0) { // запускаем "рассвет" daylight = true; break; } // пришло время подъема? while (hours == hoursAlarm && minutes == minutesAlarm) { if (millis() - buzzerTime > 1000) { // запускаем звуковую функцию подъема tone(BUZZER_PIN, 500, 100); buzzerTime = millis(); } break; } // пора выключать будильник? while (hours == hoursAlarm && minutes == minutesAlarm+1) { // выключаем "рассвет" daylight = false; // выключаем подсветку colorWipe(matrix.Color(0, 0, 0)); // обнуляем значения цвета r = 0; g = 0; break; } // защита от пограничного случая выключения while (hours-1 == hoursAlarm && minutesAlarm == 59) { // выключаем "рассвет" daylight = false; // выключаем подсветку colorWipe(matrix.Color(0, 0, 0)); // обнуляем значения цвета r = 0; g = 0; break; } // пора зажигать свет? while (daylight) { // плавно зажигаем Зеленый if (r == 0 && g < 255) { if (millis() - lightTime > 400) { colorWipe(matrix.Color(r, g, 0)); g++; lightTime = millis(); } } // плавно добавляем Красный if (r < 255 && g == 255) { if (millis() - lightTime > 400) { colorWipe(matrix.Color(r, g, 0)); r++; lightTime = millis(); } } // плавно гасим Зеленый if (r == 255) { if (millis() - lightTime > 400) { colorWipe(matrix.Color(r, g, 0)); if (g != 0){ g--; } lightTime = millis(); } } break; } } // функция защиты от перехода через 0 void parsingAlarmTime() { if (hoursAlarm > 23) { hoursAlarm = 0; } else if (hoursAlarm < 0) { hoursAlarm = 23; } if (minutesAlarm > 59) { minutesAlarm = 0; } else if (minutesAlarm < 0) { minutesAlarm = 59; } } // функция заполнения каждого сегмента LED матрици void colorWipe(uint32_t c) { for (uint16_t i = 0; i < matrix.numPixels(); i++) { // заполняем текущий сегмент выбранным цветом matrix.setPixelColor(i, c); matrix.show(); } } ====== Часто задаваемые вопросы ====== > Где скачать необходимые библиотеки и как их установить? * [[https://github.com/amperka/QuadDisplay2|Библиотека для работы с дисплеем]] * [[https://github.com/amperka/TroykaRTC|Библиотека для часов реального времени]] * [[https://github.com/amperka/TroykaButton|Библиотека для работы с кнопками]] * [[https://github.com/adafruit/Adafruit_NeoPixel|Библиотека Adafruit NeoPixel]] * [[программирование:библиотеки|Как установить библиотеку]] > У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте? У вас предыдущая версия модуля. Она снята с производства пару лет назад. С этим скетчем, библиотекой и схемой сборки модуль работать не будет.