O-Clock простые часы на матрице 8х32

vikonix
Offline
Зарегистрирован: 19.05.2019

Приветствую всех. Давно хотел сделать часы на матрице 8х32. Сначала решил взять уже готовый проект. Но посмотрев несколько вариантов понял, что меня они не устраивают. Хотел модернизировать исходники, но как обычно проще все написать с нуля. Собственно, что и сделал. Часть идей позаимствовал в других проектах. Что хотел получить: простые и удобные часы-будильник, без лишнего функционала. Код написан очень просто, его легко модернизировать под себя.

Что они умеют: показывают время большими анимированными цифрами, показывают температуру и влажность, показывают дату. Можно настроить текущее время. Время срабатывания будильника. В качестве звонка играет мелодия, которую можно выбрать (прошито 5 мелодий). Для будильника можно задать дни недели срабатывания.

Проект выложил на GitHub:https://github.com/vikonix/O-Clock

Используется Arduino Nano, линейная матрица 8х32, часы DS3231, датчик влажности BME280.

Для управления используется 3 кнопки, но достаточно 2-х. Есть регулятор яркости на фоторезисторе. Звук - пассивный пьезо излучатель.

Проект можно собрать под Arduino IDE или под PlatformIO.

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

 

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

А можно посмотреть видео, как все это выглядит? 

vikonix
Offline
Зарегистрирован: 19.05.2019

Да конечно, картинки и видео сделаю.

vikonix
Offline
Зарегистрирован: 19.05.2019

Часы на макетной плате.

Видео работы на Youtube
https://www.youtube.com/watch?v=nfpqMhbTryE

 

boogifreeman
Offline
Зарегистрирован: 20.05.2019

Часики супер. Сегодня вечером попробую собрать

vikonix
Offline
Зарегистрирован: 19.05.2019

Буду рад если понравятся.

vikonix
Offline
Зарегистрирован: 19.05.2019

Нарисовал схему.

boogifreeman
Offline
Зарегистрирован: 20.05.2019

Получилось ура! Спасибо за проект) Есть вопрос, какой именно фоторезистор вы используете? И ещё, один светодиод тусклей всех светится, не пойму с чем связанно.

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

Первые мои часы, не устану говорить спасибо. Очень порадовал проект!

vikonix
Offline
Зарегистрирован: 19.05.2019

Рад что все получилось.

Фоторезистор китайский: 5528 Light Dependent Resistor LDR 5MM Photoresistor
Яркость отдельной точки, это какая-то особенность конкретной матрицы.
Информер пока делать не планирую.

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

const byte font_digit_6x8[] PROGMEM = {
0x7e, 0xff, 0x81, 0x81, 0xff, 0x7e, //'0' 0
0x00, 0x82, 0xff, 0xff, 0x80, 0x00, //'1' 1
0x82, 0xc1, 0xa1, 0x91, 0xcf, 0xc6, //'2' 2
0x42, 0xc1, 0x89, 0x89, 0xff, 0x76, //'3' 3
0x38, 0x24, 0xa2, 0xff, 0xff, 0xa0, //'4' 4
0x4f, 0xcf, 0x89, 0x89, 0xf9, 0x71, //'5' 5
0x7c, 0xfe, 0x8b, 0x89, 0xf9, 0x70, //'6' 6
0x01, 0x81, 0xf1, 0xf9, 0x8f, 0x07, //'7' 7
0x76, 0xff, 0x89, 0x89, 0xff, 0x76, //'8' 8
0x0e, 0x9f, 0x91, 0xd1, 0x7f, 0x3e, //'9' 9

вместо 16-ричной цифры '0x7e' можно прописать отдельные биты '0b01111110'.
здесь каждая цифра описывает один столбик цифры. В цифре 6 столбиков. Старший-левый бит нижняя точка, правый младший - верхняя точка. Если ошибиться с битами, ничего страшного, будет просто не правильная цифра, можно менять по одной цифре.
 

boogifreeman
Offline
Зарегистрирован: 20.05.2019

Если бы я бы только умел программировать...))) Вообще не шарю в этом. Но все же спасибо)

