Проект 11. Часы

Устройство часы в представлении не требуется. Устройство показывает текущее время.

Описание работы:

Для начала работы подключите питание к Arduino. На индикаторе появится текущее время. Для настройки времени, нажмите любую кнопку, либо зеленую, либо красную. Уменьшится яркость индикатора, значит можно настраивать время. При нажатии или удержании зеленой кнопки будут увеличиваться минуты до 59. При нажатии или удержании красной кнопки будут уменьшаться минуты до 0. При достижении минут 59, увеличивается количество часов, а значение минут установится в 0. При достижении минут 0, уменьшится количество часов, а значение минут установится в 59. При достижении часов 23, значение часов сбросится в 0, а при достижении часов 0, значение часов установится в 23. После установки нужного времени, необходимо подождать две секунды. Тогда выбранное время сохранится, индикатор увеличит свою яркость, а время пойдет как прежде.

Нам понадобится:

Для реализации проекта нам необходимо установить следующие библиотеки:

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.

Схема сборки:

  • Полученные результат представлен ниже на рисунке.

Код программы:

#include <iarduino_4LED.h>                                       // Подключаем библиотеку iarduino_4LED
iarduino_4LED dispLED(1, A0);                                    // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ).
                                                                 //
#include <iarduino_RTC.h>                                        // Подключаем библиотеку.
iarduino_RTC time(RTC_DS3231);                                   // Объявляем объект time для модуля на базе чипа DS3231.
                                                                 //
const int pinKeyRed = A3;                                        // Объявляем пин для работы с красной кнопкой.
const int pinKeyGreen = 11;                                      // Объявляем пин для работы с зеленой кнопкой.
                                                                 //
int m;                                                           // Переменная для минут.
int h;                                                           // Переменная для часов.
int i;                                                           // Переменная счета.
int k;                                                           // Переменная счета.
int menu;                                                        // Переменная события.
int minPrev;                                                     // Переменная предыдущего значения минут.
                                                                 //
void ShowTime();                                                 // Функция показа времени.
                                                                 //
void setup()                                                     //
{                                                                //
  pinMode(pinKeyGreen, INPUT);                                   // Переводим вывод pinKeyGreen в режим входа.
  pinMode(pinKeyRed, INPUT);                                     // Переводим вывод pinKeyRed в режим входа.
  dispLED.begin();                                               // Инициируем LED дисплей.
  time.begin();                                                  // Инициируем RTC модуль.
  menu = 1;                                                      // Задаем событие 1.
}                                                                //
                                                                 //
void loop()                                                      //
{                                                                //
time.gettime();                                                  // Читаем время, обновляя значения всех переменных.
  switch(menu)                                                   // Выбор события.
  {                                                              //
    case 1:                                                      // Событие 1.
    dispLED.light(7);                                            // Устанавливаем максимальную яркость свечения LED индикатора.
    if(digitalRead(pinKeyGreen) || digitalRead(pinKeyRed))       // Проверка нажатия зеленой кнопки или нажатия красной кнопки.
    {                                                            //
      h = time.Hours;                                            // Сохраняем текущее значение часов.
      m = time.minutes;                                          // Сохраняем текущее значение минут.
      menu = 2;                                                  // Переходим к действию 2.
    }                                                            //
                                                                 //
    if(fmod(time.seconds,2))                                     // Проверка значении на четность/нечетность с помощью функции остаток от деления. При делении на два, если остаток равен 1.
    {                                                            //
      dispLED.point(0, false);                                   // Выключаем двоеточие.
      dispLED.point(2, true);                                    // Включаем вторую точку.
    }                                                            //
    else                                                         // Если остаток от деления равен 0.
    {                                                            //
      dispLED.print( time.Hours , time.minutes , TIME );         // Вывод времени.
    }                                                            //
    break;                                                       // Выходим из оператора case.
                                                                 //
    case 2:                                                      // Событие 2.
    dispLED.light(1);                                            // Устанавливаем небольшую яркость свечения LED индикатора
    dispLED.point(2, true);                                      // Включаем вторую точку.
    if(digitalRead(pinKeyGreen) && digitalRead(!pinKeyRed))      // Проверка нажатия зеленой кнопки и не нажатия красной кнопки.
    {                                                            //
      while(digitalRead(pinKeyGreen) && digitalRead(!pinKeyRed)) // Цикл слежения нажатой зеленой кнопки.
      {                                                          //
        delay(10);                                               // Ждём пока мы её не отпустим.
        if(i<150){i++;} else{delay(10);m++;ShowTime();}          // Фиксируем, как долго удерживается кнопка pinKeyGreen, если дольше 2 секунд, то увеличиваем минуты, до отжатия кнопки.
      }                                                          //
      if(i<150){m++;ShowTime();}                                 // Если кнопка pinKeyGreen удерживалась меньше 2 секунд, то увеличиваем минуты.
      i = 0;                                                     // Обнуляем переменную счета.
    }                                                            //
                                                                 //
    if(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen))      // Проверка нажатия красной кнопки и не нажатия зеленой кнопки.
    {                                                            //
      while(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen)) // Цикл слежения нажатой зеленой кнопки.
      {                                                          //
        delay(10);                                               // Ждём пока мы её не отпустим.
        if(i<150){i++;} else{delay(10);m--;ShowTime();}          // Фиксируем, как долго удерживается кнопка pinKeyRed, если дольше 2 секунд, то увеличиваем минуты, до отжатия кнопки.
      }                                                          //
      if(i<150) {m--;ShowTime();}                                // Если кнопка pinKeyRed удерживалась меньше 2 секунд, то увеличиваем минуты.
      i = 0;                                                     // Обнуляем переменную счета.
    }                                                            //
                                                                 //
    if (m == minPrev){k++;}                                      // Если предыдущее и нынешнее значение минут одинаково, то увеличиваем переменную счета.
    else {k = 0;}                                                // Иначе, обнуляем переменную счета.
    if (k >= 150) {menu = 1; k = 0;}                             // Если переменная счета больше 150, то задаем событие 1, обнуляем переменную счета.
    minPrev = m;                                                 // Сохраняем нынешнее значение минут в переменную предыдущего значения минут.
    break;                                                       // Выходим из оператора case.
  }                                                              //
}                                                                //
                                                                 //
