Часы на ssd1306 (много)

lilik
Offline
Зарегистрирован: 19.10.2017

По запросу из темы

http://arduino.ru/forum/proekty/imitatsiya-razlichnykh-shkal-na-displee-...

 и от нечего делать (бейджик к Ардуино не цепляется :-( , сделал макет часов - каких точно ни у кого нет :-)

 

 

Картина маслом.

 

 

lilik
Offline
Зарегистрирован: 19.10.2017

Запрос из 329 поста (забыл указать).

lilik
Offline
Зарегистрирован: 19.10.2017

    Забыл файл добавленных цифр.(файл DefaultFonts.c заменить на этот).

 

man_200
Offline
Зарегистрирован: 29.04.2016

Красивое решение!

Интересно, а с ILI9341 по SPI можно такое сотворить?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Сотворить можно все, что угодно. Более того, в случае цветного дисплея это сделать намного проще.

lilik
Offline
Зарегистрирован: 19.10.2017

Вот вариант корпуса под готовую поделку - бомба.

man_200
Offline
Зарегистрирован: 29.04.2016

Токи потребления не смотрел?

lilik
Offline
Зарегистрирован: 19.10.2017

Смотрел, около 26-28 мА :-)

lilik
Offline
Зарегистрирован: 19.10.2017

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

По модулю (по ходу) ds3231 возник вопрос - различает ли он самостоятельно дни в месяце, где 28,29,30,31 или в каждом шпарит по 31?

 

Green
Offline
Зарегистрирован: 01.10.2015
Real-Time Clock Counts Seconds, Minutes, Hours,
Date of the Month, Month, Day of the Week, and
Year, with Leap-Year Compensation Valid Up to 2100
В некоторых Dallas-ах ещё был автопереход на летнее/зимнее время.
lilik
Offline
Зарегистрирован: 19.10.2017
1time.settime(0,58,18,20,8,19,2);  // 0  сек, 58 мин, 18 час, 20, АВГУСТА, 2019 года, ВТОРНИК

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

 

Green
Offline
Зарегистрирован: 01.10.2015

А проверить? Насколько помню, введётся с ошибкой, но по ходу исправится на корректное значение.
Я именно о DS, а не о библиотеке.

lilik
Offline
Зарегистрирован: 19.10.2017

Понял. Но библиотека любая, по идее, просто выводит в переменных что ей дают, без программной обработки? 

lilik
Offline
Зарегистрирован: 19.10.2017

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

time.settime(0,58,18,20,8,19,2);  // 0  сек, 58 мин, 18 час, 20, АВГУСТА, 2019 года, ВТОРНИК

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Почему ж нельзя? Она просто пишет в регистры новые значения. Ей без разницы - из лупа или из майна.

Циклы и массивы строк (DOW/Month) придадут коду стройности.
Ещё можно в пятницу 13-го выводить жуткий циферблат, а 1-го апреля время отображать по рандомайзу.

lilik
Offline
Зарегистрирован: 19.10.2017

Добавил 4 тему и кнопку перебора тем, объединил в один скетч, почти 90 процентов памяти занял. Влезет ещё 1-2 темы :-)

Да, верно, наверное надо подумать об особой - праздничной теме, 1 апреля, день рождения владельцев или влюблённых день, или пятница 13.

В зависимости от выбранной темы потребляет конструкция 20-30мА. Можно и подумать о вариантах снижения потребления :-(

 

lilik
Offline
Зарегистрирован: 19.10.2017

Периодическая сборка-разборка макета часов показала неожиданную досаду! Модуль часов реального времени, со вставленной литиевой батарейкой отстал от часов на ПК на 20 секунд за 40 суток! Как так?

То есть теперь надо как то изгаляться, писать 5 тему для возможности редактирования отображаемого времени - одной кнопкой. Больше кнопок добавлять не хочется и типов нажатий тоже. Как логику темы построить?  

Green
Offline
Зарегистрирован: 01.10.2015

Может записать __TIME__? И сменить батарейку.

lilik
Offline
Зарегистрирован: 19.10.2017
01#include <iarduino_RTC.h>                                 // Подключаем библиотеку
02iarduino_RTC watch(RTC_DS1307);                           // Объявляем объект watch для модуля на базе чипа DS1307
03                                                          //
04//  Определяем системное время:                           // Время загрузки скетча.
05const char* strM="JanFebMarAprMayJunJulAugSepOctNovDec"// Определяем массив всех вариантов текстового представления текущего месяца.
06const char* sysT=__TIME__;                                // Получаем время компиляции скетча в формате "SS:MM:HH".
07const char* sysD=__DATE__;                                // Получаем дату  компиляции скетча в формате "MMM:DD:YYYY", где МММ - текстовое представление текущего месяца, например: Jul.
08//  Парсим полученные значения sysT и sysD в массив i:    // Определяем массив «i» из 6 элементов типа int, содержащий следующие значения: секунды, минуты, часы, день, месяц и год компиляции скетча.
09const int i[6] {(sysT[6]-48)*10+(sysT[7]-48), (sysT[3]-48)*10+(sysT[4]-48), (sysT[0]-48)*10+(sysT[1]-48), (sysD[4]-48)*10+(sysD[5]-48), ((int)memmem(strM,36,sysD,3)+3-(int)&strM[0])/3, (sysD[9]-48)*10+(sysD[10]-48)};
10                                                          //
11void setup() {
12    Serial.begin(9600);                                   // Инициируем передачу данных в монитор последовательного порта
13    watch.begin();                                        // Инициируем RTC модуль
14    watch.settime(i[0],i[1],i[2],i[3],i[4],i[5]);         // Устанавливаем время в модуль: i[0] сек, i[1] мин, i[2] час, i[3] день, i[4] месяц, i[5] год, без указания дня недели.
15//  watch.settime(i[0],i[1],i[2],i[3],i[4],i[5], 2);      // Можно установить время с указанием дня недели, где последний параметр, это день недели (указывается вручную) в формате: 0-воскресенье, 1-понедельник, ... , 6-суббота.
16}
17void loop(){
18    if(millis()%1000==0){                                 // Если прошла 1 секунда
19        Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // Выводим время в монитор, одной строкой
20        delay(2);                                         // Приостанавливаем скетч на 2 мс.
21    }
22}

Я не нашёл подробное описание функции, только такой пример. Не совсем ясно, можно этот "тайм" вызывать при подключении к пк - по кнопке и переустанавливать время?

Green
Offline
Зарегистрирован: 01.10.2015

Делаю так.

01uint8_t bcd_clock[CLOCK_SIZE];          //packed BCD
02 
03 
04static uint8_t conv2bcd(const char* p) {
05  uint8_t v = 0;
06  if (*p >= '0' && *p <= '9')
07    v = *p - '0';
08  return (v << 4) | (*++p - '0');
09}
10 
11 
12// Set the compiler's time: setClock(__DATE__, __TIME__);
13void setClock(const char* date, const char* time) {
14  // sample input: date = "Dec 26 2009", time = "12:34:56"
15  // clock[YEAR] = conv2bcd(date + 9);
16  // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
17  uint8_t m = 0x12;                     //wo case 'D'
18  switch (date[0]) {
19    case 'J': m = (date[1] == 'a') ? 1 : ((date[2] == 'n') ? 6 : 7); break;
20    case 'F': m = 2; break;
21    case 'A': m = date[2] == 'r' ? 4 : 8; break;
22    case 'M': m = date[2] == 'r' ? 3 : 5; break;
23    case 'S': m = 9; break;
24    case 'O': m = 0x10; break;
25    case 'N': m = 0x11; break;
26    // case 'D': m = 0x12; break;
27  }
28  bcd_clock[YEAR]   = conv2bcd(date + 9);
29  bcd_clock[MONTH]  = m;
30  bcd_clock[DAY]    = conv2bcd(date + 4);
31  bcd_clock[HOUR]   = conv2bcd(time);
32  bcd_clock[MINUTE] = conv2bcd(time + 3);
33  bcd_clock[SECOND] = conv2bcd(time + 6);
34  bcd_clock[DAY_OF_WEAK] = CUR_DAY_OF_WEAK;
35  ds1307Buf2Clock(bcd_clock);
36}

 

b707
Offline
Зарегистрирован: 26.05.2017

lilik пишет:
Я не нашёл подробное описание функции, только такой пример. Не совсем ясно, можно этот "тайм" вызывать при подключении к пк - по кнопке и переустанавливать время?

какой функции не нашел, _TIME_ ? :)

