Привет от команды uMove! Как-то раз увидели в интернете такое изображение часов. Текущее время на них задается словами: пять минут третьего, без четверти час, половина пятого и тому подобное с шагом в 5 минут.
![](https://habrastorage.org/files/4fc/7cc/fab/4fc7ccfab0234268bcc201e72dfa5da9.jpg)
Недавно мы сделали такие!
Первым делом мы сделали 3D модель. В качестве несущей основы выбрали доступную в избытке фанеру толщиной 4 мм, на ней разместили трехцветную диодную ленту, причем каждый диод управляется отдельно по SPI. Например, цвет 10-го диода задается примерно так: «Привет первый, скажи десятому, чтобы он загорелся сейчас таким-то цветом». Первый передает второму, второй третьему и так далее.
Выбор форм-фактора всего устройства был выбран исходя из существующего шага диодов. В данном случае лента имеет 60 чипов в метре длины. Конечный габаритный размер стороны квадратного девайса получился 264,4 мм.
![](https://habrastorage.org/files/ebf/c34/df1/ebfc34df12664c59a15930bd4b36ac1f.jpg)
Вторым слоем мы организовали разделители между буквами. Это требовалось для предотвращения засветки неактивных букв активными. Во втором слое расположили отверстие для вывода шнура питания.
![](https://habrastorage.org/files/ac4/432/46d/ac443246d41b4cf2b55b0c30377ee362.jpg)
Вся матрица диодов — одномерный массив, расположенный змейкой на подложке.
Функция пересчета из декартовой системы координат в «змейку»:
Кусочки ленты соединены 3 проводами последовательно: Питание, Земля и Сигнал. Началась рутинная пайка. Вот что получилось:
![](https://habrastorage.org/files/0e4/4de/915/0e44de9158e04ee08ee18207c26c2729.jpg)
Проверка паяных соединений не заставила разочароваться, все заработало с первого раза, даже непривычно как-то.
Набросав таблицу с буквами, мы поигрались с размером и типом шрифта, оформили чертеж для лазерного станка и принялись изучать материал и цвет. Выбор пал на черный глянцевый пластик. Получился очень стильный корпус. Язык выбрали немецкий… не знаем почему.
![](https://habrastorage.org/files/0b8/db2/ff2/0b8db2ff2a8847b292a4e7f14d26ed54.jpg)
Основа часов — наш любимый Spark. Это привычный STM32 микроконтроллер с доступом в интернет через Wi-Fi. Эта штука сама узнает текущее время, в часах нет ни единой кнопки! Новый логин и пароль сети можно задать с телефона.
![](https://habrastorage.org/files/4c5/95a/da9/4c595ada9b2144d5bfde3ee2a1585765.jpg)
Все детали мы изготовили и собрали в ЦМИТ Академии.
Посмотрим, что получилось:
Помните Brick Game?
Наверное, самая простая игра, которую можно написать.
Доступ к часам очень простой. В прошивке чипа лежит функция, к которой можно обратиться через облако. Пример с сайта:
Чтобы к ней обратиться, необходимо выполнить POST-запрос в облако, например, из командной строки:
Управлять ползунком можно через приложение. Мы его написали на HTML+JS с использованием Apache Cordova
Приложение на телефоне выглядит потрясающе:
![](https://habrastorage.org/files/2df/b4e/a33/2dfb4ea333cf49f184110f3f933f7d36.png)
![](https://habrastorage.org/files/4fc/7cc/fab/4fc7ccfab0234268bcc201e72dfa5da9.jpg)
Недавно мы сделали такие!
Как всё происходило
Первым делом мы сделали 3D модель. В качестве несущей основы выбрали доступную в избытке фанеру толщиной 4 мм, на ней разместили трехцветную диодную ленту, причем каждый диод управляется отдельно по SPI. Например, цвет 10-го диода задается примерно так: «Привет первый, скажи десятому, чтобы он загорелся сейчас таким-то цветом». Первый передает второму, второй третьему и так далее.
Выбор форм-фактора всего устройства был выбран исходя из существующего шага диодов. В данном случае лента имеет 60 чипов в метре длины. Конечный габаритный размер стороны квадратного девайса получился 264,4 мм.
![](https://habrastorage.org/files/ebf/c34/df1/ebfc34df12664c59a15930bd4b36ac1f.jpg)
Вторым слоем мы организовали разделители между буквами. Это требовалось для предотвращения засветки неактивных букв активными. Во втором слое расположили отверстие для вывода шнура питания.
![](https://habrastorage.org/files/ac4/432/46d/ac443246d41b4cf2b55b0c30377ee362.jpg)
Вся матрица диодов — одномерный массив, расположенный змейкой на подложке.
Функция пересчета из декартовой системы координат в «змейку»:
int getStripPosition(int row, int col)
{
if(col % 2 == 1)
{
return col * ROWS + row;
}else{
return (1 + col) * ROWS - (1 + row);
}
}
Кусочки ленты соединены 3 проводами последовательно: Питание, Земля и Сигнал. Началась рутинная пайка. Вот что получилось:
![](https://habrastorage.org/files/0e4/4de/915/0e44de9158e04ee08ee18207c26c2729.jpg)
Проверка паяных соединений не заставила разочароваться, все заработало с первого раза, даже непривычно как-то.
Внешний вид
Набросав таблицу с буквами, мы поигрались с размером и типом шрифта, оформили чертеж для лазерного станка и принялись изучать материал и цвет. Выбор пал на черный глянцевый пластик. Получился очень стильный корпус. Язык выбрали немецкий… не знаем почему.
![](https://habrastorage.org/files/0b8/db2/ff2/0b8db2ff2a8847b292a4e7f14d26ed54.jpg)
Минутка немецкого:![](https://habrastorage.org/files/585/0a4/cb9/5850a4cb990744aea078cb4c105b2c7c.jpeg)
![](https://habrastorage.org/files/585/0a4/cb9/5850a4cb990744aea078cb4c105b2c7c.jpeg)
Электроника
Основа часов — наш любимый Spark. Это привычный STM32 микроконтроллер с доступом в интернет через Wi-Fi. Эта штука сама узнает текущее время, в часах нет ни единой кнопки! Новый логин и пароль сети можно задать с телефона.
![](https://habrastorage.org/files/4c5/95a/da9/4c595ada9b2144d5bfde3ee2a1585765.jpg)
Все детали мы изготовили и собрали в ЦМИТ Академии.
Но это еще не всё
Посмотрим, что получилось:
- у нас есть матрица 10х11 пикселей
- у нас есть выход в интернет
- у нас есть облако с настроенным API
Помните Brick Game?
Арканоид
Наверное, самая простая игра, которую можно написать.
Доступ к часам очень простой. В прошивке чипа лежит функция, к которой можно обратиться через облако. Пример с сайта:
int brewCoffee(String command);
void setup()
{
Particle.function("brew", brewCoffee);
}
void loop()
{
// this loops forever
}
// this function automagically gets called upon a matching POST request
int brewCoffee(String command)
{
if(command == "coffee")
{
// some example functions you might have
return 1;
}
else return -1;
}
Чтобы к ней обратиться, необходимо выполнить POST-запрос в облако, например, из командной строки:
curl https://api.particle.io/v1/devices/{DEVICE_ID}/{FUNCTION_NAME} -d access_token={TOKEN} -d "args={ARGUMENTS}"
Управлять ползунком можно через приложение. Мы его написали на HTML+JS с использованием Apache Cordova
<body style="margin: 0; padding: 0;">
<script language="javascript">
function go(action) {
var xhr = new XMLHttpRequest();
var body = 'access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx&args='+action;
xhr.open("POST", 'https://api.particle.io/v1/devices/53ff6e12345678900987654321/shift', true)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send(body);
};
</script>
<button class="button" style="width: 40%;" onclick="go('left')"><</button>
<button class="button" style="width: 20%; left: 40%" onclick="go('play')">!</button>
<button class="button" style="width: 40%; left: 60%" onclick="go('right')">></button>
</body>
Приложение на телефоне выглядит потрясающе:
![](https://habrastorage.org/files/2df/b4e/a33/2dfb4ea333cf49f184110f3f933f7d36.png)
IronHead
На русском смотрелось бы эффектнее
miron36357
В русском есть одна большая проблема в лице склонений…
kazakoff
На русском языке тоже есть, но чуть проще.
Часы на русском
kazakoff
На русском языке тоже есть, но чуть проще.
don_ikar
Хм, я понимаю, что в этом проекте совсем другой принцип реализации, представления информации и т.п., но, например, Вербариус совсем не страдает от наличия склонений и других особенностей русского (и не только) языка. Более того, одно и тоже время может вербализовать каждый раз другими словами («одиннадцать часов, сорок пять минут», «без пятнадцати двенадцать» и т.п.).
А вообще, ребята — молодцы, конечно. Спаянное и запрограммированное своими руками всегда вызывает уважение.
mcleod095
Хоть и сделали перегородки, но все равно видно что очень сильно засвечены соседние элементы. Наверное надо было сделать как на оригинальной фотографии, матовое белое стекло поставить в каждый квадратик, что бы свечение было видно только при зажженном светодиоде.
u010602
При такой яркости думаю даже нужно делать герметичный кубик под каждую букву, с одной прозрачной гранью.
Но на мой лично вкус нужно яркость регулировать, ночью или вечером такая яркость как минимум избыточна, а то и не комфортна.
А под прямыми солнечными лучами слабого белого свечения не будет видно.
HarryMorgan
Лицевой пластмассовый слой довольно сильно изогнут, отсюда и засветка соседних пикселей. По-хорошему, его нужно проклеить с сеткой. В следующих проектах такие нюансы будем учитывать
alexws54tk
Идея таких физических часов порадовала. Вдохновился. Возможно сделаю что-то подобное на кухню.
Маленько позанудствую.
Единственное что «зацепило» в видео, это как отскакивание „шарика“ от „площадки“ происходит со сдвигом вверх на «пиксель».
SharQ
Не потому ли немецкий, что в случае с русским нужно делать матрицу больше и проектировать новое расположение слов, а не брать готовое? Одиннадцать ноль пять это вам не funf nah elf.
HarryMorgan
Хм, интересная идея с использованием «ноль пять», но все-таки привычнее «пять минут одиннадцатаго».
vlivyur
Двенадцатого.
Mazumedroid
да, надо бутерброд было немного усложнить, рассеивающий слой из пэт добавить или молочного акрила, к нему заодно и межбуквенные элементы приклеить. а так конечно супер
HarryMorgan
Спасибо! С опытом будем совершенствовать качество наших устройств
northernbear
Класс. Но как быть если нет wifi, былобы неплохо
прикрутить чясы реального времени
Tolstyj_OD
Я бы слой с буквами делал из прозрачного материала (стекло, акрил), но не резал бы его, а с внутренней стороны поклеил бы пленку с вырезанными в ней символами. Профит в том, что буквы BORDPQ можно сделать нормальными, а не с провалами в центре.
HarryMorgan
Да, не плохая мысль, но плоттера в мастерской нет, и клеить внутренние элементы пришлось бы руками. Мы стараемся исключать ручной труд, особенно на внешних элементах устройств.
Tolstyj_OD
Дело хозяйское. Я так, мимопроходил дизигнер.
Rasalom
Но самое интересное(и сложное) — перевод врмени в текст вы оставили за кадром :(
Tolstyj_OD
А что там сложного? Набор условий. Это же таки да не русский, там падежей нет.
Грубо «если %минуты_число=5 то %минуты строка=funf». Ну и потом из нескольких строковых переменных собрать одну до кучи.
С русским было бы интереснее, но не намного.