Как сделать часы в c

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Одно из направлений нашего ресурса – кастомайзинг (от английского customize — декорирование и перекройка уже готовых вещей под индивидуальный вкус клиента) и создание часов на заказ с нуля, что как бы это не было удивительно, не так уж и дорого, и простенькие часы среднего класса могут обойтись значительно дороже, чем шедевр, сделанный на заказ!

И этот опыт дает возможность рассказать о плюсах и минусов подобных экспериментов и что точно не стоит делать, а на что стоит обратить внимание.

И так: история создания наружных часов бренда A.Shvets.

На момент получения звонка с запросом собрать два образца (мужские и женские часы) мы были обеспечены заказами на 1.5 года вперед. Брать новые заказы нереально, но и отказывать сразу, не выслушав задачу не хорошо. А выслушав ее стало очень и очень интересно.

Что требуется заказчику:

И именно последний пункт очень подкупил. Дело в том, что собрать партию в 100 часов невозможно, для фабрики такая партия очень маленькая и не выгодная. Минимальный выпуск идет от 300-500 моделей. Но! У нас такая возможность есть. Мы работаем с мини брендом, выпускающим в год по 2-3 коллекции лимитированных часов и обсуждали с ними возможность создать для нас лимитированную партию в 100 часов включив их в свой общий выпуск на фабрике.

У нас уже были лимитированные серии от Lum-tec, где на их производственной базе мы собирали часы для России: Predator, часы посвящённые кинофраншизе Хищник и Фантом (часы в черном).

Но до выпуска партии в 100 часов со своим логотипом мы пока не добрались и попробовать этапы производства такой серии было очень заманчиво. Поэтому, понимая, что взять заказ под фирму с договорами сейчас не реально, я решился все сделать своими силами в частном порядке. Повторюсь, это был не вопрос бизнеса, а вопрос опыта в производстве часов на Китайском рынке по образцу, собранному нами в России. Тем более это касалось только образцов, выпуск партии часов в любом случае пошел по договорам и юр. лицам, но для начала нам нужен образец, а это я могу привести и лично сам.

Мы оговорили условия, и я столкнулся с первой, огромной и необъяснимой проблемой заказчика: полнейшее непонимание для кого он делает часы! Является это проблемой для меня в изготовлении образцов? Конечно нет! Обязан я обговорить это с заказчиком? Не знаю! Но очень осторожно я попытался это сделать, результат был нулевой.

  • Первое и самое важно в создание чего угодно, что вы хотите продать, это определить потребителя! Для кого вы это делаете, нужно ли ему это и может и захочет ли он за это платить!

Поняв, что потребитель нам не ясен, постарался понять, как и где часы будут продаваться. Выяснилось, что и на этот вопрос ответа нет (где-то, как-то через какие-то свои ресурсы).

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

Помогите плз кто-нибудь, надо сделать аналоговые часы на С++ (класс и методы), причем при передвижении стрелок надо, чтобы перерисовывались не все часы, а только стрелки. Думаю, что кто-нибудь (если не многие ) это уже делал, хелп плз! Да, надо чтобы ЭТО откомпилилось в dev c++, почти забыл.
Спасибо заранее!

Пример заимствован из VC&MFS Мешкова и Тихомирова.
Весь класс приводить не буду - большой. функция которая рисует стрелки выглядит примерно так:

Соответственно должна быть функция типа редроу - которая собственно и будет вызывать вышеприведенную. Все остальное дописать в принципе не сложно и самому. Если чего напутал в массиве там или с координатами звини и исправь сам. Писал по памяти - мог ошибится.

Содержание:

Шаг 1

Откроем Visual Studio и создадим приложение Windows Forms.

Шаг 2

Добавим в форму два элемента управления Button и назовем их Start и Stop , хотя имена вы можете написать любые, по своему усмотрению. Окончательная форма выглядит следующим образом:

Шаг 3

Теперь давайте добавим в нашу программу элемент управления Timer . Перетащим его из Visual Studio Toolbox в форму. С помощью такой нехитрой манипуляции в нашей форме появится элемент – timer1 .

Шаг 4

1 секунда = 1000 миллисекунд.

Шаг 5

Теперь нужно нажать кнопку Events и добавить обработчик событий Timer , дважды щелкнув по свойству Tick . Событие таймера здесь — timer1_Tick (как показано на изображении ниже).

