Часы DS1302 для Arduino Uno с ЖК экраном BTHQ 22005VSS |
Началось все с того, что волею случая я оказался владельцем текстового ЖК экрана BTHQ 22005VSS (2 строки по 20 знаков в каждой) и платы электронных часов DS1302. По правде говоря, в «Ардуиностроении» я делаю первые шаги, по этому, в приобретении данных деталей решающую роль сыграла демократичная цена и возможность быстрой доставки. Ведь, зачастую ждать, когда «девайс» прибудет из Поднебесной, обогнув почти «пол мира» некогда, да и просто не хочется.
Почему именно часы? В то время, когда вокруг продается масса разнообразных часов, цена самых простых из которых сравнима с пакетом сока. А дело все в том, что зачастую необходимо не просто знать точное время (и дату, что тоже иногда нужно) но еще и оперировать этим временем. Например – вести логи изменения температуры (влажности, давления, освещенности и т.п.) с указанием точного времени, когда эти изменения произошли. Вот тут-то ARDUINO оснащенный часами и окажет замечательную услугу. Да и кроме того, приятно, когда прибор ко всему прочему показывает еще и время. Ведь, даже работая на персональном компьютере мы изредка, да поглядываем в правый нижний угол, а вдруг уже пора на обед, или наступил конец рабочего дня, а может быть уже скоро рассвет?
Сердцем данного проекта послужил ARDUINO UNO, приобрести который довольно просто здесь - это, конечно, если хочется купить что-то качественное и быстро. Можно, конечно найти и дешевле, но опять-же ждать, а ждать не хотелось. «Ардуинка» бодро моргала светодиодиком, выполняла все, что от неё требовалось давая простенькие сообщения через последовательный порт, в общем радовала. Но вернемся к часам. Проблемы начались, как всегда, неожиданно. Толковых статей и всего остального ни на экранчик, ни на часы «слёту» найти не удалось. На другие экраны – есть, на другие часы – сколько угодно, а вот на то, что в руках – почти ничего. Но, когда нет ничего – «почти» это тоже очень много.
Начнем с экрана. BTHQ 22005VSS оказался банальным ЖК экраном 20х2 (т.е. имеет 2 строки по 20 символов в каждой) вместо него вполне можно использовать, например экран - правда в нем «всего» 16 символов в каждой из строк, но для большинства проектов этого более, чем достаточно. Данный экран имеет 16-пиновый разъем, правда не однорядный, а двухрядный (2х8), если держать устройство экраном от себя, а разъемом справа, то первый пин будет нижним левым, второй нижним правым, третий над первым, четвертый над вторым, и т.д. Верхний левый (15) будет анод, верхний правый (16) – катод. Если есть знания английского и любознательность – можно почитать техническое описание. Если первого крайне мало, а любознательность гораздо слабее желания поэкспериментировать – вот, как подключал я:
Контакт экрана |
Контакт Ардуино |
Примечание |
1 |
GND |
Это «минус», или «земля». |
2 |
+5V |
|
3 |
GND |
Если нужны яркие знаки. |
4 |
4 |
|
5 |
GND |
Если только «писать». |
6 |
5 |
|
7 |
-- |
Не использовал |
8 |
-- |
Не использовал |
9 |
-- |
Не использовал |
10 |
-- |
Не использовал |
11 |
10 |
|
12 |
11 |
|
13 |
12 |
|
14 |
13 |
|
А(15) |
+5V |
Я подключил через резистор 500 Ом |
К(16) |
GND |
|
В некоторых источниках «распиновка» со стороны Ардуино отличается, но ведь мне было удобнее так. Подключение часов также не вызвало проблем:
Часы DS1302 |
Ардуино |
Примечание |
VCC |
+5V |
|
GND |
GND |
Тут я подключал через резистор 10кОм. |
CLK |
0 |
Не путать с GND!!! Контакт также называется SCLK |
DAT |
1 |
Контакт также называется IO |
RST |
3 |
Контакт также называется СЕ |
Подключать можно проводками, шлейфом, лично я собрал на макетной плате.
Проблемы начались, когда был загружен демоскетч и часы заработали. Правда показали они 2165 год, 45 месяц, 85 неделю... Наверное это по «уранскому» или «нептунскому» календарю… Но жить мне на Земле, а на Уран с Нептуном я пока не собираюсь. В общем надо что-то делать. Пайка в цепь GND->GND резистора 10кОм не помогла. Проблема оказалась в некорректной библиотеке. Сразу скажу, что корректную библиотеку можно взять здесь. Это для часов. Экранчик успешно пользуется библиотекой из стандартного набора, которая зовется LiquidCrystal.h .
Проблема №2. Часы при каждом запуске начинают отсчет с того времени, которое «прошито» в программе. Есть сложное решение этой проблемы. Создать хеш, записать его в память часов, потом, при запуске считать его оттуда, сравнить… В общем для новичка в «Ардуиностроении» как то сложновато. Как оказалось есть и простое решение. точнее очень простое. А именно – прошить 2 раза. Первый раз – прошить с установкой даты и времени, второй раз прошить, предварительно «закомментировав» (поставив знак // в самом начале строки) строки с установкой этой самой даты.
Собственно говоря скетч:
Код:
|
// DS1302_LCD (C)2010 Henning Karlsen // web: http://www.henningkarlsen.com/electronics // // A quick demo of how to use my DS1302-library to make a quick // clock using a DS1302 and a 20x2 LCD. // // Соответствие пинов часов и экрана пинпм Ардуино. // DS1302: CE pin -> Arduino Digital 3 // I/O pin -> Arduino Digital 1 // SCLK pin -> Arduino Digital 0 // LCD: DB7 -> Arduino Digital 13 // DB6 -> Arduino Digital 12 // DB5 -> Arduino Digital 11 // DB4 -> Arduino Digital 10 // E -> Arduino Digital 5 // RS -> Arduino Digital 4
#include <liquidcrystal.h> // Подключение библиотеки экрана. #include <ds1302.h> // Подключение библиотеки часов.
// Инициализация пинов часов DS1302 rtc(3, 1, 0); // Инициализация пинов экрана LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
void setup() { // Запуск часов rtc.halt(false); rtc.writeProtect(false);
// Запуск экрана с указанием количества символов и строк lcd.begin(20, 2);
// Три нижние строчки в первый раз раскомментированы, в них указываем текущую дату и время. Второй раз - закомментруем. //rtc.setDOW(THURSDAY); // День недели, если пятница, то FRIDAY на русском не писать! //rtc.setTime(11, 41, 0); // Часы, минуты, секунды 24-часовой формат. //rtc.setDate(13, 6, 2013); // Дата. ЦИФРАМИ!!! Ноль перед одиночной цифрой можно не ставить! }
void loop() { // Display time centered on the upper line lcd.setCursor(6, 0); // Устанавливаем курсор для печати времени в верхней строчке lcd.print(rtc.getTimeStr()); // Печатаем время
// Display abbreviated Day-of-Week in the lower left corner lcd.setCursor(0, 1); // Устанавливаем курсор слева внизу для печати дня недели lcd.print(rtc.getDOWStr(FORMAT_LONG)); // Печатаем день недели полностью, благо экран позволяет.
// Display date in the lower right corner lcd.setCursor(9, 1); // Устанавливаем курсор для печати даты lcd.print(rtc.getDateStr()); // Печатаем дату
// Wait one second before repeating delay (1000); // Пауза 1 секунда и все по новой! }
|
Возникают вопросы:
1. - А что будет, если отключить питание?
- Ничего. Часы погаснут. Когда питание включится они покажут нужное время.
2. – А что будет, если отключить питание на сутки, или неделю?
- Если нормальная батарейка – запустятся и через неделю и покажут корректное время.
3. – А если разобрать Ардуинку?
- Если поблочно – т.е. отключить экран и часы, а потом аккуратно собрать, то все запустится и будет нормально работать.
4. - А если использовать Ардуинку в другом проекте, что тогда?
- Тогда при сборке часов придется прошивать, скорее всего, будет достаточно только 2-го варианта.
5. – А если вынуть одни часы и поставить такие-же, но другие?
- Отобразится время, «прошитое» в «других» часах.
6. – А что еще было применено в данном проекте?
- Двухсторонняя макетная плата, резистор и несколько разъемов. Также блок питания 6В, 1А. Всё это на сумму примерно 5$. Обзор подготовил Павел Сергеев
C этой схемой также часто просматривают: |
ЗАЖИГАЛКА ДЛЯ ГАЗА Зарядное устройство для автомобильных и мотоциклетных батарей Зарядное устройство для автомобильных аккумуляторов Имитатор для проверки телефонных аппаратов Простые датчики для охранной сигнализации Arduino UNO урок 14 - цифровой компас HMC5883L Arduino UNO урок 13 - драйвер двигателя L298N Arduino UNO урок 12 - Подключение джойстика Arduino UNO урок 11 - Serial LCD
| |
Графический семиполосный эквалайзер-радуга на Arduino Nano и MSGEQ7 Часы реального времени для Arduino Старинные часы-метеостанция Блок питания для Arduino из ATX ATX блок питания управляемый Arduino Arduino своими руками с USB портом Подключение монетоприемника к Arduino Подключение PS/2 клавиатуры к Arduino Пробуждение ПК по сети на Arduino Запись/чтение на SD-карту с Arduino |