vikonix
Offline
Зарегистрирован: 19.05.2019

boogifreeman пишет:

Если бы я бы только умел программировать...))) Вообще не шарю в этом. Но все же спасибо)

там вообще не нужно программировать )
просто в любом редакторе подправить сами буквы
и пересобрать проект

vikonix
Offline
Зарегистрирован: 19.05.2019

могу помочь
нужно написаль любую цифру в виде 0или1, 1-светится
например 2 из примера

11111011
11111011
11011011
11011011
11011111
11011111

Если смотреть боком, то единицы образуют цифру 2

 

boogifreeman
Offline
Зарегистрирован: 20.05.2019

Понял, буду пробовать

vikonix
Offline
Зарегистрирован: 19.05.2019

Нужно сохранить все запятые и перед каждой цифрой писать 0b

0b11111011,
0b11111011,
0b11011011,
0b11011011,
0b11011111,
0b11011111,

vikonix
Offline
Зарегистрирован: 19.05.2019

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

boogifreeman
Offline
Зарегистрирован: 20.05.2019

Получилось)

vikonix
Offline
Зарегистрирован: 19.05.2019

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

vikonix
Offline
Зарегистрирован: 19.05.2019

Исправил потенциальную ошибку с миганием курсора.

andrva
Offline
Зарегистрирован: 26.10.2018

Добрый день.

Ошибка при компиляции в Alarm.h. Подскажите, как исправить ? IDE 1.8.9.

 

 
In file included from sketch\oclock.h:35:0,
                 from sketch\main.cpp:31:
sketch\alarm.h: In member function 'bool Alarm::CheckTime(const DateTime&)':
alarm.h:148:35: error: 'const class DateTime' has no member named 'dayOfTheWeek'
       (m_Days & DayOfTheWeek(time.dayOfTheWeek()))
                                   ^
 

 

vikonix
Offline
Зарегистрирован: 19.05.2019

Добрый день.

Эта функция находится во внешней библиотеке RTCLib
Какая у Вас установленна версия? У меня используется 1.2.1
 

vikonix
Offline
Зарегистрирован: 19.05.2019

У меня кстати, такая же версия IDE 1.8.9.

andrva
Offline
Зарегистрирован: 26.10.2018

name=RTClib
version=1.2.1
author=Adafruit

andrva
Offline
Зарегистрирован: 26.10.2018

Все библиотеки скопировал в SRC. Вызываю так - #include "RTClib.h"

vikonix
Offline
Зарегистрирован: 19.05.2019

andrva пишет:

Все библиотеки скопировал в SRC. Вызываю так - #include "RTClib.h"

Более правильно настроить версии библиотек в самом IDE

Меню Sketch->Include library->Manage libraries...

В поле поиска ввести "rtclib" и посмотреть, что будет найдено.
 

andrva
Offline
Зарегистрирован: 26.10.2018

Решил, еще в main.cpp исправил на #include "RTClib.h". Всем спасибо.

vikonix
Offline
Зарегистрирован: 19.05.2019

Сейчас судя по всему конфлики версий библиотеки в IDE и локальной в проекте

andrva
Offline
Зарегистрирован: 26.10.2018

Да, разница между #include "RTClib.h" и #include <RTClib.h>  огромная.

vikonix
Offline
Зарегистрирован: 19.05.2019

Подправил позицию курсора при выставлении даты.

vikonix
Offline
Зарегистрирован: 19.05.2019

Сделал несколько исправлений. В частности сдвинул цифры в середину. Точка активности будильника сливается с некоторыми цифрами, но вроде не сильно мешает.
Если есть цифровой шум в зумере на высокой яркости нужно добавить электролит 470 мкФ и керамику 0.1 мкФ по питанию.

VladimirSPB
Offline
Зарегистрирован: 08.01.2018