Шаг 6

Теперь добавим классы FileStream и StreamWriter в начало нашей программы. Они используются для создания нового текстового файла и реализации записи данных в него. Все классы определены в библиотеке базовых классов System.IO , поэтому обязательно импортируйте System.IO в начале программы.

Мы видим из предыдущего участка кода, что класс FileStream создает файл mcb.txt на диске C , а StreamWriter определен для записи в него данных. Теперь напишем алгоритм реализации записи нескольких строк в наш файл:

Ту же процедуру проделываем и с кнопкой STOP , только в этом случае свойству Enabled устанавливаем значение false для прекращения выполнения нашего события.

Остался последний шаг — создать событие timer1_Tick , записывающее текущую дату в текстовый файл:

Шаг 7

Мы только что разобрали, как использовать таймер в начале разработки приложения с помощью визуального конструктора Visual Studio. Но иногда вам может потребоваться программно использовать таймер во время выполнения этого приложения.

Например: создадим такой таймер, установим ему необходимые свойства, а также добавим обработчик событий, интервал сделаем равным 2 секундам:

Допустим, мы хотим отобразить текст в элементе управления ListBox . Следующий код добавляет текст и обновляет ListBox каждые 2 секунды:

Класс Timer также можно использовать, если вы хотите вызывать событие через заданный промежуток времени:

Событие в предыдущем примере будет запускаться каждые 5 секунд.

Резюме

Закрепить приведенный материал можно на базе таких видео:

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

Фото готового проекта

К сожалению, камера искажает цвет. На самом деле цвета равномерные и контрастные (цвет может быть любой)

К сожалению, камера искажает цвет. На самом деле цвета равномерные и контрастные (цвет может быть любой)

Я использовал размер цифры примерно 280х205 мм (почти лист А4), общий размер часов - 300х800 мм.

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

Что такое адресная светодиодная лента

Обычная RGB-светодиодная лента имеет 4 контакта: общий "+" и 3 "-", соответственно для каждого из основных цветов - красного, зелёного и синего.

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

Лента на адресных диодах устроена иначе: на ней имеются контроллеры, которые позволяют управлять группой диодов (либо каждым диодом) по отдельности, позволяя независимо включать или выключать их, заставляя светиться любым цветом с любой яркостью. Лента имеет 3 контакта: "+", "-" и контакт управления, который подключается к микроконтроллеру.

На момент создания часов было 2 типа ленты, сейчас их стало несколько больше:

WS2811. Самая дешёвая из всех лент (считалась надёжнее "старшей" WS2812b). Позволяет управлять группами по 3 диода.

WS2812b. Использовалась мной (считается ненадёжной, хотя за время использования часов проблем выявлено не было). Позволяет управлять каждый диодом в отдельности. Из минусов - при выходе из строя 1 диода - дальнейшие работать не будут.

WS2813, WS2815, WS2815 - обновление WS2812, имеют "резервный" контакт передачи данных, увеличенная частота обновления. При выходе из строя одного диода остальной отрезок ленты сохраняет работоспособность. Минусы - цена.

Итак, нам понадобится:

Теперь подробнее об использованном оборудовании:

Микроконтроллер

Arduino nano с распаянными

Arduino nano с распаянными "ногами"

Я использовал Arduino Nano (на базе ATmega328) - самая доступная плата как по цене, так и по простоте освоения новичку. Продаётся как с распаянными "ногами", так и без них. Лучше брать сразу с "ногами", так как я рекомендую использовать шилд, который очень сильно упрощает сборку, повышая качество и модульность.

Модуль часов реального времени

Модуль часов реального времени DS3231

Модуль часов реального времени DS3231

Настоятельно рекомендуется брать модель DS3231, так как у неё имеется встроенный датчик температуры, который нивелирует влияние перепадов температуры окружающей среды на показания часов.
Модули DS1302 и DS1307 к приобретению не рекомендуются, тем более что разница в цене незначительна.
Модуль выпускается в двух вариантах: полноразмерном (внизу) и компактном (вверху). Я брал полноразмерную версию, так как с ней удобнее работать.

Светодиодная лента

Адресная светодиодная лента

Адресная светодиодная лента

Датчик температуры

Датчик температуры DHT22 на плате

