Часы на ардуино

Урок 19. RTC часы с будильником

В предыдущем уроке 18, мы подключили Trema RTC часы реального времени с Trema кнопками и LCD I2C дисплеем к arduino Uno, написали скетч, для установки времени при помощи кнопок.

Теперь расширим функционал получившихся часов, добавив к ним функцию будильника. А код, который будет выполняться при срабатывании будильника выведем в отдельную функцию “Func_alarm_action()”, чтоб Вы смогли легко его найти и изменить. Например, при срабатывании будильника, открывать жалюзи, включать свет или музыку, включить через реле тостер или кофе-машину и т.д.

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

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

  • Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)

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

Видео:

Схема подключения:

Подключение модулей RTC и LCD, данного урока, осуществляется к аппаратным выводам SDA, и SCL.

RTC модуль Trema на базе чипа DS1307 / LCDдисплей на базе чипа LCD1602Arduino Uno
GND GND
Vcc +5V
SDA (Serial DAta) A4
SCL (Serial CLock) A5

Подключение кнопок: кнопка «SET» к выводу 2, кнопка «UP» к выводу 3 и копка «DOWN» к выводу 4.

Зуммер подключаем к выводу 5, а светодиод к выводу 13 (дублируя встроенный в arduino).

Алгоритм работы кнопок следующий:

  • В режиме вывода даты/времени/будильника (обычный режим):
    • Кратковременное нажатие на кнопку SET переключает режимы вывода: даты/времени/будильника
    • Удержание кнопки SET переводит часы в режим установки даты/времени/будильника (зависит от того, каким был режим вывода)
    • Кнопки UP и DOWN, в режиме вывода будильника, активируют/деактивируют будильник.Если будильник активен, то в правом верхнем углу экрана появляется значок будильника.
  • В режиме установки даты/времени/будильника:
    • Кратковременное нажатие на кнопку SET – переход между устанавливаемыми параметрами (сек, мин, час, дни, мес, год, д.н.)
    • Удержание кнопки SET выводит часы из режима установки
    • Каждое нажатие на кнопку UP увеличивает значение устанавливаемого параметра даты или времени
    • Каждое нажатие на кнопку DOWN уменьшает значение устанавливаемого параметра даты или времени
  • Во время работы сигнализации будильника:
    • Удержание любой кнопки в течении 1 секунды, отключает сигнализацию (без выполнения их действий, в любом режиме)

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

Работа кнопок, вывод и установка времени, описывались в уроке 18, в этом уроке рассмотрим работу будильника:

В начале кода добавляем две константы: PIN_alarm_TONE и PIN_alarm_LED, указывающие номера выводов зуммера и светодиода.
А также добавляем четыре переменные: VAR_alarm_MIN, VAR_alarm_HOUR, VAR_alarm_FLAG1 и VAR_alarm_FLAG2.

  • VAR_alarm_MIN – переменная в которой хранится значение минут, при котором сработает будильник (по умолчанию 0 минут)
  • VAR_alarm_HOUR – переменная в которой хранится значение часов, при котором сработает будильник (по умолчанию 0 часов)
  • VAR_alarm_FLAG1 – флаг разрешения работы будильника, false – не активен, true – активен (по умолчанию true – активен)
  • VAR_alarm_FLAG2 – флаг указывающий на то, что будильник сработал “сигнализация” (по умолчанию false – не сработал)

Последняя переменная которую мы добавили – MAS_alarm_SYM, она содержит изображение символа будильника для вывода на дисплей.

В функции loop, после вывода информации на дисплей, добавляем проверку: не пора ли включить будильник?

