Часы метеостанция на Arduino
Добрый день, я продолжаю заниматься Arduino в свободное время, и на этот раз написал инструкцию по изготовления небольшой метеостанции. Она будет выполнять функцию часов с датой и показывать температуры внутри и снаружи помещения.
Как основной контролер будем использовать Arduino UNO, но подойдет и другая плата с Atmega328p на борту. Для отображения используем графический экран WG12864B. Также подключим два датчика температуры ds18b20. Один внутри помещения, второй вынесем наружу. Начнем.
В процессе изготовления самоделки нам понадобится:
– Arduino UNO (Или любая другая Arduino совместимая плата)- WG12864B графический экран- ds18b20 датчик температуры, 2шт- Блок питания 6 – 12 В- Резисторы 4.7 Ком 0.25 Вт, 2 шт.- Резисторы 100 ом 0.25 Вт- Батарейный отсек для 4 батареек типа ААА «мизинчиковых»- Коробка от картриджа приставки SEGA- Изолента- Соединительные провода- Монтажная плата- Кнопки- Канцелярский нож- Паяльник- Припой, канифоль- Двусторонний скотч
Шаг 1 Подготовка WG12864B3.
Тех, кто не работал до этого с экранами, может напугать большое количество модификаций, с виду одинаковых, экранов. Немного поясню. Большинство экранов такого типа работают на микросхемах 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, но если экран пришел другой, или просто под руками такого нет, вы легко разберётесь с помощью таблицы:Вкратце характеристики:В интернете много разных схем подключения, и все вроде как рабочие. Все дело в том, что существуют не только разные экраны, но и два способа их подключения: последовательный и параллельный. При использовании подключения по последовательному порту – нам понадобится всего 3 выхода микроконтроллера. При параллельном минимум 13. Выбор в данном случаем очевиден, у Arduino и так не много выводов. Для параллельного соединения схема подключения следующая:Для последовательного подключения, которое будем использовать мы, схема следующая:WG12864B – Arduino UNO 1 (GND) – GND 2 (VCC) – +5V 4 (RS) – 10 5 (R/W) – 11 6 (E) – 13 15 (PSB) – GND 19 (BLA) – через резистор 100 Ом – +5V 20 (BLK) – GNDДля регулировки контраста на экране должен стоять потенциометр. Бывают экраны и без него, но это сейчас редкость:Резистор в 100 Ом нужен, чтобы напряжением в 5 вольт, случайно не сжечь диоды подсветки.
Шаг 2 Изготовление корпуса.
Для корпуса возьмем коробку от картриджа приставки Sega. Если не найдете под руками эту коробку, можно использовать и другой корпус. Главное, чтобы в него поместился экран и Arduino.Срезаем прозрачную пленку, сверху коробки, так чтобы не оставалось кусков:Затем, используя канцелярский нож, вырезаем окошко размером 37х69, для экрана.
С обратной стороны по краю выреза клеим двусторонний скотч, желательно черного цвета:Снимаем защитную бумажку со скотча, и приклеиваем на него наш экран:С внешней стороны должно выглядеть так:Ниже экран, также на двусторонний скотч, крепим Arduino, сделав предварительно вырезы под USB- порт и гнездо питания:Вырезы под гнезда Arduino надо делать с двух сторон коробки, так чтобы она могла свободно закрываться:
Шаг 3 Датчики температуры.
Мы будем использовать цифровые датчики температуры DS18B20. Используя их мы получаем большую точность измерения, погрешность не более 0,5 °C, в большом диапазоне температур -55 … + 125 °C. Кроме этого, датчик цифровой и все вычисления выполняет сам, а Arduino просто получает готовые показания.
При подключении этого датчика не забывайте о подтягивающем резисторе, номиналом 4.7 КОм, между контактами DQ и VDD. Также возможно несколько вариантов подключения.
С внешним питание, на мой взгляд лучший вариант, его и будем использовать:Если хотите можете использовать режим паразитного питания:Или улучшенный вариант паразитного питания:При любом варианте питания, датчики подключаются параллельно:Датчик замера температуры внутри помещения разместим на маленькой плате вместе с двумя кнопками, которые мы будем использовать для установки времени и даты часов:Общий провод от обоих кнопок подключаем к GND, провод от первой кнопки подключаем к A0, от второй к A1.Крепим на двусторонний скотч рядом с Arduino:Датчик, который предполагается размещать снаружи помещения, лучше выбирать в металлическом, пылевлагозащитном корпусе:Рассчитайте провод необходимой длины, чтобы можно было вывесить датчик снаружи окна, главное, чтобы он был не больше метров 5, если нужна длина больше, надо будет уменьшать номинал подтягивающего резистора.
Провод от шины данных DQ обоих датчиков подключаем к pin 5 Arduino. Vdd – +5 Arduino.GND – GND Arduino.
Шаг 4 Питание.
Для питания можно использовать блок питания напряжением от 6 до 12 вольт. На конце провода блика питания следует напаять штекер, подходящий к гнезду питания Arduino:Или можете поместить в корпус батарейный отсек для четырех батареек типа «ААА», «мизинчиковые». И подключить плюсовой провод от отсека к Vin Arduino, а минус к GND.
Шаг 5 Подготовка среды программировании.
Для начала необходимо скачать и установить Arduino IDE с официального сайтаА также добавить в две библиотеки, необходимые для скетча. OneWire – необходима для связи с датчиками ds18b20:
onewire.rar [16.75 Kb] (скачиваний: 11)
U8glib – используется для вывода информации на экран:
u8glib.rar [906.95 Kb] (скачиваний: 19)
Скачиваем библиотеки. Затем распаковываем архивы, и перемещаем содержимое архивов в папку «libraries», находящуюся в папке с установленной Arduino IDE. Также можно добавить библиотеки через Arduino IDE.
Для этого, не распаковывая архивы, запускаем Arduino IDE, выбираем в меню Скетч – Подключить библиотеку. В самом верху выпадающего списка выбираем пункт «Добавить .Zip библиотеку». Указываем место нахождения скачанных архивов.
После всех действий, необходимо перезагрузить Arduino IDE.
Шаг 6 Редактирование скетча.
Датчики температуры работают по протоколу One Wire и имеют уникальный адрес для каждого устройства – 64-разрядный код. Добавлять команды поиска датчиков в скетч не целесообразно. Незачем нагружать Arduino каждый раз икать датчики. Поэтому вначале, собрав все вместе, заливаем в Arduino скетч, находящийся в меню Файл – Примеры – Dallas Temperature – OneWireSearch.
Затем запускаем Инструменты – Монитор порта. Arduino должна найти наши датчики, написать адреса и показания температуры. Эти адреса необходимо записать или просто скопировать куда-нибудь.
Теперь открываем скетч Ard_Tic_Tak_WG12864B_2_x_Term_Serial, и ищем строки:byte addr1[8]={0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63};//адрес внутреннего byte addr2[8]={0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97};//адрес внешнего датчикаЗаменяем адреса соответствующих местонахождению датчиков, на свои адреса.
У нас часы не используют модуль RTC (часы реального времени), поэтому необходимо откорректировать ход часов. Для удобства раскомментируйте строку (на экране появятся секунды)://u8g.setPrintPos( 44, 50); u8g.print(sek); // Выводим секунды для контроля правильности ходаУстановите правильное время, через монитор порта.
Для этого откройте монитор порта, дождитесь окончания первоначальных замеров температуры, и введите текущую дату и время в формате “день, месяц, год, часы, минуты, секунды”. Без пробелов, числа разделяем запятыми или точками.Если часы спешат, меняем значение на большее, рекомендую экспериментировать с шагом в 100 единиц.
Если отстаю следует уменьшить значение в строке:if (micros() – prevmicros >494000) { // поменять на другое для корректировки было 500000Опытным путем определяем число, при котором часы идут достаточно точно. Для определения точности хода и нужен вывод секунд. После точной калибровки числа, секунды можно закомментировать и таким образом убрать с экрана.Заливаем скетч.
ard_tic_tak_wg12864b_2_x_term_serial.rar [3.2 Kb] (скачиваний: 30)
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
Источник: https://USamodelkina.ru/12312-chasy-meteostancija-na-arduino.html
Как подключить часы реального времени к Arduino
Модуль часов реального времени
Часы реального времени — модуль, который хранит текущую дату и не сбрасывает её при отключении питания благодаря встроенной батарейке. Вы могли слышать о часах на основе чипа DS1307. Этот чип отличается крайне низкой точностью хода часов.
Отставание на один час в сутки — это слишком. Рекомендую использовать модуль на основе высокоточного чипа DS3231, который снабжён термометром для корректирования хода часов в зависимости от температуры.
Точность хода часов этого чипа находится на уровне хороших наручных часов и составляет 2ppm при температуре окружающей среды 0°-40°. При этом, модуль совместим со всеми библиотеками, написанными для модуля на основе чипа DS1307.
Статья рассказывает о подключении модуля к Arduino и взаимодействии с ними с помощью библиотеки Time. Купить такой модуль у проверенного мной продавца вы можете здесь.
Часы подключаются по протоколу I2C всего двумя проводами. Необходимо дополнительно подтянуть выводы, к которым подключаются часы к рельсе питания с помощью резисторов 2 КОм. Выводы часов выглядят так:
Выводы часов реального времени
Выводы 32К и SQW можно игнорировать. Их назначение не рассматривается в этой статье. SCL и SDA — это выводы интерфейса I2C. Их и нужно подключать к контроллеру. VCC и GND — +5 В и земля соответственно.
SCL и SDA на разных платах расположены на разных выводах:
Uno, Nano | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo | 2 (SDA), 3 (SCL) |
Вывод SDA часов подключается к выводу SDA контроллера. SDL часов, соответственно, к SDL контроллера. После подключения проводов, должна получиться такая картина:
Часы реального времени подключены к контроллеру
Работать с модулем часов реального времени удобней всего с помощью библиотеки. Наиболее удобная в этом плане, так и называется: Time (англ. время).
Библиотека является «обёрткой» для другой популярной библиотеки для работы с модулем часов: DS1307RTC. Несмотря на то, что библиотека разработана для чипа DS1307, она прекрасно работает и с DS3231, так как протоколы взаимодействия совместимы.
Скачайте обе библиотеки.
С официального сайта:
Time: http://www.pjrc.com/teensy/td_libs_Time.html
DS1307RTC: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
Или с моего: Time, DS1307RTC.
После скачивания, поместите содержимое архивов в папку libraries, которая находится в папке со средой разработки Arduino. Запустите среду Arduino IDE и откройте стандартный пример библиотеки: Примеры->Time->TimeRTC
Или просто скопируйте этот код:
while (!Serial) ; // wait until Arduino Serial Monitor opens setSyncProvider(RTC.get); // the function to get the time from the RTC if(timeStatus()!= timeSet) Serial.println(“Unable to sync with the RTC”); Serial.println(“RTC has set the system time”); if (timeStatus() == timeSet) { Serial.println(“The time has not been set. Please run the Time”); Serial.println(“TimeRTCSet example, or DS1307RTC SetTime example.”);void digitalClockDisplay(){ // digital clock display of the timevoid printDigits(int digits){ // utility function for digital clock display: prints preceding colon and leading 0 |
После загрузки скетча в плату запустите монитор порта (Сервис->монитор порта). Вы увидите сообщения от библиотеки. Отображаемое время будет неверным, либо библиотека вовсе пожалуется на не настроенные часы.
Для настройки часов загрузите в плату пример из библиотеки DS1307RTC «SetTime» (Примеры->DS1307RTC->SetTime). Загрузите этот пример в плату. После загрузки часы окажутся настроенными на время компиляции скетча.
Задержка между компиляцией и полной загрузкой составит совсем немного, чего окажется достаточно для точно настроенных часов.
Но если вы отключите и заново подключите питание платы, даже через несколько часов, время в часах всё равно будет заново установлено на время компиляции и окажется неверным. Поэтому, используйте этот пример только для настройки, после настройки отключите часы или загрузите в плату другой скетч.
Если вы не можете или не хотите использовать этот пример, загрузите в плату такой код:
setSyncProvider(RTC.get);//Устанавливаем время в формате://Часы, минуты, секунды, день, месяц, годsetTime(12,10,0,18,5,2016); |
Указанный пример установит часы на 12:10:00 18 мая 2016 года. Измените соответствующую строку для правильной установки времени.
Более подробно о работе с библиотекой можно узнать на сайте автора библиотеки.
Напоминаю, модуль часов реального времени у проверенного продавца вы можете заказать здесь. Полный список товаров, которые я заказал и протестировал здесь.
Источник: https://uscr.ru/kak-podklyuchit-chasy-realnogo-vremeni-k-arduino/
Как использовать RTC (часы реального времени) с Arduino и LCD
В данной статье мы рассмотрим, как сделать точные часы на базе Arduino или AVR-микроконтроллера микросхемы часов реального времени DS1307. Время будет выводиться на LCD дисплей.
Что необходимо
Вы можете заменить плату Arduino на контроллер Atmel, но убедитесь, что у него достаточно входных и выходных выводов и есть аппаратная реализация интерфейса I2C. Я использую ATMega168A-PU. Если вы будете использовать отдельный микроконтроллер, то вам понадобится программатор, например, AVR MKII ISP.
Предполагается, что читатель знаком с макетированием, программированием в Arduino IDE и имеет некоторые знания языка программирования C. Обе программы, приведенные ниже, не нуждаются в дополнительном разъяснении.
Введение
Как микроконтроллеры отслеживают время и дату? Обычный микроконтроллер обладает функцией таймера, который стартует от нуля при подаче напряжения питания, а затем начинает считать.
В мире Arduino мы можем использовать функцию millis(), чтобы узнать, сколько прошло миллисекунд с того времени, когда было подано напряжение питания. Когда вы снимете и снова подадите питания, она начнет отсчет с самого начала.
Это не очень удобно, когда дело доходит до работы с часами и датами.
Вот здесь и будет удобно использование микросхемы RTC (Real Time Clock, часов реального времени). Эта микросхема с батарейкой 3В или каким-либо другим источником питания следит за временем и датой.
Часы/календарь обеспечивают информацию о секундах, минутах, часах, дне недели, дате, месяце и годе. Микросхема корректно работает с месяцами продолжительностью 30/31 день и с високосными годами.
Связь осуществляется через шину I2C (шина I2C в данной статье не обсуждается).
Если напряжение на главной шине питания Vcc падает ниже напряжения на батарее Vbat, RTC автоматически переключается в режим низкого энергопотребления от резервной батареи.
Резервная батарея – это обычно миниатюрная батарея (в виде «монетки», «таблетки») напряжением 3 вольта, подключенная между выводом 3 и корпусом.
Таким образом, микросхема по-прежнему будет следить за временем и датой, и когда на основную схему будет подано питание, микроконтроллер получит текущие время и дату.
В этом проекте мы будем использовать DS1307. У этой микросхемы вывод 7 является выводом SQW/OUT (выходом прямоугольных импульсов). Вы можете использовать этот вывод для мигания светодиодом и оповещения микроконтроллера о необходимости фиксации времени. Мы будем делать и то, и другое. Ниже приведено объяснение работы с выводом SQW/OUT.
Для управления работой вывода SQW/OUT используется регистр управления DS1307.
OUT | SQWE | RS1 | RS0 |
Бит 7: управление выходом (OUT)Этот бит управляет выходным уровнем вывода SQW/OUT, когда выход прямоугольных импульсов выключен. Если SQWE = 0, логический уровень на выводе SQW/OUT равен 1, если OUT = 1, и 0, если OUT = 0. Первоначально обычно этот бит равен 0.Бит 4: включение прямоугольных импульсов (SQWE)Этот бит, когда установлен в логическую 1, включает выходной генератор. Частота прямоугольных импульсов зависит от значений битов RS0 и RS1. Когда частота прямоугольных импульсов настроена на значение 1 Гц, часовые регистры обновляются во время спада прямоугольного импульса. Первоначально обычно этот бит равен 0.Биты 1 и 0: выбор частоты (RS[1:0])Эти биты управляют частотой выходных прямоугольных импульсов, когда выход прямоугольных импульсов включен. Следующая таблица перечисляет частоты прямоугольных импульсов, которые могут быть выбраны с помощью данных битов. Первоначально обычно эти биты равны 1.
1 Гц | 1 | x | ||
1 | 4,096 кГц | 1 | x | |
1 | 8,192 кГц | 1 | x | |
1 | 1 | 32,768 кГц | 1 | x |
x | x | |||
x | x | 1 | 1 |
Данная таблица поможет вам с частотой:
1 Гц | 1 | |||||||
4,096 кГц | 1 | 1 | ||||||
8,192 кГц | 1 | 1 | ||||||
32,768 кГц | 1 | 1 | 1 |
Если вы подключили светодиод и резистор к выводу 7 и хотите, чтобы светодиод мигал с частотой 1 Гц, то должны записать в регистр управления значение 0b00010000.
Если вам нужны импульсы 4,096 кГц, то вы должны записать 0b000100001.
В этом случае, чтобы увидеть импульсы вам понадобится осциллограф, так как светодиод будет мигать так быстро, что будет казаться, что он светится постоянно. Мы будем использовать импульсы с частотой 1 Гц.
Аппаратная часть
Ниже показана структурная схема того, что нам необходимо.
Структурная схема часов на AVR микроконтроллере и RTC
Мы нужны:
- разъем ISP (In System Programming, внутрисхемное программирование) для прошивки микроконтроллера;
- кнопки для установки времени и даты;
- микроконтроллер для связи с RTC через шину I2C;
- дисплей для отображения даты и времени.
Принципиальная схема:
Часы на базе микроконтроллера AVR и RTC DS1307. Схема электрическая принципиальная
Перечень элементов
Ниже приведен скриншот из Eagle:
Часы на базе микроконтроллера AVR и RTC DS1307. Перечень элементов
Программное обеспечение
В этом руководстве мы будем использовать два различных скетча: один, который записывает время и дату в RTC, и один, который считывает время и дату из RTC. Мы сделали так потому, что так вы сможете получить более полное представление о том, что происходит. Мы будем использовать одну и ту же схему для обеих программ.
Сперва мы запишем время и дату в RTC, что аналогично установке времени на часах.
Мы используем две кнопки. Одну для увеличения часов, минут, даты, месяца, года и дня недели, а вторую для выбора между ними. Приложение не считывает состояния каких-либо критически важных датчиков, поэтому мы будем использовать прерывания для проверки, нажата ли кнопка, и обработки дребезга контактов.
Следующий код устанавливает значения и записывает их в RTC:
// Включение заголовочных файлов #include #include // Определение выводов LCD #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Прерывание 0 – это вывод 4 микроконтроллера (цифровой вывод 2 Arduino) int btnSet = 0; // Прерывание 1 – это вывод 5 микроконтроллера (цифровой вывод 3 Arduino) int btnSel = 1; // Флаги прерываний volatile int togBtnSet = false; volatile int togBtnSel = false; volatile int counterVal = 0; // Переменные для отслеживания, где в “меню” мы находимся volatile int menuCounter = 0; // Массив значений volatile int menuValues[6]; // 0=часы, 1=минуты, 2=день месяца, 3=месяц, 4=год, 5=день недели // Заголовки меню char* menuTitles[6] = { “Set hour. “, “Set minute. “, “Set date. “, “Set month. “, “Set year. “, “Set day (1=mon).” }; // Массив дней недели char* days[] = { “NA”, “Mon”, “Tue”, “Wed”, “Thu”, “Fre”, “Sat”, “Sun” }; void setup() { // Объявление прерываний, выполнение функций increaseValue/nextItem // по переднему фронту на btnXXX attachInterrupt(btnSet, increaseValue, RISING); attachInterrupt(btnSel, nextItem, RISING); Wire.begin(); lcd.begin(16,2); showWelcome(); } // Функция прерывания void increaseValue() { // Переменные static unsigned long lastInterruptTime = 0; // Создание метки времени unsigned long interruptTime = millis(); // Если timestamp – lastInterruptTime больше, чем 200 if (interruptTime – lastInterruptTime > 200) { togBtnSet = true; // Увеличить counterVal на 1 counterVal++; } // Установка lastInterruptTime равным метке времени // так мы знаем, что прошли дальше lastInterruptTime = interruptTime; } // Функция прерывания для следующего пункта меню void nextItem() { static unsigned long lastInterruptTime = 0; unsigned long interruptTime = millis(); if (interruptTime – lastInterruptTime > 200) { togBtnSel = true; // Увеличить счетчик меню, так мы переходим к следующему пункту меню menuCounter++; if (menuCounter > 6) menuCounter = 0; // Поместить counterVal в элемент массива счетчиков меню menuValues[menuCounter] = counterVal; // Сбросить counterVal, сейчас мы начинаем с 0 для следующего пункта меню counterVal = 0; } lastInterruptTime = interruptTime; } // Функция преобразования десятичных чисел в двоично-десятичный код byte decToBCD(byte val) { return ((val/10*16) + (val%10)); } // Функция проверки, была ли нажата кнопки листания меню, // и обновления заголовка на дисплее. void checkCurrentMenuItem() { if (togBtnSel) { togBtnSel = false; lcd.setCursor(0,0); lcd.print(menuTitles[menuCounter]); } } // Функция проверки, была ли нажата кнопка увеличения значения, // и обновления переменной в соответствующем элементе массива, // плюс вывод нового значения на дисплей. void checkAndUpdateValue() { // Проверить, если прерывание сработало = кнопка нажата if (togBtnSet) { // Обновить значение элемента массива с counterVal menuValues[menuCounter] = counterVal; // Сбросить флаг прерывания togBtnSet = false; lcd.setCursor(7,1); // Напечатать новое значение lcd.print(menuValues[menuCounter]); lcd.print(” “); } } // Короткое приветственное сообщение, теперь мы знаем, что всё нормально void showWelcome() { lcd.setCursor(2,0); lcd.print(“Hello world.”); lcd.setCursor(3,1); lcd.print(“I'm alive.”); delay(500); lcd.clear(); } // Запись данных в RTC void writeRTC() { Wire.beginTransmission(0x68); Wire.write(0); // начальный адрес Wire.write(0x00); // секунды Wire.write(decToBCD(menuValues[1])); // преобразовать минуты в BCD-код и записать Wire.write(decToBCD(menuValues[0])); // преобразовать часы в BCD-код и записать Wire.write(decToBCD(menuValues[5])); // преобразовать день недели в BCD-код и записать Wire.write(decToBCD(menuValues[2])); // преобразовать день месяца в BCD-код и записать Wire.write(decToBCD(menuValues[3])); // преобразовать месяц в BCD-код и записать Wire.write(decToBCD(menuValues[4])); // преобразовать год в BCD-код и записать Wire.write(0b00010000); // включить прямоугольные импульсы 1 Гц на выводе 7 Wire.endTransmission(); // закрыть передачу } // Показать время // Чтобы посмотреть, что RTC работает, вам необходимо посмотреть другую программу void showTime() { lcd.setCursor(0,0); lcd.print(” “); lcd.print(menuValues[0]); lcd.print(“:”); // часы lcd.print(menuValues[1]); lcd.print(“:”); lcd.print(“00 “); // минуты lcd.setCursor(3,1); lcd.print(days[menuValues[5]]); lcd.print(” “); // день недели lcd.print(menuValues[2]); lcd.print(“.”); // дата lcd.print(menuValues[3]); lcd.print(“.”); // месяц lcd.print(menuValues[4]); lcd.print(” “); // год // вызов функции writeRTC writeRTC(); } void loop() { if (menuCounter < 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }
Эта программа начинается с короткого приветственного сообщения. Это сообщение говорит нам, что подано питание, LCD работает, и что программа запустилась.
Так как скетч служит лишь для того, чтобы показать, как записать данные из Arduino в RTC DS1307, то в нем отсутствует вспомогательный функционал (проверка, попадают ли значения в допустимые диапазоны; зацикливание при нажимании на кнопку увеличения значения, то есть сброс на 0, когда значение, например, минут превысит 60, и т.д.)
// Включение заголовочных файлов #include #include // Определение выводов LCD #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Вывод, который будет принимать импульсы от RTC volatile int clockPin = 0; // Переменные времени и даты byte second; byte minute; byte hour; byte day; byte date; byte month; byte year; // Массив дней недели char* days[] = { “NA”, “Mon”, “Tue”, “Wed”, “Thu”, “Fre”, “Sat”, “Sun” }; // Функция, которая выполняется только при запуске void setup() { pinMode(clockPin, INPUT); pinMode(clockPin, LOW); Wire.begin(); lcd.begin(16,2); showWelcome(); } // Короткое приветственное сообщение, теперь мы знаем, что всё нормально void showWelcome() { lcd.setCursor(2,0); lcd.print(“Hello world.”); lcd.setCursor(3,1); lcd.print(“I'm alive.”); delay(500); lcd.clear(); } byte bcdToDec(byte val) { return ((val/16*10) + (val%16)); } // Это выполняется постоянно void loop() { // Если уровень на выводе clockPin высокий if (digitalRead(clockPin)) { // Начать передачу I2C, адрес 0x68 Wire.beginTransmission(0x68); // Начать с адреса 0 Wire.write(0); // Закрыть передачу Wire.endTransmission(); // Начать чтение 7 двоичных данных от 0x68 Wire.requestFrom(0x68, 7); second = bcdToDec(Wire.read()); minute = bcdToDec(Wire.read()); hour = bcdToDec(Wire.read()); day = bcdToDec(Wire.read()); date = bcdToDec(Wire.read()); month = bcdToDec(Wire.read()); year = bcdToDec(Wire.read()); // Форматирование и отображение времени lcd.setCursor(4,0); if (hour < 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.print(":"); if (second < 10) lcd.print("0"); lcd.print(second); lcd.setCursor(2,1); // Форматирование и отображение даты lcd.print(days[day]); lcd.print(" "); if (date < 10) lcd.print("0"); lcd.print(date); lcd.print("."); if (month < 10) lcd.print("0"); lcd.print(month); lcd.print("."); lcd.print(year); } }
Заключение
В данной статье мы рассмотрели микросхему DS1307 от Maxim Integrated и написали две демонстрационные программы: одну для установки времени и даты и вторую для чтения времени и даты. Для проверки нажатия кнопок мы использовали прерывания, в которых также избавлялись от влияния дребезга контактов.
Фото и видео
Макет часов на микроконтроллере AVR и RTC DS1307Макет часов на микроконтроллере AVR и RTC DS1307
Установка времени
Считывание времени
Оригинал статьи:
- Jens Christoffersen. How to Use RTC with Arduino and LCD
Arduino Uno
Отладочная плата Arduino Uno построена на микроконтроллере Atmega328P.
Она имеет 14 цифровых входных/выходных выводов (6 из которых могут использоваться в качестве ШИМ выходов), 6 аналоговых входов, кварцевый резонатор 16 МГц, подключение USB, разъем питания, разъем ICSP и кнопку перезагрузки. Она содержит всё необходимое для работы с микроконтроллером; для того, чтобы начать работу с ней, просто подключите…
https://www.youtube.com/watch?v=t9AcsxQv-5k
Набор перемычек (папа-папа)
Набор перемычек папа-папа. 40 штук по 15 см.
RTC модуль DS1307 + EEPROM
Модуль часов реального времени (RTC) на базе микросхемы DS1307 с EEPROM. Данный модуль содержит в себе сразу две микросхемы: DS1307 (часы реального времени с интерфейсом I2C) и AT24C32 (микросхема памяти EEPROM на 32 килобита) Так же на плате выведен разъем для установки датчика DALLAS 18B20 (датчик в комплекте не идет).
Источник: https://radioprog.ru/post/126
Электронные часы на Arduino. С будильником, таймером и другими плюшками 🙂 Начало
Буду собирать электронные носимые часы которые будут показывать не только время, ещё там будет будильник, таймер и секундомер. Это основные функции с которых и начну. Остальное буду добавлять по ходу пьесы.
Итак, допустим я уже освоил Arduino (хотя это не так, но хочется верить) и я хочу собрать великий проект о котором заговорят все и имя моё будет вписано в историю золотыми буквами… 🙂
Последние изменения в тексте: 15/05/2018
На самом деле это заметки по ходу работы и они будут корректироваться и изменяться. А заодно и мои мысли систематизируют. Для тех кто читает, не воспринимайте данную статью как готовый проект, это “мысли в слух”. Я вам гарантирую и путанные описания и ошибки, в том числе и грамматические.Собирать буду долго, так как базовый курс программирования отличается от реальности, с электроникой не знаком. Могу паять, преимущественно что-то не меньше розетки. Часть схем и програмного кода буду брать из интернета, что-то буду узнавать у знакомых. В общем, типичный новичок.Для проекта использую: Arduino UNO (копия) – для отладки, Макетная площадка Провода Модуль с часами реального времени RTC (убрал из проекта) Жк дисплей от Nokia5110 Резисторы Кнопки Компьютер Паяльник Припой И кучу свободного времени.
Меню электронных часов |
Эскиз меню часов виден на картинке.
#здесь будет картинка#
Подключаю компоненты согласно рисунку.
Заливаем скетч и любуемся. Любоваться придётся долго, пока я буду делать нормальный будильник.
Имеется три графических библиотеки, но я пока использую всего две: adafruit и u8glib. Каждая по своему хороша и плоха. Выбор будет за самой легкой по коду и размеру. В общем я начал использовать u8glib, но в какой то момент столкнулся с проблемой масштабирования шрифтов и пришлось использовать библиотеку adafruit. Я провел перевод кода с одной библиотеки в другую.
Перевод прошел успешно. Замена команд из одной библиотеки на другую создала небольшую задержку. Главное в этой ситуации найти аналог команд. Вся эта затея была предпринята ради особого шрифта в u8glib который был хорош, но не масштабированный. На днях я нашел решение по введению своих шрифтов, нужно попробовать и сравнить вообще библиотеки по объему занимаемой памяти.
Конечно в u8glib чуть больше возможностей с использованием графических команд, но adafruit мне показалась проще в освоении. На данный момент я соберу два скетча с разными графическими библиотеками и посмотрю какая из них меньше весит. Победила дружба 🙂 Не значительная разница. Они по разному используют память.
Скомпилировал два скетча на разных библиотеках и вот что получил. |
Библиотека U8lib
Sketch uses 18 378 bytes (56%) of program storage space. Maximum is 32 256 bytes.
Global variables use 472 bytes (23%) of dynamic memory, leaving 1 576 bytes for local variables. Maximum is 2 048 bytes.
Библиотека Adafruit GFX
Sketch uses 8 966 bytes (27%) of program storage space. Maximum is 32 256 bytes.
Global variables use 867 bytes (42%) of dynamic memory, leaving 1 181 bytes for local variables. Maximum is 2 048 bytes. Вроде Adafruit меньше ресурсов использует.
В самом начале я пытался разобраться со всем кодом сразу в одном скече. Со временем я пришел к выводу что лучше сделать отдельно каждый скеч на один экран, а уже позже объединить все в один. Управление планируется при помощи двух кнопок, третья для подсветки.
Главный экран электронных часов. |
Главный экран показывает всю необходимую информацию, такую как: День недели – прописью, Часы, минуты, секунды, День и название месяца. Теперь нужно разобраться как работают часы и что вообще там написано. В первых строчках понятно, это те библиотеки которые я использую в скетче.#include Adafruit_GFX.h; //графическая библиотека
#include Adafruit_PCD8544.
h; //библиотека для работы с дисплеем
#include Time.h; //библиотека для функций расчета времени
#include SPI.h; //библиотека для работы с модулями
#include Fonts/Org_01.h; //основной шрифт в часах
А здесь такой бардак с переменными что кое кто назовет это “говнокодом”. Ну и ладно, все равно лучше нет.
int knopkapauza = 250; //задержка нажатия кнопки и смена меню от случайного нажатия
//эти данные будут постоянные после сбросаint chas = 12; //переменная (int) в которой хранится час.
int minuta = 59; //переменная минуты
int sekunda = 55; //переменная секунды
int den = 19; //переменная день
//день недели высчитывается автоматически
int mesyac = 12; //переменная месяц
int god = 2017; //переменная год
int knopset = 10; //кнопка выбор пин 10
int knopmenu = 11; //кнопка меню пин 11
int knopled = 12; //кнопка подсветки пин 12 (я не помню почему, но можно только этот пин)
int vkluchiled = 0; //подсветка выключено
int lichtwaarde = 0; //подсветка/выбор задержка через 0
int menuwaarde = 0; //меню/дальше задержка через 0 //float Тип данных для чисел с плавающей точкой (чисел с десятичным разделителем).float millichas = 0; //эти данные для расчета времени
float milliminuta = 00;
float millisekunda = 0;
float millidays = 4000;
int tijd = 0; //время
int milli = 0;
float millitijd = 0;
int oudesekunda = 0;
int ledpin = 9; //вывод для подачи питания на жк
int licht = LOW;
int lichtsterkte = 15; //яркость света(от 0 до 254)
int schermcontrast = 45; //49-95
int globalmenu= 1; //первый пункт меню (можно использовать любой номер меню) //Переменные типа long обладают расширенным размером для хранения чисел// имеют размерность 32 бита (4 байта), что позволяет им хранить числа//в диапазоне от -2 147 483 648 до 2 147 483 647.
long tussentijd = 0; //промежуточное время
long teller = 0; //счетчик
long tellerStart = 0; //счетчик старт //- pin 7 – Serial clock out (SCLK)
//- pin 6 – Serial data out (DIN)
//- pin 5 – Data/Command select (D/C)
//- pin 4 – LCD chip select (CS)
//- pin 3 – LCD reset (RST)
//- Устанавливаем номера пинов к которым подключен дисплей
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); Короче, фиг его знает как разбираться с переменными… Для расчета времени используется библиотека Time.h Ниже void в котором расписан этот процесс. В теории можно добавить функцию корректировки времени.void setmillidays()
{ millichas = hour() * 41.6667; //расчет часа milliminuta = minute() * 0.6944; //расчет минуты if (oudesekunda == second()) { milli = millis() – tijd; millitijd = milli * 0.0000116; } else { millitijd = 0; milli = millis() – tijd; tijd = millis(); } oudesekunda = second(); millisekunda = oudesekunda * 0.0116; millidays = millichas + milliminuta + millisekunda + millitijd;
}
После многих вариантов был выбран ровный шрифт для часов по нескольким причинам. Первое и основное, на данном разрешении экрана фигурные шрифты выглядят убого и плохо читаются. Размер шрифта показывающего часы был выбран исходя из золотого сечения, который равен 1,61. Т.е. исходя из размера минут равного 20 точкам по высоте, умножаем на 1,61 и получим 32,2. Ноль два убираем и получаем высоту шрифта часов равную 32 точки. Ширину оставляю равную минутным шрифтам т.е. 20 точек. Наконец, закончил с названиями дней недели и месяцами. Стандартные шрифты не подходили. Сложности возникли из за количества точек по горизонту. Их 48 и туда нужно вместить 11 символов в слове “понедельник”, плюс пробелы. Буквы получились 3*5. С месяцами возникла сложность из за “сентября”. Он имеет 8 букв, но с левой стороны показана дата, плюс еще две цифры и пробелы. Буквы по размеру были подогнаны к основному шрифту 5*5. Методом проб и ошибок всё вместилось и выглядит хорошо.
//display.setCursor(int(month())+6, 83);
В координаты можно добавлять переменную месяц (при желании и минуты и день и год) и высчитывать новые координаты исходя из этих данных. Т.е. если выпал первый месяц, то 1+6=7, а если 7, то 7+6=13. С автоматическим изменением координат все тоже было решено. Не сразу, но я получил необходимый результат. Мне нужно что-бы название месяца и дата центрировались.
Из за того что координаты даты и координаты названия месяца прописываются в разных командных строчках мне не удавалось объединить их координаты. Может это можно как-то сделать, но я на данный момент не знаю этого. В итоге пришлось создать дополнительную переменную и прописать условия. Итак, на данный момент показ часов на главном экране сделан, но не закончен т.к.
требует отладки и оптимизации. По логике нужно переходить к календарю, но у меня есть желание закончить лунный календарь.
Так выглядят фазы луны. |
В оригинале фазы луны были нарисованный массивами или контейнерами, я предпринял попытку отрисовки геометрическими фигурами (круг и эллипс), возможно код станет меньше.
Основа луны это закрашенный диск. По умолчанию он черный, но цвет можно менять при помощи команды. Единственное, цвет потом нужно поменять с белого на черный иначе экран будет белый. Для отрисовки фазы луны используются две четвертинки круга, и две четвертинки эллипса. Для уменьшения кода, эллипс вырисовывается полностью, вместо двух строчек кода будет одна.
Радиус эллипса будет меняться в зависимости от лунного дня и добавлять или убавлять один пиксель. На данный момент показ фаз луны полностью изменен и находится в стадии тестирования.
Предполагаемый вариант отрисовки луны. |
Я хочу использовать линии для построения круга.
В зависимости от лунного дня горизонтальная центральная линия, которая является самой большой линией и диаметром круга, будет равна лунному циклу. Поясню, если сегодня полнолуние, то эта линия имеет наибольшую длину, равную 42 точкам (максимальный диаметр круга на этом дисплее). Если сегодня 14 лунный день, то и линия равна 21 точке.
Рассчитать центральную линию не сложно, сложнее с остальными, т.к. например седьмая линия во время полнолуния должна быть примерно 11 точек, а вторая или третья всего 5-6 точек. Мне нужно написать простую и понятную функцию. Пока буду использовать сложный метод вычисления. Он заключается в построчном расчете разницы между центральной линией и той которая короче.
Ниже образец расчета первой линии. Повторить 42 раза :)display.drawFastHLine(20, 24, drawmoon*0.71, 1);нарисовать горизонтальную линию20 и 24 начало координат прорисовки линиирасчет длинны линии:10/14=0.71 количество точек / количество дней полнолуния/новолунияdrawmoon*0.
71 переменная текущего дня * разницу точекцвет линии черныйСделал через строчную закраску луны, как на картинке выше. Не понравилось. Буду делать полную заливку луны. Сразу встал вопрос в количестве строк. Если использовать индивидуальную систему координат, то для отрисовки луны с первого дня по 14 нужно 43 строки (1 на отрисовку круга и 42 линии внутри круга).
И еще 43 строки для отрисовки с 15 по 29 день, т.к. там меняется цвет и формула расчета координат. И все же решение было найдено. Я сделаю переменные для изменения координат и цвета линии. Они будут изменятся при определенных параметрах. Если лунный день равен от 1 до 14, то берем номер дня и цвет черный. Если равен от 15 до 29, то номер дня -15 и цвет белый.
Ниже пример конвертации. Она была нужна для перевода значения дня в число.//конвертация string в int
int drawmoon;String dm = (const char*) nfm.c_str(); //эта строка преобразовывает значения из char в string
drawmoon=dm.toInt(); //то что перед точкой конвертируется в то значение которое стоит после точки Ниже фото тестовых экранов лунного календаря.
Они конечно не лучшего образца, но суть будет ясна.Верхняя строка где цифры “27 27” – обозначают количество оставшихся дней до полнолуния. В финальной версии вероятно их не будет, т.к. в этой строке планируется показ текущего времени. Вторая строка “3.5.2018” – текущая дата. Ниже даты собственно визуальная часть луны. Две нижние строки для описания фазы луны.
На данный момент – фаза убывающей луны. В дальнейшем придется по колдовать над шрифтами, т.к. слова не вмещаются в строчку, а идеале нужен шрифт 5*5 точки, но места не хватеат. Как видно на фото, буквы “Ы”, “Ю” и “Щ” используют 5 точек в ширину, а буква”Щ” к тому же и по высоте выходит на 6 точек. Пришлось пожертвовать буквами “Л” и “А”.На этом фото 15 мая 2018г.
, до новолуния остается один день. На визуальной части луны видна светлая полоса. Вообще новолуние, да и другая фаза луны длится примерно четыре дня (если быть точным, то нужно 29 суток разделить на 8 фаз, да и то это будет приблизительно).
Полностью закрашенная луна. Истинное новолуние.
За один день до полнолуния.
Так выглядит полнолуние.
Это только эскизы. На данном этапе отрисовка проходит корректно без косяков. Еще ведется работа по оптимизации кода, но эта часть проекта уже идет к завершению.
С календарем вышла заминка. Для расположения в книжном формате, шрифт очень большой, для альбомного расположение шрифта нет. Нужно мудрить.
Шрифт вроде подобрал. Теперь нужно написать как отображать даты.
Скорей всего нужно написать функцию с переменной которая будет приплюсовать в зависимости от даты в начале месяца. Типа, если месяц начинается в понедельник, то вывести семь цифр с увеличением на одну до воскресенья (седьмой день). Если во вторник, то первый день установить…
Но у меня названия дня недели расположены не горизонтально, а вертикально. Так это не работает. Нужно сделать массив с координатами для каждого числа.
Долго подбирал шрифт. Вроде есть который подошел. Буду его использовать. Вопрос с локализацией русских шрифтов решил просто.
Буду закрашивать пиксели в английских буквах. Если в этом шрифте в заглавной букве А закрасить одну точку, то она превращается в букву Я, буква О будет буквой П и т.д.
Нужно решить вопрос с масштабированием шрифтов. На данный момент есть только двойное увеличение. Есть рабочий вариант, но он еще не адаптирован и не протестирован.
Рабочего варианта нет. Все находиться в стадии тестирования. Вот это полная жесть. P.S. Буду тут писать заметки на полях.
- Было бы удобно делать гиперссылки и произвольно объединять в блоки части кода.
Источник: https://blogruoff.blogspot.com/2017/11/arduino_9.html
Простые часы на Ардуино и OLED дисплее – 1 Июля 2015 – Студия DIY
В основном часы на Ардуино делают с применением модулей RTC, к примеру DS3231, но иногда можно обойтись и без дополнительных модулей. В данном примере часы реализованы на Ардуино с подключенным OLED дисплеем на контроллере SSD1306. Точность таких часов конечно не высока, но зато бкз дополнительных модулей.
В данном примере реализован только сам механизм подсчёта времени, без команд управления. В коде реализован календарь с учётом високосных лет без ограничения по конечной дате (как правило все часовые модули имеют ограничение календаря до 2100 года). Подсчёт времени производится с помощью функции millis().
Подключение OLED дисплея к Ардуино описано здесь
Для работы необходимо загрузить библиотеку OLED_I2C и подключить их к Arduino. Скачиваем и распаковываем архив в папку Arduino с libraries.
Код
#include<\p>
const int ledPin = 13; // номер выхода, подключенного к светодиоду
int ledState = LOW; // этой переменной устанавливаем состояние светодиода
long previousMillis = 0; //переменная для хранения значений таймера // интервал отсчёта, меняя это значение можно корректировать точность хода часов
long interval = 1000; // интервал между включение/выключением светодиода
// Установка времени и даты int chas = 23; //значение часов int minut = 5; //значение минут int sek = 0; //значение секунд int den = 1; //день int mesac = 7; //месяц int god = 2015; //год int nedela = 3; // день недели int wgod = 2000; //первый высокосный год
int key = 1; //ключ перевода дня
// инициализация дисплея
OLED myOLED(SDA, SCL, 8);
// Подключение шрифтов extern uint8_t SmallFont[]; // Мелкий шрифт (латиница) extern uint8_t RusFont[]; // русские шрифты
extern uint8_t MegaNumbers[]; // Подключение больших цифр
void setup() { // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin, OUTPUT); myOLED.begin();
}
void loop() { unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то
if (currentMillis – previousMillis > interval)
{ // сохраняем время последнего переключения previousMillis = currentMillis;
sek++; // Добавляем секунду
if (sek > 59) { //если переменная секунд больше 59 … sek = 0; //сбрасываем ее на 0 minut++; //пишем +1 в переменную минут
}
if (minut > 59) { //если переменная минут больше 59 … minut = 0; //сбрасываем ее на 0 chas++; //пишем +1 в переменную часов
}
if (chas > 23) { //если переменная часов больше 23 … chas = 0; //сбрасываем ее на 0 nedela++; // переводим день недели if (nedela == 8) { // Если день недели = 8 nedela = 1; // то ставим на 1 (Понедельник)
}
// Если сейчас февраль и 29 число if (mesac == 2 && den == 29) { den = 1; // Переводим день на 1 число mesac++; // Переводим месяц key = 0; // Устанавливаем флаг перевода дня } // Если сейчас февраль и 28 число if (mesac == 2 && den == 28) { // Высчитываем ближайший високосный год do { wgod = wgod + 4; // в циклк вычисяем высокосные года } while (wgod < god); // и сравниваем с текущим годом // Если сравниваемый високосный год равен текущему if (wgod == god) { den++; // прибавляем день key = 0; // Устанавливаем флаг перевода дня } else { // Если сравниваемый високосный год НЕ равен текущему den = 1; // Устанавливаем первое число mesac++; // Переводим месяц key = 0; // Устанавливаем флаг перевода дня } wgod = wgod - 4; // Откатываем сравниваемый високосный год на предыдущий високосный год
}
// если сечас 30 число if ( den == 30 ) { // и сейчас 4, 6, 9 или 11 месяц if (mesac == 4 || mesac == 6 || mesac == 9 || mesac == 11 ) { den = 1; // Устанавливаем первое число mesac++; // Переводим месяц key = 0; // Устанавливаем флаг перевода дня } } // Если сейчас 31 число if ( den == 31 ) { // И сейчас 1, 3, 5, 7, 8, 10 или 12 месяц if (mesac == 1 || mesac == 3 || mesac == 5 || mesac == 7 || mesac == 8 || mesac == 10 || mesac == 12 ) { den = 1; // Устанавливаем первое число // если текущий месяц – Декабрь if (mesac == 12) { mesac = 1; // Переводим месяц на Январь god++; // Переводим на следующий год } else{ mesac++; // Переводим месяц } key = 0; // Устанавливаем флаг перевода дня } } // если флаг перевода дня равен 1 if (key == 1 ) { den++; // Добавляем день } else { // иначе если был установлен флаг перевода дня, день не добавляется key = 1; // и сбрасывается флаг перевода дня
}
}
lcd(); // Вывод информации на дисплей
} // конец опроса
} // конец цикла
void lcd(){
//вывод символов на дисплей//
// Установка большого шрифта myOLED.setFont(MegaNumbers); // отображение часов if (chas < 10) { // если число меньше 10 myOLED.print("0", 4, 12); // первый знак будет 0 (01) myOLED.print(String(chas), 27, 12); } else { myOLED.
print(String(chas), 4, 12); } // Отображение Двоеточия if (ledState == LOW) { // мигаем двоеточием ledState = HIGH; // Переключаем порт myOLED.print(“/”, 51, 12); // Выводим “:” }else{ ledState = LOW; // Переключаем порт myOLED.
print(“-“, 51, 12); // Выводим ” “
}
// Отображение минут if (minut < 10) { // если число меньше 10 myOLED.print("0", 75, 12); // первый знак будет 0 (01) myOLED.print(String(minut), 100, 12); }else { myOLED.print(String(minut), 75, 12);
}
// Отображение секунд // Установка маленького шрифта myOLED.setFont(SmallFont); myOLED.print(“:”, 110, 5); // Выводим “:” if (sek < 10) { // если число меньше 10 myOLED.print("0", 115, 5); // первый знак будет 0 (01) myOLED.print(String(sek), 121, 5); }else { myOLED.print(String(sek), 115, 5);
}
// Отображение дня if (den < 10) { // если число меньше 10 myOLED.print("0", 10, 55); // первый знак будет 0 (01) myOLED.print(String(den), 16, 55); }else { myOLED.print(String(den), 10, 55);
}
// Отображение месяца myOLED.print(“.”, 22, 55); // Выводим “.” if (mesac < 10) { // если число меньше 10 myOLED.print("0", 28, 55); // первый знак будет 0 (01) myOLED.print(String(mesac), 34, 55); }else { myOLED.print(String(mesac), 28, 55);
}
myOLED.print(“.”, 40, 55); // Выводим “.” // Отображение года
myOLED.print(String(god), 46, 55);
// Отображение дня недели myOLED.setFont(RusFont); switch (nedela) { case 1: myOLED.print(“GJYTLTKMYBR”, CENTER, 0); break; //Понедельник case 2: myOLED.
print(” DNJHYBR “, CENTER, 0); break; //Вторник case 3: myOLED.print(” CHTLF “, CENTER, 0); break; //Среда case 4: myOLED.print(” XTNDTHU “, CENTER, 0); break; //Четверг case 5: myOLED.
print(” GZNYBWF “, CENTER, 0); break; //Пятница case 6: myOLED.print(” CE
Источник: http://studio-diy.3dn.ru/news/prochtye_chasy_na_arduino_i_oled_displee/2015-07-01-56