Датчик температуры DHT22 на плате

Использование датчика температуры опционально (в случае его отсутствия - необходимо удалить/закомментировать соответствующие строки в коде).
Я использовал модель DHT22 (кстати, измеряет также и влажность) - он дороже, чем его "младший брат" DHT11, однако, как пишут пользователи, младшая версия выдаёт значения, основанные на только ей известном алгоритме.
Рекомендуется брать сразу распаянный на плате (как на картинке слева).

Датчик освещённости

Датчик освещённости BH1750

Датчик освещённости BH1750

Я использовал BH1750 по двум причинам:
1. Он позволяет передавать числовое значение освещённости (в отличие от более простых фоторезисторов, которые имеют только регулируемое значение порога "светло/темно").
2. Согласно тестам (статьи в сети), он адекватно реагирует на лампы дневного света, так как имеет "на борту" несколько разных сенсоров (некоторые датчики не улавливают свет от люминесцентных ламп).

Уточнение по датчику

Как подсказал ivanii, "BH1750 - это цифровой 16-тибитный датчик с интерфейсом I2C, со спектрокомпенсацией и фильтром пульсаций", за что ему отдельная благодарность.


Фоторезистрор, распаянный на плате. Имеет три ноги: две питания и цифровой выход, и не позволяет плавно менять яркость ленты (выдаёт только 2 значения: "1" или "0").
Винт регулировки позволяет настроить порог чувствительности.
P.S. Существуют такие фоторезисторы на плате с 4 ногами (помимо цифрового добавлен аналоговый выход), однако используемый датчик (BH1750) предпочтительнее.

Модуль bluetooth

Модуль bluetooth

Модуль bluetooth

Оригинальный проект для корректировки времени использовал кнопки, однако, на мой взгляд, bluetooth даёт гораздо больше возможностей (например, просмотр отладочной информации).
Кроме того, у меня часы висят на высоте примерно 3,5 метров, так что корректировать их кнопками - то ещё удовольствие.
Модель - HC-05 или HC-06, сразу на плате с "ногами".

Блок питания

Я использую БП на 10 ватт (5V/2A), чего вполне хватает для моих часов (172 диода), особенно с учётом того, что они редко светят даже на половину своей яркости.

Какой ток потребляет лента?

Один цвет одного диода при максимальной яркости потребляет примерно 12 мА. В одном светодиоде три цвета, то есть если метр нашей ленты с плотностью 60 диод/метр будет светить белым светом максимальной яркости, получаем (12*3*60) примерно 2.1A.

Однако нужно учитывать, что в данном проекте нет смысла запускать свечение ленты белым цветом; яркости у ленты так же с запасом.

Кстати: WS2811 питается от 12V, WS2812b - от 5V.

Плата расширения (шилд) для Arduino Nano

Плата расширения (шилд) для Arduino Nano

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

Провода и коннекторы

Провода

Провода "мама-папа"

Для соединения компонентов удобно использовать такие провода-джамеры (есть с более качественными концевиками). Могут быть различные варианты ("мама-мама", "папа-папа", "папа-мама").
Под блок разъём блока питания подбирается соответствующий разъём.

Материалы корпуса и рассеивателя

Для изготовления корпуса я использовал кусок экструзионного пенополистирола ("техноплекс") - в отличие от всем известного "пеноплекса", он серый, то есть не влияет итоговый оттенок цифр и кабель-канал для рамки корпуса.

Для рассеивателя многие используют бумагу, что не очень практично и сильно ухудшает качество "изображения" цифр. Я использовал специальный светотехнический поликарбонат молочного цвета (opal). Он используется при изготовлении рекламных световых конструкций - можно поискать объявления в интернете или узнать у фирм, которые занимаются изготовлением рекламных конструкций. У меня лист толщиной примерно 4 мм, однако если бы у меня был выбор, то я бы рекомендовал взять более тонкий (толстый сильно "мылит" края цифр).

Поликарбонат бывает разный

Как я понял, поликарбонат бывает обычный, тоже белого (молочного цвета).

Предпочтительнее использовать именно "opal", так как он специально сделан для рассеивания света и имеет две разные стороны: одна направлена к источнику света, другая - наружу, к зрителю.

Так как материала получается много, к концу написания этой части я подумал, что будет правильным разделить статью на части.

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

Читайте также: