В прошлой части Еще одни часы на Ардуине. Часть 1. Запускаем часы мы запустили модуль часов DS1307 и научились выводить время в Serial. Но пользоваться такими часами, конечно невозможно. Открывать Serial монитор для что-бы узнать "который час" :)
Так что, сегодня, мы
Гнезда:
Видим на экрнае такое:
Так что, сегодня, мы
Подключаем экран:
Мне повезло. В случае Arduino Mega подключение экрана сводится к простому "нахлобучиванию" его на плату (главное, при первом втыкании не торопится и не погнуть пины). У Меги SDA/SLC не закрываются шилдом. А 5V и GND дополнительно выведено возле D23 и D25. Так что LCD шилд ничуть не мешает подключению RTC шилда.
В случае же UNO - придется чуть-чуть взять в руки паяльник.
Вам потребуется:
Гнезда:
- PBS-5 - для выведения вверх SDA/SLC
- PBS-6 - для выведения земли и питания
- PBS-7 - что-бы вывести цифровые пины (пока мы их не используем, но что-бы два раза не вставать).
Впаиваем их сюда:
Там специально, производителем, именно для этих целей, оставлены дырочки-площадки.
В результате мы получим что-то такое:
[тут-будет-картинка]
Тут для примера впаяна PBD-5 и в которую воткнут проводок.
Заливаем в дуину такой скетч проверки экрана:
#include "LiquidCrystal.h" // библиотека экрана // select the pins used on the LCD panel LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup(){ lcd.begin(16, 2); // запускаем библиотеку lcd.setCursor(0,0); // курсов в левый верхний угол экрана lcd.print("Hello from LCD!!"); } void loop(){}
Видим на экрнае такое:
[тут-будет-картинка]
И радуемся правильно подключенному экрану. Если необходимо, плохо видно буквы или, наоборот сквозь буквы проступают "квадратики" фоновые, берем тонкую плоскую отвертку (или кончиком ножа) и крутим регулятор контрастности (винтик в верхнем левом углу шилда).
Добавляем вызов этой функции в loop(), заливаем в дуину и... мы сделали свои, пусть и неказистые, но первые электронные часы!!! :) На экране видно текущие время и "меняющие секунды".
И радуемся правильно подключенному экрану. Если необходимо, плохо видно буквы или, наоборот сквозь буквы проступают "квадратики" фоновые, берем тонкую плоскую отвертку (или кончиком ножа) и крутим регулятор контрастности (винтик в верхнем левом углу шилда).
Который час?
Теперь у нас все готово к выводу времени на экран. Подключаем RTC модуль (если мы его отключали), берем финальный скетч из первой части и добавляем в него инициализацию экрана. Строки 1,4,7 из "скетч проверки экрана" прошлого раздела (выделенные строки).
После чего у нас все готово, что-бы написать функцию вывода времени на экран.
Делаем все практически аналогично тому как в прошлой части выводили в Serial. Только функцию называем printTimeToLCD()
После чего у нас все готово, что-бы написать функцию вывода времени на экран.
Делаем все практически аналогично тому как в прошлой части выводили в Serial. Только функцию называем printTimeToLCD()
void printTimeToLCD(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись lcd.setCursor(0,0); // устанавливаем позицию курсора lcd.print(RTC.hour); // часы lcd.print(":"); // разделитель lcd.print(RTC.minute); lcd.print(":"); lcd.print(RTC.second); prevSecond=RTC.second; // запомнили когда мы "отчитались" } }
Добавляем вызов этой функции в loop(), заливаем в дуину и... мы сделали свои, пусть и неказистые, но первые электронные часы!!! :) На экране видно текущие время и "меняющие секунды".
А причесать?
Попробуем добавить чуть-чуть "эстетичности". Что мне не нравится в текущем варианте
- Хочется выводить время "по центру", а не в углу
- Убрать секунды. Мне они не нужны. Пусть лучше мигает двоеточие между часами и минутами (что-бы было видно что "секунды идут").
- Привести время к более привычному формату "16:03", а не как сейчас "16:3"
- Если присмотрется в момент смены секунд видно легкое "помаргивание" надписи, она как-бы "пригасает".
Первый пункт - самый простой. Что-бы подвинуть время, нам достаточно сделать
lcd.setCursor(5,0).
Секунды - просто выкидываем :) А разделитель между часами и минутой показываем либо пробелом либо двоеточием. В зависимости от того четная или не четная у нас секунда
lcd.print( (RTC.second %2 )?" ":":");
Что осталось? Дописать "0" перед минутами если они меньше 10-ти
if(RTC.minute<10)lcd.print(0);
Аналогично для часов. Только добавлять впереди будем пробел, а не "0". Ноль, вперди часов - выглядит некрасиво, а "что-то дописать" - нужно. Что-бы позиция времени не смещалась влево на малых значениях часа.
Наша функция вывода времени приняла вид:
lcd.setCursor(5,0).
Секунды - просто выкидываем :) А разделитель между часами и минутой показываем либо пробелом либо двоеточием. В зависимости от того четная или не четная у нас секунда
lcd.print( (RTC.second %2 )?" ":":");
Что осталось? Дописать "0" перед минутами если они меньше 10-ти
if(RTC.minute<10)lcd.print(0);
Аналогично для часов. Только добавлять впереди будем пробел, а не "0". Ноль, вперди часов - выглядит некрасиво, а "что-то дописать" - нужно. Что-бы позиция времени не смещалась влево на малых значениях часа.
Наша функция вывода времени приняла вид:
void printTimeToLCD(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись lcd.setCursor(5,0); // устанавливаем позицию курсора if(RTC.hour<10)lcd.print(" "); lcd.print(RTC.hour); // часы lcd.print( (RTC.second % 2)?" ":":"); // разделитель моргает if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен lcd.print(RTC.minute); prevSecond=RTC.second; // запомнили когда мы "отчитались" } }
В принципе, 4-тый пункт, "помаргивание" - уже не виден на глаз. Так что усложнять код, для борьбы с ним - мы пока не будем.
Сегодняшний наш финальный скетч таков:
В следующей части мы будем учится работать с кнопками шилда. С учетом дребезга, настройкой чувствительности, отличать "короткое" и "длинное" нажатие и т.п.
Сегодняшний наш финальный скетч таков:
// Author: alxarduino@gmail.com // Sample Clock App for http://alxarduino.blogspot.com // Библиотеки необходимые для работы модуля часов #include "Wire.h" #include "DS1307new.h" // библиотека экрана #include "LiquidCrystal.h" LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup(){ Serial.begin(9600); if(RTC.isPresent()){ // обнаружен ли модуль? Serial.println("RTC Ready"); // все хорошо } else { Serial.println("Error!!!! RTC Module not found"); // сообщаем о проблеме while(1); // и останавливаем скетч } lcd.begin(16, 2); // запускаем библиотеку экрана } void loop(){ RTC.getTime();// получить время от модуля printTimeToSerial(); // выводим полученное время в лог printTimeToLCD();; // выводи время на экран doSerialCommands(); // слушаем и выполняем команды из Serial } // Выводит текущие время в Serial void printTimeToSerial(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись Serial.print(RTC.hour); // часы Serial.print(":"); // разделитель Serial.print(RTC.minute); Serial.print(":"); Serial.println(RTC.second); prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // Выводит текущие время на LCD void printTimeToLCD(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись lcd.setCursor(5,0); // устанавливаем позицию курсора if(RTC.hour<10)lcd.print(" "); lcd.print(RTC.hour); // часы lcd.print( (RTC.second % 2)?" ":":"); // разделитель моргает if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен lcd.print(RTC.minute); prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // устанавливает часы модуля на какое-то заранее определенное время void setSomeTime(){ RTC.stopClock();// останавливаем часы RTC.fillByHMS(19,15,0); // "подкручиваем стрелки на 19:15:00 RTC.setTime();// отправляем "подкрученное время" самому модулю RTC.startClock(); // и опять запускаем часы } // слушает из Serial команды и выполняет их. Каждая команда - один символ. // доступны команды: // s - установить время указанное в функции setSomeTime() void doSerialCommands(){ if(Serial.available()){ // что-нибудь пришло? char ch=Serial.read(); // читаем что пришло switch(ch){ case 's': // команда установки времени setSomeTime(); // устанавливаем break; // тут, в будущем, мы можем добавлять дополнительные команды default:; // на неизвестную команду - ничего не делаем }; } }
На LCD Это выглядит примерно так:
В В реальности, конечно все симпатичней, использовать фотоаппарат я умею только "в автоматическом режиме".В следующей части мы будем учится работать с кнопками шилда. С учетом дребезга, настройкой чувствительности, отличать "короткое" и "длинное" нажатие и т.п.
Комментариев нет:
Отправить комментарий