====== Кухонный таймер ======
** [[slot-box:start#хочу_собрать|Проекты на Arduino и Slot Shield]] **
Простой электронный таймер запустит обратный отсчёт и громко пропищит о его окончании. Временной интервал задаётся ручкой потенциометра, а отсчёт запускается и останавливается кнопкой.
{{ :slot-box:timer:timer.jpg |}}
  * Платформы: [[amp>product/arduino-uno?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|Arduino Uno]], [[amp>product/arduino-leonardo?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|Arduino Leonardo]], [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|Iskra Neo]]
  * Язык программирования: Arduino (C++)
===== Видеоинструкция =====
{{youtube>tWQRUhX7NyY?large}}
===== Что потребуется =====
[[amp>collection/kitchen-timer?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki | Полный сет]] компонентов проекта. В сет входят:
  * [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|Iskra Neo]]
  * [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|Troyka Slot Shield]]
  * [[amp>product/structor-slot-box?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|#Slot Box]]
  * [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|четырёхразрядный индикатор]], 
  * [[amp>product/troyka-button?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|кнопка]]
  * [[amp>product/troyka-potentiometer?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|потенциометр]]
  * [[amp>product/troyka-buzzer?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|пьезопищалка]]
===== Как собрать =====
Установите [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|Troyka Slot Shield]] на [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|Iskra Neo]]
{{ :slot-box:timer:step1.png?600 |}}
Вставьте [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|четырёхразрядный индикатор]] в левый нижний слот
{{ :slot-box:timer:step2-q2.png |}}
Поверните модуль [[amp>product/troyka-potentiometer?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|потенциометра]] на 180 градусов и вставьте в правый нижний слот.
{{ :slot-box:timer:step3-q2.png |}}
Вставьте [[amp>product/troyka-buzzer?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|пьезопищалку]] в верхний левый слот.
{{ :slot-box:timer:step4-q2.png |}}
Вставьте [[amp>product/troyka-button?utm_source=proj&utm_campaign=slot-proj-3&utm_medium=wiki|кнопку]] в правый верхний слот.
{{ :slot-box:timer:step5-q2.png |}}
===== Скетч =====
Прошейте контроллер скетчем через [[articles:arduino-ide-install|Arduino IDE]].
// Подключаем библиотеку для работы с дисплеем
#include 
 
// номер аналогового пина пищалки
#define POT_PIN     A0
// номер цифрового пина пищалки
#define BUZZER_PIN  2
// номер цифрового пина кнопки
#define BUTTON_PIN  4
// создаём объект класса QuadDisplay и передаём номер пина CS
QuadDisplay qd(9);
// переменная для подсчёта времени
unsigned long prevMillis = 0;
 
// переменная для хранения таймера
int reverseTimer;
 
void setup()
{
  // инициализация дисплея
  qd.begin();
  // функция установки таймера
  settingTimer();
}
void loop()
{
  // если время таймера не дошло до нуля и прошла 1 секунда
  if ((reverseTimer > 0) && ((millis() - prevMillis) > 1000)) {
    // выводим значение на дисплей
    qd.displayInt(--reverseTimer);
    // запоминаем текущее время
    prevMillis = millis();
    // если таймер дошёл до нуля
    if (reverseTimer == 0) {
      // подаём звуковой сигнал и выводим «Off» на дисплей
      qd.displayDigits(QD_NONE, QD_O, QD_f, QD_f);
      tone(BUZZER_PIN, 4000, 200);
    }
  }
  // если нажата кнопка
  if (!digitalRead(BUTTON_PIN)) {
    // подаём звуковой сигнал
    tone(BUZZER_PIN, 500, 500);
    delay(1000);
    // выполняем настройку таймера
    settingTimer();
  }
}
 
// функция настройки таймера
void settingTimer()
{
  // пока кнопка не нажата
  while (digitalRead(BUTTON_PIN)) {
    // считываем значения с потенциометра
    reverseTimer = analogRead(A0);
    // и выводим его на дисплей
    qd.displayInt(reverseTimer);
    delay(30);
  }
  // после нажатия кнопки, подаём звуковой сигнал
  tone(BUZZER_PIN, 2000, 200);
  delay(300);
  tone(BUZZER_PIN, 3000, 200);
  delay(300);
  tone(BUZZER_PIN, 4000, 200);
}
===== Что дальше? =====
Хотите собрать другой девайс?
Выберите своё будущее устройство из [[slot-box:start#хочу_собрать|списка проектов на Slot Shield]].
===== FAQ =====
> Где скачать и как установить необходимые библиотеки?
  * [[https://github.com/amperka/QuadDisplay2|Скачать библиотеку для для работы с дисплеем]]
  * [[программирование:библиотеки|Установить библиотеку]]
> У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте?
Да, модуль можно использовать, но скетч, библиотеки и схема сборки отличаются.
Вставьте QuadDisplay в правый нижний слот {{ :slot-box:timer:step2.png?500 |}}
Прошейте контроллер скетчем через [[articles:arduino-ide-install|Arduino IDE]].
// Подключаем библиотеку для работы с дисплеем
#include 
 
// номер аналогового пина потенциометра
#define POT_PIN     A0
// номер цифрового пина пищалки
#define BUZZER_PIN  2
// номер цифрового пина кнопки
#define BUTTON_PIN  4
// номер цифрового пина дисплея
#define DISPLAY_PIN 11
 
// переменная для подсчёта времени
unsigned long prevMillis = 0;
 
// переменная для хранения таймера
int reverseTimer;
 
void setup()
{
  // функция установки таймера
  settingTimer();
}
void loop()
{
  // если время таймера не дошло до нуля и прошла 1 секунда
  if ((reverseTimer > 0) && ((millis() - prevMillis) > 1000)) {
    // выводим значение на дисплей
    displayInt(DISPLAY_PIN, --reverseTimer);
    // запоминаем текущее время
    prevMillis = millis();
    // если таймер дошёл до нуля
    if (reverseTimer == 0) {
      // подаём звуковой сигнал и выводим «Off» на дисплей
      displayDigits(DISPLAY_PIN, QD_NONE, QD_O, QD_f, QD_f);
      tone(BUZZER_PIN, 4000, 200);
    }
  }
  // если нажата кнопка
  if (!digitalRead(BUTTON_PIN)) {
    // подаём звуковой сигнал
    tone(BUZZER_PIN, 500, 500);
    delay(1000);
    // выполняем настройку таймера
    settingTimer();
  }
}
 
// функция настройки таймера
void settingTimer()
{
  // пока кнопка не нажата
  while (digitalRead(BUTTON_PIN)) {
    // считываем значения с потенциометра
    reverseTimer = analogRead(A0);
    // и выводим его на дисплей
    displayInt(DISPLAY_PIN, reverseTimer);
    delay(30);
  }
  // после нажатия кнопки, подаём звуковой сигнал
  tone(BUZZER_PIN, 2000, 200);
  delay(300);
  tone(BUZZER_PIN, 3000, 200);
  delay(300);
  tone(BUZZER_PIN, 4000, 200);
}
Скачайте и установите [[https://github.com/amperka/QuadDisplay|библиотеку для работы с «трёхногим» дисплеем]].