void loop(){ if(millis()%1000==0){ // если прошла 1 секунда … …
// проверка будильника if(VAR_alarm_FLAG1){ // если будильник включён if(time.seconds==00){ // если в текущем времени 0 секунд if(time.minutes==VAR_alarm_MIN){ // если совпали минуты if(time.Hours==VAR_alarm_HOUR){ // если совпали часы VAR_alarm_FLAG2=true; // устанавливаем флаг разрешающий совершение действий будильника (сигнализация) } } } }else{VAR_alarm_FLAG2=false;} // если будильник выключен, то сбрасываем флаг разрешающий совершение действий будильника (сигнализация) if(VAR_alarm_FLAG2){Func_alarm_action();}// запускаем действия будильника } Func_buttons_control(); // передаём управление кнопкам
}

  • если будильник включён (установлен флаг VAR_alarm_FLAG1)
  • если в текущем времени 0 секунд (time.seconds==00)
  • если количество минут текущего времени (time.minutes) равно количеству минут установленных в будильнике (VAR_alarm_MIN)
  • если количество часов текущего времени (time.Hours) равно количеству часов установленных в будильнике (VAR_alarm_HOUR)то устанавливаем флаг VAR_alarm_FLAG2 (указывающий на то, что будильник сработал)
  • если установлен флаг VAR_alarm_FLAG2, то запускаем действия будильника (действия описаны в функции Func_alarm_action)Так как проверка будильника и запуск функции Func_alarm_action() находится внутри условия if(millis()%1000==0){…}, то действия будильника будут выполняться один раз в секунду.

Теперь всё готово для создания полного кода:

// Подключаем библиотеки:
#include // подключаем библиотеку для работы с шиной I2C
#include // подключаем библиотеку для работы с LCD дисплеем
#include // подключаем библиотеку для работы с RTC модулем
LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля
// Объявляем переменные и константы:
const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UP
const uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN
const uint8_t PIN_alarm_TONE = 5; // указываем номер вывода arduino, к которому подключён зуммер будильника
const uint8_t PIN_alarm_LED = 13; // указываем номер вывода arduino, к которому подключён светодиод uint8_t VAR_mode_SHOW = 1; // режим вывода: 1-время 2-дата 3-время_будильника uint8_t VAR_mode_SET = 0; // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели 8-мин_будильника 9-час_будильника uint8_t VAR_alarm_MIN = 0; // будильник минуты uint8_t VAR_alarm_HOUR = 0; // будильник часы bool VAR_alarm_FLAG1 = true; // будильник разрешение работы bool VAR_alarm_FLAG2 = false; // будильник совершение действий (сигнализация) byte MAS_alarm_SYM[8]={B00000,B01110,B10101,B10111,B10001,B01110,B00000,B00000}; // символ будильника для отображения на дисплее
void setup() { pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода PIN_button_SET, как “вход” pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода PIN_button_UP, как “вход” pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода PIN_button_DOWN, как “вход” pinMode(PIN_alarm_TONE, OUTPUT); // устанавливаем режим работы вывода PIN_alarm_TONE, как “выход” pinMode(PIN_alarm_LED, OUTPUT); // устанавливаем режим работы вывода PIN_alarm_LED, как “выход” digitalWrite(PIN_alarm_TONE, LOW); // устанавливаем уровень логического «0» на выводе PIN_alarm_TONE digitalWrite(PIN_alarm_LED, LOW); // устанавливаем уровень логического «0» на выводе PIN_alarm_LED delay(300); // ждем 300мс time.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.createChar(1, MAS_alarm_SYM); // загружаем символ будильника под номером 1
}
void loop(){ if(millis()%1000==0){ // если прошла 1 секунда if(VAR_mode_SET==0){ // если дата/время/будильник выводятся, а не устанавливаются lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(“iArduino.ru”); // выводим текст “iArduino.ru” lcd.setCursor(15, 0); // устанавливаем курсор в позицию: столбец 15, строка 0 lcd.print(VAR_alarm_FLAG1?”1″:” “); // выводим значёк будильника }else{ // если дата/время/будильник устанавливаются, а не выводятся lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 if(VAR_mode_SHOW==1){lcd.print(“Set time:” );} if(VAR_mode_SHOW==2){lcd.print(“Set date:” );} if(VAR_mode_SHOW==3){lcd.print(“Set alarm:”);} } if(VAR_mode_SHOW==1){ // если установлен режим вывода времени lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(time.gettime(“H:i:s”)); // выводим время } if(VAR_mode_SHOW==2){ // если установлен режим вывода даты lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(time.gettime(“d-m-Y D”)); // выводим дату } if(VAR_mode_SHOW==3){ // если установлен режим вывода будильника lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 if(VAR_mode_SET==0){lcd.print(“Alarm “);} time.gettime(); // обновляем значение переменной time.seconds, для “мигания” устанавливаемым параметром будильника if(VAR_mode_SET==9&&time.seconds%2){lcd.print(” “);}else{if(VAR_alarm_HOUR

Источник: https://lesson.iarduino.ru/page/urok-19-rtc-chasy-s-budilnikom/

Светодиодные часы на Arduino

Facebook

ВКонтакте

Twitter

Google+

ОК

Такие часы очень оригинально будут смотреться на стене, они имеют в наличии светодиодные стрелки имитирующие стрелочные часы, LED часы по центру и красивую фоновую RGB-подсветку. Выполнение такой самоделки сложно назвать простым, но потраченное время и силы не будут упущены зря.

Материалы для корпуса:

– Чёрные акриловые пластины 300х300х3 мм 3шт- Прозрачная акриловая подсветка 300х300х3 мм 1шт- Средство полировки акриловых пластин- Клей- Распорные втулки 15 мм с резьбой м3 20 шт- Винты м3 с шайбами 20 шт- Картинная рамка 300х300 мм 1шт

Электронные материалы:

– Сдвиговый регистр CD74HC595 8шт- LED драйвер TLC5940 1шт- Часы реального времени (RTC) DS1307 1шт- Линейный регулятор LM317 1шт- Биполярный транзистор BD139 8шт- Электролитический конденсатор 1 мкФ 2шт- Конденсатор 0.1 мкФ 1шт- Резисторы 120 Ом 60шт- Резисторы 10 кОм 9шт- Резистор 2 кОм 1шт- Резисторы 1 кОм 9шт- Резистор 330 Ом 1шт- Светодиоды 480шт- 4-х разрядный светодиодный цифровой индикатор (с общими анодами) 1шт- Светодиодная RGB-лента (с общим анодом) 1шт (длинной под окружность циферблата)

– Модуль Arduino Mega ADK (Rev3) 1шт

– Батарея питания 12 В 1шт

Шаг первый. Изготовление корпуса.

Для начала в акриловые пластины разрезают и просверливают по чертежу. Далее , происходит склеивание корпусной передней чёрной пластины с соединительной частью (прозрачной), и с пластиной под светодиоды.

Шаг второй. Окончание работы над корпусом.

Для лучшей устойчивости автор приклеивает одну акриловую пластину к задней части картинной рамки, стекло с рамки при этом предварительно вынимается и больше не понадобится.

Четыре втулки 15 мм прикручивают к пластине как на фото. Теперь, появилась возможность приклеить втулки от рамки к передней пластине. Потом эти приклеенные втулки выкручиваются для использования в будущем.

Шаг третий. Вставка светодиодов.

В первую очередь светодиоды вставляют в первый ряд отверстий ( на 1 ряд ушло 60 светодиодов). Катоды спаиваются между собой вокруг пластины с помощью медного провода 0,8мм, а аноды отгибаются в сторону.

Эта процедура повторяется для 7 остальных рядов. Теперь когда аноды расположились в один столбец, они тоже спаиваются между собой. Таким образом, получилась матрица из 8 рядов и 60 столбцов.

Шаг четвёртый.

Припаивание кабелей к матрице.

Для этого шага используются 8-проводные кабельные разъёмы один из них припаяли к катодам на матрице. Восемь таких разъёмов были припаяны к 60 столбцам анодов.

Поскольку автор использовал 8-проводные разъёмы, он получил кабель с 64 проводами, это значит что 4 осталось, они были замотаны изолентой.

Также автор рекомендует использовать семь 8-проводных и взять один 4-проводной разъем для того, чтобы получилось ровно 60.

Шаг пятый. Прикрепление индикатора.

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

Шаг шестой. Плата.

Из куска макетной платы большего размера чем требуется, отрезают 2 куска, так чтоб они входили в картинную рамку. Далее, самостоятельно изготавливают несколько коннекторов, как видно на фото ниже.

Шаг седьмой. Сборка часов.

Дальше происходит установка всех деталей в корпус согласно схеме, прикреплённой ниже. В часы автор установил заряжаемый аккумулятор 1000мА/ч чтобы они могли работать без внешнего кабеля. На Arduino устанавливают программный код, прикреплённый внизу статьи. Так, устанавливаются библиотеки для модуля часов реального времени и LED драйвер TLC5940, которые также прикреплены под статьёй. Схема с хорошим разрешением: diagram.rar [1.82 Mb] (скачиваний: 256)Такие часы, можно по желанию модернизировать сделав автоматический контроль яркости с помощью фоторезистора, или же регулировать яркость вручную с помощью потенциометра 10 кОм. Есть пространство для установки кнопки и с её помощью можно будет переключаться между разными программами. Вдобавок есть возможность поставить светодиодную ленту, которая будет подсвечивать пластиковую прозрачную часть передней панели.

Видео с частичной сборкой и примером работы часов

clock.zip [7.92 Kb] (скачиваний: 290)
led.zip [69.46 Kb] (скачиваний: 274)
led-mega-clock-arduino.zip [6.46 Kb] (скачиваний: 294)

Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Идея

Описание

Исполнение

Итоговая оценка: 10

Источник: https://USamodelkina.ru/6955-svetodiodnye-chasy-na-arduino.html

Большие настенные часы с автояркостью на Arduino – Инструкции

Понадобилось как-то сделать большие настенные часы с автоматической яркостью.

Такие часы отлично подойдут для больших помещений, например холл офиса или большая квартира.

Сделать такие большие настенные часы не представляет серьёзных сложностей при помощи данной инструкции.

Для оценки размера часов можно принять тот факт, что один сегмент часов будет размером с бумагу формата А4, что позволит легко использовать рамки для фотографий соответствующего размера.

Шаг 1. Составные части больших настенных часов

Провода, припой, паяльник, лента светодиоднаяArduino NanoDC-DC преобразователь LM2596
4 метра светодиодной ленты WS2811датчик светачасы реального времени DS3231
микропереключатели

Что я использовал для этого проекта :

Электроника :

Итого стоимость электроники : 17.78 доллара.

Дополнительно :

  1. Термоусадочная трубка
  2. Макетные платы под пайку
  3. 3микропереключателя
  4. Припой
  5. Флюс
  6. UTP кабель (расплетался на провода и использовался для внутренниз соединений, можно взять МГТФ или другой)
  7. LCD шрифт (http://www.dafont.com/lcd-lcd-mono.font)
  8. Картон
  9. Лист полистирола, можно заменить другим видом пластика который будет под рукой.

Разные инструменты.

Шаг 2. Подготовка — шаблон цифр

печатаем шаблонвырезаем сегменты

  1. Скачайте и установите шрифт на LCD  (http://www.dafont.com/lcd-lcd-mono.

    font)

  2. Откройте ворд или другой текстовый редактор и создайте шаблон как на картинке со следующими параметрами:
    • размер шрифта ~800,
    • белый шрифт с черными контурами,
    • серые прямоугольники по размеру светодиодной ленты
  3. Отпечатайте шаблон и вырежьте ножом серые прямоугольники (второе фото.

Шаг 3. Режем картон и светодиодные ленты

Истпользуя наш шаблон для цифр вырезаем картон по размерам (не забудьте оставить место для точек между часами и минутами).

Если ваша лента светодиодов идет с коннекторами отпаяйте коннекторы и порежьте ленту по три светодиода.

Шаг 4. Прикрепляем ленты

Переведенные контурыприкрепленные ленты

Используя обведенный шаблон крепим ленты к картону как показано на рисунке.

Шаг 5. Паяем светодиодные ленты

Порядок пайки одной цифрыобщий вид запаянных лент

Теперь начнем долгую процедуру пайки.

Придерживайтесь порядка пайки, показанного на картинке. Паять следует с левой середины цифры, затем вверх, назад, вниз и направо. Потом переход к новой цифре. Для средних точек я использовал еденичные отрезки ленты, прикрывая серединки кусочками изоленты.

Я использовал следующие цвета для проводов

  • Синий для земли
  • Зеленый для данных
  • Красный для Vcc (12v)

Шаг 6. Соединяем ардуино и модули на макетной плате

Таблица соединенийОбщий вид на макетке

На таблице схема соединений проводов и модулей, на следующем фото общий вид на беспаечной макетной плате.

Шаг 7. Тестируем светодиодную ленту

Прежде чем загружать приведенный ниже скетч в ардуино не забудьте включить библиотеку FastLED.

Если все настроено как надо светодиоды начнут циклически менять свой цвет. Если что то пошло не так проверьте правильность соединений.

Сам скетч можно скачать тут.

Шаг 8. Программируем часы

Немного повозившись, мне удалось получить часы, полностью удовлетворяющие моим потребностям. Я уверен что вам удастся сделать лучше моего.

Код хорошо прокоментирован и вам не составит труда в нём разобраться, сообщения отладки так-же прокоментированы очень хорошо.

Если вам нужно поменять используемый цвет настенных часов вам необходимо поменять переменную на строчке 22 ( int ledColor = 0x0000FF; // Color used (in hex)). Вы можете найти список цветов и их коды в hex на странице : https://github.com/FastLED/FastLED/wiki/Pixel-refe…

Если у вас возникли проблемы при загрузке, используйте зеркало :http://bit.ly/1Qjtgg0

Мой итоговый скетч можно скачать тут.

Шаг 9. Делаем цифры используя полистирол

Основание резакаРабочий орган резакаОбщий вид резака
Результат работы резака

Разрежьте каждый сегмент в шаблоне, напечатаетанного в начале.
Полистирол можно разрезать острым ножом, что довольно трудно, либо нехитрым приспособлением из нихромовой проволоки или гитарной струны и нескольких отрезков ОСБ-плиты.

Вы можете видеть, как это сделал я  в изображениях выше.

Для того, чтобы запитать резак я использовал 12v  блок питания.

В результате отрезаний должны получиться четыре сегмента для больших часов, один из которых показан на фото.

Шаг 10. Приклеиваем цифры и закрываем всё рассеивателем. Итоговые большие настенные часы

Свечение днемСвечение ночью

После вырезания всех четырех цифр и точек настенных часов приклеиваем их всех на картон вместе со светодиодными лентами (для упрощения процесса я использовал двустороннюю клейкую ленту)

Для того, чтобы рассеять жесткий светодиодный свет я использовал два листа бумаги поверх полистироловых цифр. Для удобства и эстетичности я использовал бумагу размера А2, сложенную вдвое.

После завершения всех этих шагов я поместил получившуюся сборку больших настенных часов в соответствующую им большую фоторамку.

Эти часы получились очень эффектными и притягивающими взгляд. Я думаю что такие большие настенные часы отлично украсят множество помещений.

Источник: https://instructables.info/bolshie-nastennyie-chasyi-na-arduino/

Часы с LED-индикаторами на Arduino | Каталог самоделок

После создания множества прототипов Arduino на макетной плате, я решил сделать что-то полезное, то, что можно использовать дома.

А что может быть полезнее, чем светящиеся часы, которые почему-то с 2010 года перестали выпускаться? Начал я сборку цифровых часов с поиска необходимых деталей.

Одним из критериев, который помог быстрее насобирать необходимые компоненты, стала доступность деталей в местных магазинах и от производителей из Китая, Малайзии.

Arduino часы реального времени (RTC) на 7-сегментных индикаторах

При сборке часов, появилось несколько вариантов настройки на них точного времени. Первый: устанавливать время на Arduino, держа его все время под питанием. Но такой метод не очень целесообразный, так как каждый раз, когда понадобиться установить время, надо будет пустить питание на Arduino.

Вторым вариантом была идея подключения 7-сегментных LED-индикаторов к GPS модулю.

Поскольку GPS сигнал дает очень точное время, этот вариант должен был решить проблему, и не пришлось бы настраивать часы каждый раз при их включении.

Я взял свой карманный навигатор Garmin GPS 60 C, подключил его в последовательный разъем к Arduino и загрузил несколько библиотек GPS, получив таким образом сигнал очень точного времени.

Проблема GPS метода оказалась в том, что, поскольку я живу центре города, то каменные джунгли непроглядными высотками окружают мой дом, и понадобилось бы поставить внешнюю GPS антенну снаружи окна, чтобы получить GPS сигнал с чистого неба. Без спутникового покрытия, никакое устройство GPS не в состоянии получить сигнал с синхронизацией по времени. Или часы должны быть на окне, либо надо было вынести GPS-антенну и проложить 7-метровый кабель до них.

Третий способ настройки часов оказался наилучшим. Заключается он в работе Arduino совместно с DS1307 часами реального времени (RTC). Питание на них идет от таблеточной 3-вольтовой батарейки, которая сохраняет настройки, когда устройство выключено и во время отсоединения микроконтроллера.

Я пошел в местный «электронный рай», расположенный в центре города, чтобы испытать свою удачу в поиске необходимых компонентов. К моему удивлению, там я нашел все необходимые детали для сборки цифровых часов.

Необходимыми деталями являются:

  1. плата Arduino для макетирования и загрузки скетча в микроконтроллер;
  2. микроконтроллер ATmega328P для работы часов;
  3. четыре красных 7-сегментных LED-индикатора (или другие, более холодного цвета, которые найдете на местном рынке);
  4. часы реального времени DS1307;
  5. кварцевый резонатор на 32,768 кГц;
  6. держатель для батарейки таблеточного размера CR2025 или CR2032;
  7. четыре микросхемы 74HC595 сдвигающего регистра для управления 7-сегментными LED-индикаторами;
  8. резисторы 220 Ом по 0.25 Вт;
  9. однорядные штыревые разъёмы;
  10. гнезда для интегральных микросхем (IC);
  11. соединительные провода.

Если нет навыков в изготовлении печатных плат, то рекомендую использовать паечную макетную плату (текстолитовая пластинка с множеством отверстий для закрепления на ней пайкой компонентов, которую ошибочно называют монтажной платой) и припаять на неё все IC гнезда микросхем и штыревые разъёмы. Благодаря таким быстроразъемным контактам все 7-сегментные LED-индикаторы и интегральные микросхемы могут быть легко заменены при необходимости.

Поскольку размер макетной платы весьма ограничен, то удалось разместить на ней только 35-миллиметровые LED-индикаторы, ведь должно было ещё остаться место для держателя таблеточной батарейки.

Хотелось бы поставить гораздо большие 7-сегментные индикаторы, но более крупным из них надо повышенное напряжение, свыше 5 В, и уже потребовалось таки усложнить схему двойными цепями питания.

Иметь дело со стабилизатором на два выходных напряжения не хочется, лучше сосредоточиться на более простой версии цифровых часов.

Разделительные керамические конденсаторы 100 нФ на ножке питания Vcc каждого регистра 74HC595 добавлены, чтобы предотвратить любые проблемы с низкочастотными помехами.

Собираемые цифровые часы используют только 5 пинов Arduino:

  • 3 цифровых выхода для сдвигающих регистров 74HC595;
  • 2 аналоговых выхода для часов реального времени, подключенных с использованием соединения I2C.

Преимущество собираемых цифровых часов на Arduino в сравнении с заводскими в том, что к ним можно легко добавить любые функции, какие только могут стать полезны.

Вот некоторые идеи доработки часов:

  1. Чередование отображения на индикаторах часов/минут и минут/секунд;
  2. Проигрывание мелодии каждый час;
  3. Установка датчика LM35, и использование часов в качестве термометра;
  4. Функция утреннего будильника;
  5. Даже управление другими электрическими приборами с помощью электромеханического реле, включающегося в соответствии с определёнными по времени событиями или показаниями подключенных датчиков.

Так как четыре индикатора довольно большие и яркие, их можно использовать также для отображения буквенной информации.

Загрузка скетча на цифровые часы

После того, как я припаял первую цифру 7 сегментного LED-индикатора с общим катодом к сдвигающему регистру 74HC595, открылась первая проблема.

Я использовал только один резистор 220 Ом, соединенный с общим катодом LED-индикатора, чтобы сберечь резисторы, и обнаружил, что когда включается число 8, то все сегменты загораются очень тускло. Это нормально для прототипа, но не годится для действующих цифровых часов.

Было бы очень неприятно иметь часы с по-разному светящимися цифрами. Так что пришлось разорвать отдельные провода и раздобыть побольше резисторов на 220 Ом, чтобы подключить их к каждому из семи сегментов LED-индикатора.

Подключение 7-сегментных индикаторов к регистрам 74HC595

Вторая проблема была в том, что я забыл выделить место для двух светодиодов диаметром 5 мм, в качестве мигающего двоеточия индикатора секунд. А индикатор третьей цифры уже был припаян.

Поскольку слишком много труда уходит на пайку одного индикатора, вместе с присоединением всех резисторов к проводам, я решил сделать выносную платку с двумя светодиодами в качестве индикаторов секунд. Я найду способ установки двух точек между часовыми и минутными цифрами! На фотографии внизу, я просто снимаю по светодиоду на 13 выводе мигания с интервалом в 500 мс.

Вот несколько фотографий собранного, работающего устройства. Теперь мне всего лишь нужно что-то вроде акрила, чтобы закрепить макетную плату и скрыть часы Arduino в общем корпусе.

Arduino часы со светодиодным индикатором секунд голубого цвета

Arduino часы со снятыми 7-сегментными LED-индикаторами

Вид сзади часов с выносной платой Arduino

Эти часы запитаны от выносной платы Arduino в версии с FTDI кабелем и гнездом DC постоянного тока.

Arduino часы с датчиком DHT11

Сборка Arduino часов завершена после установки DHT11 датчика влажности и температуры.

Источник: https://volt-index.ru/high-tech/chasyi-s-led-indikatorami-na-arduino.html

Часы на ардуино и с ЖК дисплеем своими руками

  Добрый день, сегодня я поделюсь инструкцией по изготовлению часов с комнатным термометром(Часы на ардуино своими руками).

Часы работают на Arduino UNO, для отображения времени и температуры служит графический экран WG12864B. В качестве датчика температуры – ds18b20.

В отличие от большинства других часов я не буду использовать RTS (Real Time Clock), а попробую обойтись без этого дополнительного модуля.

Схемы на ардуино отличаются своей простотой, и может начать изучать ардуино-каждый. О том как подключать библиотеки и прошивать ардуино можно почитать в нашей статье.

Приступим.

Для создания данных часов нам понадобится:

– Arduino UNO (Или любая другая Arduino совместимая плата)
– Графический экран WG12864B
– Датчик температуры ds18b20
– Резистор 4.7 Ком 0.25 Вт
– Резистор 100 ом 0.

25 Вт
– Батарейный отсек для 4 батареек типа АА «пальчиковых»
– Подходящая коробка
– Мелкий напильник
– Лак для ногтей (черный или под цвет корпуса)
– Немного тонкого пластика или картона
– Изолента
– Соединительные провода
– Монтажная плата
– Кнопки
– Паяльник
– Припой, канифоль
– Двусторонний скотч

Подготовка графического экрана.
С подключение экрана, на первый взгляд, возникает много проблем и сложностей. Но если вначале разобраться с их видами, станет намного легче и понятнее. Существует много разновидностей и типов экранов на контролере ks0107/ks0108.

Все экраны принято делить на 4 типа:
Вариант A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T
Вариант B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-12864F, TM12864L-2, 12864J-1
Вариант C: Shenzhen Jinghua Displays Co Ltd. JM12864
Вариант D: Wintek- Cascades WD-G1906G, Wintek — GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202

Список не полный, их очень много. Самый распространённый и, на мой взгляд, удобный WG12864B3 V2.0. Дисплей можно подключить к Arduino по последовательному или параллельному порту.

При использовании с Arduino UNO лучше выбрать подключение по последовательному порту – тогда нам потребуется всего 3 выхода микроконтроллера, вместо минимум 13 линий при подключении по параллельному порту. Подключается все довольно просто.

Есть еще один нюанс, в продаже можно встретить два варианта дисплеев, со встроенным потенциометром (для регулировки контраста) и без него. Я выбрал, и советую тоже сделать вам, со встроенным. 

Это уменьшает количество деталей и время пайки. Также стоит поставить токоограничительный резистор номиналом 100 Ом для подсветки. Подключая напрямую 5 вольт, существует риск сжечь подсветку. 
WG12864B – Arduino UNO
1 (GND) – GND
2 (VCC) – +5V
4 (RS) – 10
5 (R/W) – 11
6 (E) – 13
15 (PSB) – GND
19 (BLA) – через резистор – +5V
20 (BLK) – GND

Удобнее всего это все собрать сзади экрана и вывести от него 5 проводов подключения к Arduino UNO. В итоге должно получится примерно так:

Для тех кто все-таки выберет параллельное подключение приведу таблицу подключения.

И схема для экранов варианта B:

Подключение датчика температуры.
Как я уже говорил, для измерения температуры будем использовать интегральный датчик DS18B20. Выбрал его за высокую точностью измерения, погрешность не более 0,5 °C.

Датчик откалиброван при изготовлении, какой-либо дополнительной настройки не требуется. Диапазон измерения температуры -55 … + 125 °C. Есть два режима работы: с внешним источником питания и «паразитного питания».

При работе в режиме внешнего питания подключение следующее:

При использовании «паразитного питания» датчик получает питание от линии связи. В этом режиме для подключения ds18b20 к микроконтроллеру достаточно двух проводов.

Внутренний конденсатор датчика заряжается за счет энергии на линии связи при низком уровне на шине. У режима «паразитного питания» много особенностей и поэтому я не рекомендую его использовать.

Но если вы все-таки решили использовать его, вот схема:

Или можно использовать улучшенную схему подключения при использовании «паразитного питания»:

На одну линию связи может быть включено несколько датчиков. Для наших часов достаточно одного. Подключаем провод от контакта «DQ» ds18b20 к «pin 5» Arduino UNO.

Подготовка платы с кнопками.
Для установки времени и даты на часах будем использовать три кнопки. Для удобства спаиваем три кнопки на монтажной плате и выводим провода.

Подключаем следующим образом: общий для всех трех кнопок провод подключаем к «GND» Arduino. Первую кнопку, она служит для входа в режим установки времени и переключения по времени и дате, подключаем к «Pin 2». Вторая, кнопка увеличения значения, – к «Pin 3», а третья, кнопка уменьшения значения, – к «Pin 4».

Сборка всего воедино.
Чтобы избежать короткого замыкания, следует заизолировать экран. По кругу обматываем изолентой, а на заднюю часть крепим на двусторонний скотч, вырезанную по размеру, планку из изолирующего материала. Подойдет плотный картон или тонкий пластик. Я воспользовался пластиком от планшета для бумаги. Получилось следующее:

Спереди экрана по краю клеим двусторонний скотч на вспененной основе, желательно черный.

Подключаем экран к Arduino:

Плюс от батарейного отсека подключаем к «VIN» Arduino, минус к «GND». Размещаем его сзади Arduino. Перед установкой в корпус, не забудьте подключить датчик температуры и плату с кнопками.

 Подготовка и заливка скетча.
Для датчика температуры нужна библиотека OneWire.

Скачать

Вывод на экран осуществляется через библиотеку U8glib:

Скачать

   Для редактирования и заливки скетча надо установите эти две библиотеки. Сделать это можно двумя способами. Просто распаковать эти архивы и поместить распакованные файлы в папку «libraries», находящуюся в папке с установленной Arduino IDE.

Или второй вариант установить библиотеки прямо в среде программирования. Не распаковывая скачанные архивы, в среде Arduino IDE выберите меню Скетч – Подключить библиотеку. В самом верху выпадающего списка выберите пункт «Добавить .Zip библиотеку».

В появившемся диалоговом окне выберете библиотеку, которую вы хотите добавить. Снова откройте меню Скетч – Подключить библиотеку. В самом низу выпадающего списка вы должны увидеть новую библиотеку. Теперь библиотеку можно использовать в программах.

Не забудьте после всего этого перезагрузить Arduino IDE. 

Датчик температуры работает по протоколу One Wire и имеет уникальный адрес для каждого устройства – 64-разрядный код. Каждый раз искать этот код нецелесообразно.

Поэтому необходимо вначале подключить датчик к Arduino, залить в нее скетч находящийся в меню Файл – Примеры – Dallas Temperature – OneWireSearch. Далее запускаем Инструменты – Монитор порта.

Arduino должна найти наш датчик, написать его адрес и текущие показания температуры. Копируем или просто записываем адрес нашего датчика. Открываем скетч Arduino_WG12864B_Term, ищем строку:

byte addr[8]={0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97};//адрес моего датчика

Записываем адрес вашего датчика между фигурными скобками, заменяя адрес моего датчика. 

Стока:

//u8g.setPrintPos( 44, 64); u8g.print(sek); // Выводим секунды для контроля правильности хода

 Служит для вывода секунд рядом с надписью «Data». Это необходимо для точной установки хода времени. 
Если часы спешат или отстаю следует поменять значение в строке:

if (micros() – prevmicros >494000) { // поменять на другое для корректировки было 500000

Я опытным путем определил число, при котором часы идут достаточно точно. Если ваши часы спешат следует увеличить это число, если отстаю – уменьшить. Для определения точности хода и нужен вывод секунд. После точной калибровки числа, секунды можно закомментировать и таким образом убрать с экрана.

Заливаем прошивку

Источник: http://radiostroi.ru/arduino/291-chasy-na-arduino-i-s-zhk-displeem-svoimi-rukami.html

OLED часы (термометр) на arduino и DS3231 – RobotChip

Автор: Сергей Мир · 17.02.2017

В этой статье расскажу как собрать домашние часы и термометр (все в одном) на платформе Arduino c отображением времени (часы, день, неделя, месяц и год) и температуры. Для отображения информации будем использовать OLED матрицу (о данной матрице говорил в предыдущей статье), а показания температуры и текущее время, считываем с часов реального времяни RCT DS3231.

OLED часы (термометр) на arduino и DS3231

Необходимые детали:
  Arduino UNO R3 x 1 шт.
  OLED-дисплей 0.96, 128х64 x 1 шт.
  Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
  Кабель USB 2.0 A-B x 1 шт.
  Часы реального времени на DS3231 x 1 шт.
  Макетная плата MB-102 (Breadboard) x 1 шт.

Подключение:
Для вывода времени и температуры на OLED дисплей с модуля RCT DS3231, будем использовать плату Arduino UNO.

Сразу оговорюсь, что данные о температуры обновляются примерно раз в минуты, так что не ждите быстрой реакции на изменении температуры. Теперь, собираем схему, которая показана ниже, для удобства дополнительно нарисовал таблицу подключения.

В примере, не показана настройка времени RTC RS3231, если в вашем случаи, это необходимо, можно посмотреть предыдущий статью.

Таблица подключение

В примере используется две дополнительных библиотеки DS3231 и OLED_I2C, необходимо скачать их и установить, без них скетч не заработает. Далее, запускаем среду разработки IDE и копируем скетч (для удобства, добавлю файл для скачивания), если все правильно сделали, на OLED дисплее отобразится время.

  Тестирование производилось на Arduino IDE 1.8.0  Дата тестирования 17.02.2017г.#include                                   // Подключение библиотеки OLED_I2C#include                                     // Подключение библиотеки DS3231OLED  myOLED(SDA, SCL, 8);                            extern uint8_t MegaNumbers[];                          // Подключение больших шрифтовextern uint8_t SmallFont[];                            // Подключение маленьких шрифтовint x = 0;                                             // Создаем переменную “х”  myOLED.begin();                                      // Инициализация Oled дисплея  rtc.begin();                                         // Инициализация RS3231  if (x >= 10) {temp();                                // Если “x”, больше или равно 10, выполняем цикл “temp”  else {clock();}                                      // Если “x”, меньше 10, выполняем цикл “clock”      x++;                                             // Увеличить “x” на 1void clock()                                           // Цикл считывания и отображения времени  myOLED.clrScr();                                     // Очищаем экран  myOLED.setFont(SmallFont);                           // Включаем маленький шрифт  myOLED.print(rtc.getDOWStr(), CENTER, 0);            // Отображение дня недели  String stringOne = rtc.getTimeStr();  myOLED.setFont(MegaNumbers);                         // Включаем большой шрифт  myOLED.print(stringOne.substring(0,2), 4, 12);       // Отображение часов  myOLED.print(“/”, 51, 12);                           // Отображение двоеточие  myOLED.print(stringOne.substring(3,5), 75, 12);      // Отображение минут  myOLED.setFont(SmallFont);                           // Включаем маленький шрифт  myOLED.print(rtc.getDateStr(), CENTER, 57);          // Отображение даты  myOLED.update();                                     // Обновляем информацию на дисплее  myOLED.setFont(MegaNumbers);                         // Включаем большой шрифт  myOLED.print(“-“, 51, 12);                           // Убираем двоеточие  myOLED.update();                                     // Обновляем информацию на дисплееvoid temp()                                            // Цикл считывания и отображения температуры  myOLED.clrScr();                                     // Очищаем экран  myOLED.setFont(MegaNumbers);                         // Включаем большой шрифт  myOLED.print(String(rtc.getTemp() , 1), CENTER, 12);  myOLED.setFont(SmallFont);                           // Включаем маленький шрифт  myOLED.print(“Temperature”, CENTER, 57);             // Отображение надписи  myOLED.update();                                     // Обновляем информацию на дисплее

  Скачать скетч

Описание программы:
Немного расскажу о самом скетче, он разделен на два цикла «clock» и «temp», выбор цикла осуществляется с помощью переменной «x».

При первом запуске, в переменной «x» находится число «0» с помощью оператора «if» выполняется ее сравнение, если значение меньше «10», выполняется цикл времени «clock», как только «x» становить больше «10», выполняется цел «temp».

Как только прошел цикл «temp» в переменную «x» записываем «0» заново повторяется.

  if (x >= 10) {temp(); // Если “x”, больше или равно 10, выполняем цикл “temp”  else {clock();}       // Если “x”, меньше 10, выполняем цикл “clock”      x++;              // Увеличить “x” на 1

Просто говорят, контроллер выполняет цикл «clock» десять раз, а цикл «temp» один. Для каждой команды, добавлено описание и дополнительно объяснять не вижу смысла, будет время опишу добавление русского языка.

Ссылки
  Библиотека libraries-DS3231
  Библиотека libraries-OLED_I2C

Купить на Aliexpress
  Контроллер Arduino UNO R3
  Провода DuPont, 2,54 мм, 20 см
  Часы реального времени RTC DS3231
  OLED-дисплей 0.96,128х64, белый, DC 3.3-5B, SPI, IIC

Купить в Самаре и области
  Купить контроллер Arduino UNO R3 в г. Самаре
  Купить провода DuPont, 2,54 мм, 20 см в г. Самаре
  Купить часы реального времени RTC DS3231 в г. Самаре
  Купить часы реального времени OLED-дисплей 0.96 в г. Самаре

Источник: http://blog.rchip.ru/oled-chasy-termometr-na-arduino-i-ds3231/

Часы на ардуино | Что и как строить на земельном участке

Итак, после небольшого технического перерыва, продолжаем наше знакомство с семейством МК ARDUINO.

В этом уроке мы попробуем сделать часы работающие от внутреннего генератора МК (с внешним генератором будет один из следующих уроков) и выводящего информацию на ЖК индикатор типа 1602 (что означает 16 символов в 2 строки, есть еще тип 1604- 16 символов в 4 строки, вы уже поняли что первые 2 цифры указывают на количество символов индикатора а вторые- на количество строк). Не будем затягивать вступление, переходим к работе.

Для проекта нам понадобится:

  1. Arduino Uno
  2. ЖК индикатор 1602
  3. Макетная плата
  4. Провода
  5. Подстроечный резистор на 10 кОм

Для особо ленивых советую опустится в низ страницы и скачать готовый скетч, для тех кто хочет научится делать скетчи самостоятельно опишу более подробно все шаги проекта.

Для правильной и быстрой работы над проектом необходим алгоритм работы. Практически любой проект лучше накидать на бумаге и потом следовать по алгоритму шаг за шагом. Мы поступим абсолютно так же. Итак составляем алгоритм.

У нас есть несколько условий, выпишем их в порядке возрастания:

  1. Секунды, работают в пределе от 0 до 59 по циклу с секундным интервалом (это понятно).
  2. Минуты, работают в пределе от 0 до 59 по циклу, переключение происходит при достижении значения секундами значения 0.
  3. Часы, работают в пределе от 0 до 24 (здесь вы можете выбрать отображение как в зарубежном стиле от 0 до 12 со значениями AM и PM, это как вам больше нравится) по циклу, переключение происходит по достижении значения минутами 0.
  4. Вывести всю необходимую информацию на дисплей (например вы можете решить не выводить секунды а сделать просто мигающую точку между часами и минутами)

Собираем наши часы по вот такой схеме:

Подключение ЖК индикатора 1602 к ARDUINO

Советы по сборке. Индикатор 1602 обычно приходит из Китая в «голом» виде, т.е.

никаких выводов не подпаяно, советую для этих целей использовать двухрядные компьютерные гнезда от материнских плат, один вывод гнезда вставляется в 1602, второй вывод оказывается за краем платы, запаиваете оба вывода на один контакт- так повышается механическая и электрическая прочность. На данной схеме не указана схема подключения подсветки, это следующие 2 вывода справа от D7. Вы можете их подключить к питанию 3,3В на ARDUINO, можете сделать плавное загорание/затухание если подключите плюсовой вывод (он подписан как А- анод) к ШИМ выходу ARDUINO и будете управлять питание через этот вывод, это уже второстепенная задача, пока просто подключите вывод А на 1602 к 3,3V на ARDUINO, а вывод К 1602 к GND ARDUINO.

Теперь приступаем собственно к разработке часов. Запускаем оболочку ARDUINO на компьютере. Попробуем поиграться с 1602 для проверки правильности соединений схемы. Заходим Файл-Примеры-LiqidCrystal и выбираем любой из файлов.

Заливаем скетч в ARDUINO и наблюдаем что происходит. Если вместо символов вы видите черные квадратики- подкрутите подстроечный резистор, это регулятор контрастности (так же поступите если вообще ничего не отображается).

Информация должна отображаться корректно и никаких «кракозябров» быть просто не должно. Если они появились- проверьте схему соединений, где то собрали неправильно.

Можете сразу посмотреть в скетчах как обращаться к ЖК- индикатору и поразится простоте работы с ним! Если все у вас заработало правильно переходим непосредственно к программированию.

Определимся что таймер у нас будет работать без оператора delay как написано здесь. Поэтому вводим такой код:

int h,m,s; // переменные для часов, минут, секунд
boolean z;  // переменная для отображения точки // подключаем библиотеку индикатора

#include<\p>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Variables will change :
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
lcd.begin(16, 2);

}

void loop()
{

  unsigned long currentMillis = millis();

if(currentMillis — previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis;

s++;    // добавляем единицу, равносильно записи s=s+1;

}

}

Данный код уже будет работать но ничего отображать не будет. К переменной s каждую секунду будет добавляться 1. Т.е. мы уже получили точный интервал в 1 секунду! Теперь, следуя алгоритму, нам необходим предел переменной между 0 и 59. Делаем.

if (s>59)   // если значение s больше 59 { s=0;       // присваиваем значение 0 переменной s m++;     // добавляем 1 к переменной m отвечающей за минуты

}

Добавляем этот код к программе. По описанию все понятно- если значение s больше 59 то присваиваем ей 0 и прибавляем 1 минуту в переменной m. На данный момент имеем полностью работающий секундный таймер и бесконечный (до 32768- максимальное значение переменной типа integer) счетчик минут. Теперь нужно таким же образом рассчитать минуты. Пишем следующее:

if (m>59)   // если значения m больше 59 { m=0;       // присваиваем значение 0 переменной m h++;     // добавляем 1 к переменной h отвечающей за часы

}

Добавляем строки к программе. Она уже должна выглядеть так:

int h,m,s; // переменные для часов, минут, секунд
boolean z;  // переменная для отображения точки // подключаем библиотеку индикатора

#include<\p>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Variables will change :
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
lcd.begin(16, 2);

}

void loop()
{

  unsigned long currentMillis = millis();

if(currentMillis — previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis;

s++;    // добавляем единицу, равносильно записи s=s+1;

// секция подсчета секунд

if (s>59)   // если значение s больше 59 { s=0;       // присваиваем значение 0 переменной s m++;     // добавляем 1 к переменной m отвечающей за минуты

}

// секция подсчета минут

if (m>59)   // если значение m больше 59 { m=0;       // присваиваем значение 0 переменной m h++;     // добавляем 1 к переменной h отвечающей за часы

}

}

}

В принципе все понятно. Осталось сделать обработку часов. Делаем. Дописываем после секции подсчета минут:

if (h>23)   // если значение h больше 23 { h=0;       // присваиваем значение 0 переменной h

}

Все, часы готовы! Заливаем скетч и часы будут ходить как надо! Хочу обратить ваше внимание что считать они будут в 24- часовом формате. Попробуйте сами сделать 12- часовой формат. Осталось вывести информацию на ЖК- индикатор. Существует 2 пути по написания кода на вывод информации.

  1. Посчитать одни данные и сразу вывести
  2. Посчитать все данные и вывести все сразу.

Тут уж вы сами определитесь по какому пути вы пойдете. Если пойдете по первому пути то писать отображение информации надо сразу в секциях подсчета, если по второму- пишется блок после всех вычислений.

Давайте пойдем по второму пути т.к. он более предпочтителен и более логичен (хотя, если честно сказать, мой тестовый скетч написан по первому пути).

Итак, для передачи данных на индикатор 1602 применяются всего 2 команды:

lcd.setCursor(3, 0);  // устанавливает курсор на 3 символ 0 строки (счет строк и символов идет от 0)
lcd.print(0);  // печатаем (print- печать, учите аглицкий) 0

Есть еще команда lcd.clear; означающая очистку экрана но здесь мы ее можем не использовать.

Начинаем выводить информацию. Начнем с секунд (можете начать с любого значения, делайте как вам будет удобно). Устанавливаем курсор на 0 строку в 6 позицию и выводим значение секунд.

Почему в 6 позицию спросите вы? Давайте представим следующее: формат отображения часов- 2 символа(часы), разделитель (допустим :), 2 символа (минуты), разделитель (:) и, наконец, секунды. Считаем с нулевой позиции: 0+2+1+2+1=6. Так как счет начинается с 0 то вычитаем из данных единицу (ноль тоже является числом), выходит 6-1=5.

Столько занимает отображение часов и минут с разделителями, следующая позиция- секундная и она равна 5+1=6. Немного запутано но напишу следующее hh:mm:ss и посчитаем координаты сначала начиная от 0. Вот так и высчитываются координаты на индикаторах семейства 16хх.

 При данных условиях часы будут отображаться в верхнем левом углу, вы можете сменить расположение как вам удобно, можете даже ввести переменную и подбирая её подбирать нужное вам положение индикации. Ладно, пишем такие строки:

lcd.setCursor(6, 0);  // устанавливает курсор на 6 символ 0 строки (счет строк идет от 0)
lcd.print(s);  // печатаем данные из переменной s

Программа будет выглядеть так:

int h,m,s; // переменные для часов, минут, секунд
boolean z;  // переменная для отображения точки // подключаем библиотеку индикатора

#include<\p>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Variables will change :
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
lcd.begin(16, 2);

}