Собрал часики, пока на макетке. Работают замечательно. Есть вопрос к автору: как добавить показ давления в автоматическом режиме?

vikonix
Offline
Зарегистрирован: 19.05.2019

Чтобы показывать давление нужно немного подправить код. В общем не сложно.
У меня простой вопрос, зачем оно нужно. На сколько я знаю, само по себе значение давления ничего не говорит. Интерес представляет изменение давление (повышение/понижение) и скорость изменения. Или я чего то не понимаю?

VladimirSPB
Offline
Зарегистрирован: 08.01.2018

Так-то оно конечно. Обычно при изменении давления меняется погода. Многие люди страдают метеочувствительностью, реагируют на смену погоды. Но как я понимаю в данном проекте реализовать график давления непросто. Если же выводить цифровое значение давления на экран, то зная нормальное давление в своем регионе можно знать его отклонение от нормы. Датчик BME280 есть, даже строки в коде на показ давления есть (закоментированные). Я смог сделать только показ давления и перевести его в мм.рт.ст, но для этого пришлось закоментировать строки показа температуры и влажности. Не хватает у меня знаний и опыта :( Если не сложно, помогите, буду весьма признателен.

VladimirSPB
Offline
Зарегистрирован: 08.01.2018

vk007
Онлайн
Зарегистрирован: 16.06.2015

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

vikonix
Offline
Зарегистрирован: 19.05.2019

VladimirSPB пишет:

Не хватает у меня знаний и опыта :( Если не сложно, помогите, буду весьма признателен.

Хорошо добавлю.

 

VladimirSPB
Offline
Зарегистрирован: 08.01.2018

Спасибо! Я смотрел Ваш проект, даже прикупил отдельные матрицы под него, наверно со временем сделаю. У меня работают на даче часы на матрицах http://arduino.ru/forum/proekty/chasy-na-matritsakh а графики давления строит барограф http://arduino.ru/forum/proekty/arduino-barometr-barograf . Часики из этого проекта, тоже понравились хочу сделать для дома.

vikonix
Offline
Зарегистрирован: 19.05.2019

Добавил показ давления в hPa/гектопаскалях. В мм ртутного столба, я думаю, сами переведете?
Исходники на гитхабе.

VladimirSPB
Offline
Зарегистрирован: 08.01.2018

Большое спасибо! Все отлично работает.

YRA
Offline
Зарегистрирован: 10.01.2015

vikonix,VladimirSPB, добрый день, а нет ли возможности выложить скетч  с давлением в mm ртутного столба. Спасибо. Буду пробовать собрать. С уважением,Юрий.

vikonix
Offline
Зарегистрирован: 19.05.2019

Добавил вывод давления в мм. Нужно исправить строчку в файле main.cpp:41

#define PRESSURE_IN_MM

Убрать в начале 2 символа деления //

YRA
Offline
Зарегистрирован: 10.01.2015

Спасибо огромное, буду собирать на монтажке пока. Спасибо огромное 

peterzonda
Offline
Зарегистрирован: 25.11.2016
Arduino: 1.8.13 (Windows 10), Vývojová doska:"Arduino Nano, ATmega328P (Old Bootloader)"
 
In file included from sketch\oclock.h:35:0,
 
                 from sketch\main.cpp:31:
 
sketch\alarm.h: In member function 'bool Alarm::CheckTime(const DateTime&)':
 
alarm.h:132:41: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
         if(m_Snooze + ALARM_TIME > time.secondstime())
 
                                         ^~~~~~~~~~~
 
                                         setunixtime
 
alarm.h:139:30: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
     else if(m_Snooze == time.secondstime())
 
                              ^~~~~~~~~~~
 
                              setunixtime
 
alarm.h:148:35: error: 'const class DateTime' has no member named 'dayOfTheWeek'; did you mean 'dayOfWeek'?
 
       (m_Days & DayOfTheWeek(time.dayOfTheWeek()))
 
                                   ^~~~~~~~~~~~
 
                                   dayOfWeek
 
alarm.h:158:23: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
       m_Snooze = time.secondstime();
 
                       ^~~~~~~~~~~
 
                       setunixtime
 
sketch\alarm.h: In member function 'void Alarm::Reset(const DateTime*)':
 
alarm.h:178:24: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
       m_Snooze = time->secondstime() + SNOOZE_TIME;
 
                        ^~~~~~~~~~~
 
                        setunixtime
 
sketch\main.cpp: In function 'void loop()':
 
main.cpp:531:27: error: 'class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
     ModeTimeout = CurTime.secondstime() + KEY_TIMEOUT_PERIOD;
 
                           ^~~~~~~~~~~
 
                           setunixtime
 
main.cpp:534:46: error: 'class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
   else if(Mode != MODE_SHOW_CLOCK && CurTime.secondstime() > ModeTimeout)
 
                                              ^~~~~~~~~~~
 
                                              setunixtime
 
main.cpp:553:49: error: 'class DateTime' has no member named 'dayOfTheWeek'; did you mean 'dayOfWeek'?
 
       bool alarm = (Alarm::DayOfTheWeek(CurTime.dayOfTheWeek()) & d) != 0;
 
                                                 ^~~~~~~~~~~~
 
                                                 dayOfWeek
 
main.cpp:563:31: error: 'class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
         ModeTimeout = CurTime.secondstime() + AUTO_SHOW_TEMP;
 
                               ^~~~~~~~~~~
 
                               setunixtime
 
main.cpp:572:31: error: 'class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
         ModeTimeout = CurTime.secondstime() + AUTO_SHOW_TEMP;
 
                               ^~~~~~~~~~~
 
                               setunixtime
 
main.cpp:581:31: error: 'class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
         ModeTimeout = CurTime.secondstime() + AUTO_SHOW_DATE;
 
                               ^~~~~~~~~~~
 
                               setunixtime
 
main.cpp:637:48: error: 'class DateTime' has no member named 'dayOfTheWeek'; did you mean 'dayOfWeek'?
 
       uint8_t wd = Alarm::DayOfTheWeek(CurTime.dayOfTheWeek());
 
                                                ^~~~~~~~~~~~
 
                                                dayOfWeek
 
main.cpp:650:32: error: 'class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
          ModeTimeout = CurTime.secondstime() + KEY_TIMEOUT_PERIOD;
 
                                ^~~~~~~~~~~
 
                                setunixtime
 
In file included from sketch\oclock.h:35:0,
 
                 from sketch\oclock.cpp:45:
 
sketch\alarm.h: In member function 'bool Alarm::CheckTime(const DateTime&)':
 
alarm.h:132:41: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
         if(m_Snooze + ALARM_TIME > time.secondstime())
 
                                         ^~~~~~~~~~~
 
                                         setunixtime
 
alarm.h:139:30: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
     else if(m_Snooze == time.secondstime())
 
                              ^~~~~~~~~~~
 
                              setunixtime
 
alarm.h:148:35: error: 'const class DateTime' has no member named 'dayOfTheWeek'; did you mean 'dayOfWeek'?
 
       (m_Days & DayOfTheWeek(time.dayOfTheWeek()))
 
                                   ^~~~~~~~~~~~
 
                                   dayOfWeek
 
alarm.h:158:23: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
       m_Snooze = time.secondstime();
 
                       ^~~~~~~~~~~
 
                       setunixtime
 
sketch\alarm.h: In member function 'void Alarm::Reset(const DateTime*)':
 
alarm.h:178:24: error: 'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
       m_Snooze = time->secondstime() + SNOOZE_TIME;
 
                        ^~~~~~~~~~~
 
                        setunixtime
 
sketch\oclock.cpp: At global scope:
 
oclock.cpp:75:1: error: 'RTC_DS3231' does not name a type; did you mean 'DS3231'?
 
 RTC_DS3231 rtc; // I2C
 
 ^~~~~~~~~~
 
 DS3231
 
sketch\oclock.cpp: In function 'int GetCurTime()':
 
oclock.cpp:120:14: error: 'rtc' was not declared in this scope
 
   CurTime  = rtc.now();
 
              ^~~
 
sketch\oclock.cpp:120:14: note: suggested alternative: 'getc'
 
   CurTime  = rtc.now();
 
              ^~~
 
              getc
 
sketch\oclock.cpp: In function 'void SetTime(const DateTime&)':
 
oclock.cpp:150:3: error: 'rtc' was not declared in this scope
 
   rtc.adjust(dt);
 
   ^~~
 
sketch\oclock.cpp: In function 'void setup()':
 
oclock.cpp:257:7: error: 'rtc' was not declared in this scope
 
   if(!rtc.begin())
 
       ^~~
 
sketch\oclock.cpp:257:7: note: suggested alternative: 'getc'
 
   if(!rtc.begin())
 
       ^~~
 
       getc
 
oclock.cpp:263:6: error: 'rtc' was not declared in this scope
 
   if(rtc.lostPower())
 
      ^~~
 
sketch\oclock.cpp:263:6: note: suggested alternative: 'getc'
 
   if(rtc.lostPower())
 
      ^~~
 
      getc
 
Boli nájdené násobné knižnice pre "RTClib.h"
 
Použité: C:\Users\Peter\Documents\Arduino\libraries\RTClib
 
Nepoužité: C:\Users\Peter\Documents\Arduino\libraries\RTCLib_by_NeiroN
 
exit status 1
 
'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?
 
 
 
Táto správa by mala mať viac informácií v
"Zobrazenie podrobného výstupu pri kompilácii"
podľa zapnutá voľba v Súbor -> Nastavenia.
 
I have a problem with this.
 
YRA
Offline
Зарегистрирован: 10.01.2015

У меня на 10-ке вообще не работает среда IDE 1.8.12, ругается на приложение Jawa, что не подставляю, но 10-ка на буче варез. На 7-ке, на второй старенькой  SONY буче, та же среда- все влет, а требуется, бибилотеки включать.

YRA
Offline
Зарегистрирован: 10.01.2015

У меня на 10-ке вообще не работает среда IDE 1.8.12, ругается на приложение Jawa, что не подставляю, но 10-ка на буче варез. На 7-ке, на второй старенькой  SONY буче, та же среда- все влет, а требуется, бибилотеки включать.

vikonix
Offline
Зарегистрирован: 19.05.2019

>>'const class DateTime' has no member named 'secondstime'; did you mean 'setunixtime'?

You must to install RTClib 1.8.0 by Adafruit !!!

By default in compilation is used default time library from Arduino IDE.

So go to Sketch->Library->LibraryManager and input RTCLib. Then select "Install".

vikonix
Offline
Зарегистрирован: 19.05.2019

YRA пишет:

У меня на 10-ке вообще не работает среда IDE 1.8.12, ругается на приложение Jawa, что не подставляю, но 10-ка на буче варез. На 7-ке, на второй старенькой  SONY буче, та же среда- все влет, а требуется, бибилотеки включать.

У меня все стоит на 10, все работает без проблем.
На семерке тоже все работало.
Скорее всего нужно перустановить Jawa.

peterzonda
Offline
Зарегистрирован: 25.11.2016

I have RTClib 1.8.0 from Adafruit installed.

peterzonda
Offline
Зарегистрирован: 25.11.2016

I reinstalled Java here as well.

peterzonda
Offline
Зарегистрирован: 25.11.2016

I can't. It's still writing the mistake

vikonix
Offline
Зарегистрирован: 19.05.2019

peterzonda пишет:

I can't. It's still writing the mistake

1. Do you have any modification in source code?

2. Put here content of your subdirectory:

C:\Documents and Settings\_USER_NAME_\Local Settings\Arduino15\staging\libraries
 
peterzonda
Offline
Зарегистрирован: 25.11.2016

how do i insert a photo?