Это не функция, это макрос, эта строчка при компиляции заменяется текущим временем компиляции.

Из этого следует (для любого программиста очевидно :). что никак этот _TIME_ вызывать нельзя :) Точнее, вставить-то в функцию его можно, только время в нем будет всегда одно и тоже - время компиляции

Green
Offline
Зарегистрирован: 01.10.2015

Человеку как раз и надо ОДНАЖДЫ установить время.)

b707
Offline
Зарегистрирован: 26.05.2017

Green пишет:

Человеку как раз и надо ОДНАЖДЫ установить время.)

судя по его вопросу - совсем нет, он хочет вызывать по кнопке - а значит многократно

lilik пишет:

можно этот "тайм" вызывать при подключении к пк - по кнопке и переустанавливать время?

Green
Offline
Зарегистрирован: 01.10.2015

Иногда делал установку из терминала, типа: 2109261127.)

Green
Offline
Зарегистрирован: 01.10.2015

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

lilik
Offline
Зарегистрирован: 19.10.2017

Понял ваши объяснения. Просто думал, функция библиотеки это - послал запрос: получил ответ:-)

Тогда, как вариант, но делать не буду :-) послал время со смартфона через блютуз. Так я уже делал, надо поискать и вспомнить, а вот с кнопкой одной ещё не пробовал.

b707
Offline
Зарегистрирован: 26.05.2017

lilik пишет:

Тогда, как вариант, но делать не буду :-) послал время со смартфона через блютуз.

тогда уж просто коррекцию времени по сети через есп8266 - не дороже БТ, но много функциональнее

lilik
Offline
Зарегистрирован: 19.10.2017

Нее, из схемы выходить не хочу, одна кнопка и всё :-)

Была мысль по совету Григория из 14 поста - прикрутить пьезоизлучатель, чтоб в нужный день играть "хеппи бёздей туюю", но... нет.

Green
Offline
Зарегистрирован: 01.10.2015

lilik пишет:

Нее, из схемы выходить не хочу, одна кнопка и всё :-)


Так и одной кнопкой можно делать установку. Не очень удобно, но можно. Не так это часто требуется.

lilik
Offline
Зарегистрирован: 19.10.2017

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

Green
Offline
Зарегистрирован: 01.10.2015

Как это без "коротких и длинных"?

lilik
Offline
Зарегистрирован: 19.10.2017
1if(digitalRead (7)==LOW){//если нажата кнопка 7 вывода
2    TEMA++;if(TEMA==4){TEMA=0;}
3   if(TEMA==0){ myOLED.setFont(BigZif_0_9); tschasi();}
4   if(TEMA==1){PUSK = true;myOLED.setFont(RusFont);fun_();PUSK = false;}
5   if(TEMA==2){PUSK = true;myOLED.setFont(RusFont);fun_B();PUSK = false;}
6   if(TEMA==3){PUSK = true;myOLED.setFont(MegaNumbers);fun_C();PUSK = false;} 
7    delay(50);
8    }

Вот так примерно.

Green
Offline
Зарегистрирован: 01.10.2015

А словами никак? ТЕМА, tschasi, PUSK... Ужос!
Длинное нажатие - следующая цифра, короткое - крутим по кругу. 2х2.

lilik
Offline
Зарегистрирован: 19.10.2017

:-)

В этой кнопке всё просто: короткое нажатие - переход на следующую тему, долгое нажатие - переходы на следующие темы, нажатие просто - закольцованный переход между темами. Теперь в эту гармонию надо добавить 5-ю тему, а в неё надо вставить ещё одну гармонию, только перебирающую-выставляющую новое значение времени. Делов то :-), только как оптимально сделать?

Green
Offline
Зарегистрирован: 01.10.2015

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

SAB
Offline
Зарегистрирован: 27.12.2016

Доп значки на дисплей в каком режиме находишься.

Green
Offline
Зарегистрирован: 01.10.2015

Ну это уже user friendly интерфейс.)

lilik
Offline
Зарегистрирован: 19.10.2017

SAB пишет:

Доп значки на дисплей в каком режиме находишься.

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