void loop()
{

  unsigned long currentMillis = millis();

if(currentMillis — previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis;

s++;    // добавляем единицу, равносильно записи s=s+1;

// секция подсчета секунд

if (s>59)   // если значение s больше 59 { s=0;       // присваиваем значение 0 переменной s m++;     // добавляем 1 к переменной m отвечающей за минуты

}

// секция подсчета минут

if (m>59)   // если значение m больше 59 { m=0;       // присваиваем значение 0 переменной m h++;     // добавляем 1 к переменной h отвечающей за часы

}

// секция подсчета часов

if (h>23)   // если значение h больше 23 { h=0;       // присваиваем значение 0 переменной h

}

// секция вывода информации

lcd.setCursor(6, 0);  // устанавливает курсор на 7 символ 0 строки (счет строк идет от 0)
lcd.print(s);  // печатаем данные из переменной s

}

}

Заливаем скетч и…. секунды начали отображаться!!! Только обратите внимание, при счете от 0 до 59- все нормально, но как только начинается следующая минута- начинают меняться десятки секунд вместо единиц секунд, т.е. время отображается некорректно. Давайте разберемся с этим.

Мы указали программе жестко позицию 6,0, и она выводит данные точно в этой позиции не затирая то что находится после этой позиции. Выхода 2. Применить lcd.

clear или описать отображение корректно, тем более при первом варианте будет довольно трудно привыкнуть к прыгающим разрядам секунд (далее минут и часов). Напишем обработчик корректного отображения. Какие условия будут в этой обработке? Давайте подумаем.

Если секунд меньше 10 то пишем их значение в 7 позиции (6+1=7) и в 6 позиции пишем 0, если больше или равно 10- пишем в 6 позиции. Все довольно просто. Условие будет иметь следующий вид:

if (s59)   // если значение m больше 59 { m=0;       // присваиваем значение 0 переменной m h++;     // добавляем 1 к переменной h отвечающей за часы

}

// секция подсчета часов

if (h>23)   // если значение h больше 23 { h=0;       // присваиваем значение 0 переменной h

}

// секция вывода информации

// вывод секунд

if (s

Источник: http://samosdel.ru/arduino/urok-6-chasy-na-arduino-osnovnaya-chast/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}