Привет от команды uMove! Как-то раз увидели в интернете такое изображение часов. Текущее время на них задается словами: пять минут третьего, без четверти час, половина пятого и тому подобное с шагом в 5 минут.



Недавно мы сделали такие!

Как всё происходило


Первым делом мы сделали 3D модель. В качестве несущей основы выбрали доступную в избытке фанеру толщиной 4 мм, на ней разместили трехцветную диодную ленту, причем каждый диод управляется отдельно по SPI. Например, цвет 10-го диода задается примерно так: «Привет первый, скажи десятому, чтобы он загорелся сейчас таким-то цветом». Первый передает второму, второй третьему и так далее.

Выбор форм-фактора всего устройства был выбран исходя из существующего шага диодов. В данном случае лента имеет 60 чипов в метре длины. Конечный габаритный размер стороны квадратного девайса получился 264,4 мм.



Вторым слоем мы организовали разделители между буквами. Это требовалось для предотвращения засветки неактивных букв активными. Во втором слое расположили отверстие для вывода шнура питания.



Вся матрица диодов — одномерный массив, расположенный змейкой на подложке.
Функция пересчета из декартовой системы координат в «змейку»:

int getStripPosition(int row, int col)
{
    if(col % 2 == 1)
    {
        return col * ROWS + row;
    }else{
        return (1 + col) * ROWS - (1 + row);
    }
}

Кусочки ленты соединены 3 проводами последовательно: Питание, Земля и Сигнал. Началась рутинная пайка. Вот что получилось:



Проверка паяных соединений не заставила разочароваться, все заработало с первого раза, даже непривычно как-то.

Внешний вид


Набросав таблицу с буквами, мы поигрались с размером и типом шрифта, оформили чертеж для лазерного станка и принялись изучать материал и цвет. Выбор пал на черный глянцевый пластик. Получился очень стильный корпус. Язык выбрали немецкий… не знаем почему.



Минутка немецкого:


Электроника


Основа часов — наш любимый Spark. Это привычный STM32 микроконтроллер с доступом в интернет через Wi-Fi. Эта штука сама узнает текущее время, в часах нет ни единой кнопки! Новый логин и пароль сети можно задать с телефона.



Все детали мы изготовили и собрали в ЦМИТ Академии.

Но это еще не всё


Посмотрим, что получилось:
  1. у нас есть матрица 10х11 пикселей
  2. у нас есть выход в интернет
  3. у нас есть облако с настроенным 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>

Приложение на телефоне выглядит потрясающе:



Демонстрация




Надеемся, мы вдохновили вас новыми идеями крутых проектов!

Комментарии (20)


  1. IronHead
    27.01.2016 17:50

    На русском смотрелось бы эффектнее


    1. miron36357
      27.01.2016 19:14
      +2

      В русском есть одна большая проблема в лице склонений…


      1. kazakoff
        27.01.2016 21:24

        На русском языке тоже есть, но чуть проще.
        Часы на русском


      1. kazakoff
        27.01.2016 21:41
        +1

        На русском языке тоже есть, но чуть проще.

        Часы на русском
        image


      1. don_ikar
        28.01.2016 03:17
        +1

        Хм, я понимаю, что в этом проекте совсем другой принцип реализации, представления информации и т.п., но, например, Вербариус совсем не страдает от наличия склонений и других особенностей русского (и не только) языка. Более того, одно и тоже время может вербализовать каждый раз другими словами («одиннадцать часов, сорок пять минут», «без пятнадцати двенадцать» и т.п.).

        А вообще, ребята — молодцы, конечно. Спаянное и запрограммированное своими руками всегда вызывает уважение.


  1. mcleod095
    27.01.2016 17:57
    +1

    Хоть и сделали перегородки, но все равно видно что очень сильно засвечены соседние элементы. Наверное надо было сделать как на оригинальной фотографии, матовое белое стекло поставить в каждый квадратик, что бы свечение было видно только при зажженном светодиоде.


    1. u010602
      27.01.2016 19:15
      +1

      При такой яркости думаю даже нужно делать герметичный кубик под каждую букву, с одной прозрачной гранью.
      Но на мой лично вкус нужно яркость регулировать, ночью или вечером такая яркость как минимум избыточна, а то и не комфортна.
      А под прямыми солнечными лучами слабого белого свечения не будет видно.


      1. HarryMorgan
        27.01.2016 19:23

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


  1. alexws54tk
    27.01.2016 19:16
    +1

    Идея таких физических часов порадовала. Вдохновился. Возможно сделаю что-то подобное на кухню.

    Маленько позанудствую.
    Единственное что «зацепило» в видео, это как отскакивание „шарика“ от „площадки“ происходит со сдвигом вверх на «пиксель».


  1. SharQ
    27.01.2016 19:16
    +1

    Не потому ли немецкий, что в случае с русским нужно делать матрицу больше и проектировать новое расположение слов, а не брать готовое? Одиннадцать ноль пять это вам не funf nah elf.


    1. HarryMorgan
      27.01.2016 19:20

      Хм, интересная идея с использованием «ноль пять», но все-таки привычнее «пять минут одиннадцатаго».


      1. vlivyur
        28.01.2016 12:42

        Двенадцатого.


  1. Mazumedroid
    27.01.2016 19:16
    +1

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


    1. HarryMorgan
      27.01.2016 19:24

      Спасибо! С опытом будем совершенствовать качество наших устройств


  1. northernbear
    27.01.2016 19:16
    +1

    Класс. Но как быть если нет wifi, былобы неплохо
    прикрутить чясы реального времени


  1. Tolstyj_OD
    27.01.2016 19:55
    +3

    Я бы слой с буквами делал из прозрачного материала (стекло, акрил), но не резал бы его, а с внутренней стороны поклеил бы пленку с вырезанными в ней символами. Профит в том, что буквы BORDPQ можно сделать нормальными, а не с провалами в центре.


    1. HarryMorgan
      27.01.2016 21:31
      -1

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


      1. Tolstyj_OD
        28.01.2016 15:28

        Дело хозяйское. Я так, мимопроходил дизигнер.


  1. Rasalom
    28.01.2016 15:19

    Но самое интересное(и сложное) — перевод врмени в текст вы оставили за кадром :(


    1. Tolstyj_OD
      28.01.2016 15:32

      А что там сложного? Набор условий. Это же таки да не русский, там падежей нет.
      Грубо «если %минуты_число=5 то %минуты строка=funf». Ну и потом из нескольких строковых переменных собрать одну до кучи.
      С русским было бы интереснее, но не намного.