Пока выдумывается такой сценарий: при очередном нажатии кнопки переходим в тему 5 - экран соответственно рисуется, далее ожидание-таймер на 5-10 сек. Если нажимаем кнопку до срабатывания, то переходим вновь к теме №1, иначе запускается процедура установки нового значения времени... Дальше пока не придумал.

Green
Offline
Зарегистрирован: 01.10.2015

Вы это людЯм объясните. То бишь, вы должны думать со стороны конечного пользователя, что бы ИМ было удобно, в первую очередь.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Вы это людЯм объясните. То бишь, вы должны думать со стороны конечного пользователя, что бы ИМ было удобно, в первую очередь.

Это да, так как библиотека iarduino_RTC от царя-гороха чуток поправил, чтобы можно было добавлять через менеджер библиотек ZIP файлом. Здесь же и библиотеку OLED_I2C форкнул и чуток поправил, заменил файл шрифтов и в коде  явные логические ошибки.
Теперь обе можно поставить через менеджер библиотек подключив  скачанные ZIP файлы.

Но осталось еще очень много предупреждений, помогайте, что еще там надо поправить?
 

 

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Теперь обе можно поставить через менеджер библиотек подключив  скачанные ZIP файлы.

если библиотеки уже скачаны как ZIP - нафига еще менеджер? Кладешь в папку libraries и все

Цитата:
Но осталось еще очень много предупреждений, помогайте, что еще там надо поправить?

зачем нам это? Автор кода где? - пусть сам исправляет

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

lilik

Не думали заменить атмегу на esp8266? Тогда возможны 2 варианта по корректировке времени: либо периодический запрос NTP, либо простенькая веб-морда для настроек всего

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

Теперь обе можно поставить через менеджер библиотек подключив  скачанные ZIP файлы.

если библиотеки уже скачаны как ZIP - нафига еще менеджер? Кладешь в папку libraries и все

Цитата:
Но осталось еще очень много предупреждений, помогайте, что еще там надо поправить?

зачем нам это? Автор кода где? - пусть сам исправляет

Троллишь?

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Троллишь?

нет. Ни одну библиотеку в жизни не устанавливал через менеджер. Скачать Zip архивом проще

Green
Offline
Зарегистрирован: 01.10.2015

"Ты меня не тролль, ты меня не тролль..." Нештатные библиотеки размещаю в папке со скетчем. Особенно актуально для глупых юзеров.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

Троллишь?

нет. Ни одну библиотеку в жизни не устанавливал через менеджер. Скачать Zip архивом проще

только при установке через менеджер он сразу сообщит, что библиотека кривая, не соответствует стандарту и не установит, а так да, "можно сделать защиту от дурака но не от изобретательного"

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

менеджер сразу сообщит, что библиотека кривая, не соответствует стандарту и не установит

фигасе...

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

и что такое "кривая либа" или "не соответвует стандарту"? - ни разу такого не видел

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

менеджер сразу сообщит, что библиотека кривая, не соответствует стандарту и не установит

фигасе...

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

и что такое "кривая либа" или "не соответвует стандарту"? - ни разу такого не видел

видимо ПАТАМУШТА не писал библиотек, а вот DetSimen пришлось, я ему мозг немного повыносил и даже не налил, каюсь )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

видимо ПАТАМУШТА не писал библиотек, а вот DetSimen пришлось

Чесноговоря, мне абсолютно пох на то, встанет биб-ка в эту убогую IDE или нет, я ей не пользуюсь.  Ты сам потом всякие keywords вставлял и прочую шнягу для "менеджера"

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Чесноговоря, мне абсолютно пох на то, встанет биб-ка в эту убогую IDE или нет, я ей не пользуюсь.  Ты сам потом всякие keywords вставлял и прочую шнягу для "менеджера"

думаю юзеры перебьются и без keywords... пусть сначала сами научаться писать либы. а потом претензии предъявляют :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

видимо ПАТАМУШТА не писал библиотек, а вот DetSimen пришлось

Чесноговоря, мне абсолютно пох на то, встанет биб-ка в эту убогую IDE или нет, я ей не пользуюсь.  Ты сам потом всякие keywords вставлял и прочую шнягу для "менеджера"

было дело )))
PS а вот как собрать своё ядро на ГИТхабе по фэншую - не дошло, не в те папки IDE размещает