void ShowTime()                                                  // Функция показа времени.
{                                                                //
  dispLED.point(2, true);                                        // Включаем вторую точку.
  if (m > 59){h++; if (h > 23){h = 00;} m = 00;}                 // Если значение минут больше 59, увеличиваем переменную час, если переменная часа больше 23, то обнуляем часы, обнуляем минуты.
  if (m < 00){h--; if (h < 00){h = 23;} m = 59;}                 // Если значение минут меньше 00, уменьшаем переменную час, если переменная часа меньше 00, то присваиваем часам максимальное значение 59, присваиваем минутам максимальное значение 59.
  time.settime(-1, m, h);                                        //
  dispLED.print( time.Hours , time.minutes , TIME );             // Вывод времени.
}                                                                //

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

В коде setup выполняются следующие действия:

  • Переводим выводы pinKeyGreen для зеленой кнопки и pinKeyRed для красной кнопки в режим выхода.
  • Инициируем LED дисплей.
  • Инициируем RTC модуль.
  • Задаем событие 1.

В коде loop выполняются следующие действия:

  • Читаем время, с модуля часов реального времени.
  • Устанавливаем максимальную яркость свечения индикатора.
  • Событию 1.
  • Проверяем нажата зеленая или красная кнопка. Если одна из кнопок нажата, то сохраняем текущее значение времени в переменные времени и разрешаем переход к событию 2.
  • Каждую секунду включаем и выключаем вторую точку на индикаторе. Для этого проверяем четность/нечетность приходящих секунд с модуля реального времени. Если нечетное, включаем вторую точку на индикаторе и гасим двоеточие на индикаторе, если оно присутствует на индикаторе. Если четное, то выводим на индикатор текущее время.
  • Событие 2.
  • Уменьшаем яркость свечения индикатора.
  • Включаем вторую точку на индикаторе.
  • Проверяем нажата зеленая кнопка. Если нажата, то заходим в цикл нажатия зеленой кнопки. Там фиксируем, как долго удерживается зеленая кнопка: если дольше 2 секунд, то увеличиваем быстро минуты и выводим изменение на индикатор. Как только кнопка отжата, увеличение прекратится. Если же нажата один раз зеленая кнопка, то увеличение минут произойдет один раз. Обнуляем переменную счета.
  • Проверяем нажата красная кнопка. Если нажата, то заходим в цикл нажатия красной кнопки. Там фиксируем, как долго удерживается красная кнопка: если дольше 2 секунд, то уменьшаем быстро минуты и выводим изменение на индикатор. Как только кнопка отжата, уменьшение прекратится. Если же нажата один раз красная кнопка, то уменьшение минут произойдет один раз. Обнуляем переменную счета.
  • Проверяем совершалось изменение минут. Если предыдущее значение минут совпадает с нынешним значением минут, то увеличиваем переменную счета, иначе обнуляем переменную счета.
  • Если переменная счета больше 150, то разрешаем переход к событию 1. Обнуляем переменную счета.
  • Сохраняем нынешнее значение минут в переменную предыдущего значения минут.

Ссылки:

Обсуждение