Проекционные часы. ( с пультом ду)

olegoriy
Offline
Зарегистрирован: 08.02.2015

Всем привет. Хочу представить вам мой проект Проекционные часы.

Идея пришла достаточно давно до знакомства с Arduino. Когда то в детстве я увидел огромные часы из обычных 100 ваттных лампочек, которые были собраны в четыре восьмерки и о чудо показывали время! То что обычные лампочки такое могут, меня в то время очень поразило и хотелось повторить такое чудо.

Служа в армии я пытался сделать что то подобное на реле, но успехов особых не достиг.

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

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

Ну хватит пред историй. Сразу видео как все работает, а потом если кому интересно, фото как я это все делал.

http://www.youtube.com/watch?v=GrwoI-a7JfI

Вот еще несколько фото примеров работы днем при солнечном свете и в темноте.

на последней фото чуть смазано. Фотик отказывался фокусироваться на цифры вблизи.



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

Были приобретены макетные платы, четыре сдвиговых регистра, 120 сопротивлений 220 Ом. Светодиодов, как я уже писал у меня великое множество(остались после какой-то шабашки).

С распайкой регистров проблем не возникло. Может получилось чуть не аккуратно но я утешал себя тем что все будет в коробке и не кто этого не увидит :)

С матрицами получилось все сложнее. Сначала был спаян первый вариант:

Но плата стала занимать много места и все было переделано.

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

Ну в целом все получилось.

После долгих и безрезультатных хождений по супермаркетам и хозтоварам в поисках подходящего корпуса (в порыве безумия я даже поглядывал на xbox 360 думая о том что если вытащить все запчасти то коробочка мне отлично подойдет) было решено сделать корпус самому из оргстекла.

За оргстекло отдельное спасибо коллеги Роману.(оказалось что оргстекло большая редкость и купить его бесполезно).

Нужно было решить чем питать всю эту конструкцию. Если arduino и регистры не очень прихотливы по питанию то светодиодам и аккумулятору для работы в буферном режиме требовалось уделить внимание.

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

ну и собственно все было собрано в корпус и закреплено

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

и повесил на стену.

А да конечно код.

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

#define LED_PIN A1                                              // Светодиод секунд.
#define latch_Pin  9
#define CLOCK_PIN  13
#define data_Pin  11
#include <IRremote.h>
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
void dump(decode_results *results) {
int count = results->rawlen;
}
int x = 0;                                                      // Вторая цифра минут.
int z = 0;                                                      // Первая цифра часов.
int a = 0;                                                      // Вторая цифра часов.
int p = 1;                                                      // Переменная режима работы.
int i = 1;                                                      // Переменная точек секунд.
byte segments[11] = {
  0b01110111, 0b00100100, 0b01011110, 0b01101110, 0b00101101,  // Масив цифр.
  0b01101011, 0b01111011, 0b00100110, 0b01111111, 0b01101111,
  0b00000000
};
void setup() {
  pinMode(latch_Pin, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(data_Pin, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  irrecv.enableIRIn();
}
void loop() {
    for (int y = 0; y < 10; y++) {                            // Цикл первой цифры минут.
    for (int b = 0; b < 60; b++) {                            // Цикл секунд.
    if (p == 1){                                              // Режим работы.
    digitalWrite(latch_Pin, LOW);                              // Открываем регистр.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[y]);      // Загружаем байты первой цифры минут.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[x]);      // Загружаем байты второй цифры минут.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[a]);      // Загружаем байты второй цифры часов.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[z]);      // Загружаем байты первой цифры часов.
    digitalWrite(latch_Pin, HIGH); }                          // Закрываем регистр.
    if (p == 0){                                              // Режим выключения светодиодов.
    digitalWrite(latch_Pin, LOW);                              // Открываем регистр.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]);    // Загружаем нули светодиоды выключены.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]);    // Загружаем нули светодиоды выключены.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]);    // Загружаем нули светодиоды выключены.
    shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]);    // Загружаем нули светодиоды выключены.
    digitalWrite(latch_Pin, HIGH); }                          // Закрываем регистр.
    if (irrecv.decode(&results)) {
    irrecv.resume(); }
    if (results.value == 33441975){                            // Кнопка включения табло.
    p = 1;
    results.value = 0;}
    if (results.value == 33446055){                            // Кнопка выключения табло.
    p = 0;
    results.value = 0;}
    if (results.value == 33456255){                            // Кнопка включения светодиода секунд.
    i = 1;
    results.value = 0;}
    if (results.value == 33439935){                            // Кнопка выключения светодиода секунд.
    i = 0;
    results.value = 0;}
    if (results.value == 33431775){                            // Здесь и далее кнопки установки времяни.                    
    a = a + 1;
    results.value = 0;}
    if (results.value == 33464415){                      
    a = a - 1;
    results.value = 0;}
    if (results.value == 33480735){                      
    z = z + 1;
    results.value = 0;}
    if (results.value == 33427695){                      
    z = z - 1;
    results.value = 0;}
    if (results.value == 33444015){                      
    x = x + 1;
    results.value = 0;}
    if (results.value == 33478695){                      
    x = x - 1;
    results.value = 0;}
    if (results.value == 33435855){                      
    y = y + 1;
    results.value = 0;}
    if (results.value == 33468495){                      
    y = y - 1;
    results.value = 0;}
    if (i == 1){digitalWrite(LED_PIN, HIGH);}                  // Включаем светодиод секунд.
    delay(500);                                                // Ждем пол секунды.
    if (i == 1){digitalWrite(LED_PIN, LOW);}                  // Выключаем светодиод секунд.
    delay(500);                                                // Ждем пол секунды.
    }                                                          // Закрываем цикл секунд.
    if(y == 9) x = x + 1;                                      // При достижении первой цифры минут 9 прибавляем к второй цифре минут 1.
    if(x > 5){x = 0; z = z + 1;}                              // При достижении второй цифры минут 5 прибавляем к первой цифре часов 1 а второй присваиваем 0.
    if(z > 9){z = 0; a = a + 1;}                              // При достижении первой цифры часов 9 прибавляем к второй цифре часов 1 а первой присваиваем 0.
    if(a > 1 && z == 4) {a = 0; z = 0;}                        // Если вторая цифра часа больше 1 а первая равна 4 (т.е 24 часа) сбрасываем все в 0.
    }
    }
 

Всем спасибо за внимание!

bwn
Offline
Зарегистрирован: 25.08.2014

Креативненько))). Интересный вопрос не осветил, как фокусировку всего этого делал на стену?

olegoriy
Offline
Зарегистрирован: 08.02.2015

Спасибо.

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

bwn
Offline
Зарегистрирован: 25.08.2014

Пасиб.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

отлично получилось)

а вообще можно было обойтись без резисторов, достаточно поставить стабилизатор на 3.3В и все) сам так недавно делал. все отлично. напряжение рабочее для светодиодов около 3.2В. падение на микрухе и вуаля, резисторы не нужны)

также удобно использовать Tm1637

olegoriy
Offline
Зарегистрирован: 08.02.2015

Спасибо.

Думал о том чтобы обойтись без резисторов, но думал уже после того как сделал :). Переделовать лень да и не нужно я думаю. Если еще буду делать нечто подобное обязательно попробую. Только интересует вопрос 74HC595 хватит ли питания 3.3 вольта для полноценной работы?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

с точки зрения "собрать любую фигню, ибо нет идей" конечно замечательно...

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

olegoriy
Offline
Зарегистрирован: 08.02.2015

Жене кстати часы очень понравились. Комнату освещает - так это еще один плюс своеобразный ночник. Еще при отключении электроэнергии ( что в моем доме происходит с подозрительной регулярностью) получаеться аварийное освещение. А когда надоедает свет от часов всегда можно выключить пультом. А вот то что какаято хрень на стене - это конечно печаль. Но тешу себя мыслями что если бы это был к примеру видеопроектор то это была бы точно такая же хрень на стене и от этого не уйти.

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

Кстати чуть не забыл: Спасибо за конструктивную критику.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хватит. говорю же у меня работает прямо сейчас

tolkach
Offline
Зарегистрирован: 05.02.2017

Здравствуйте olegoriy.Давно поглядываю в сторону таких часов.Ваши понравились.Трудностей со сборкой и программированием не должно возникнуть но напрашивается вопрос.А где схема?Может я что-то пропустил?Буду признателен за ответ.

marlen_98.kz
Offline
Зарегистрирован: 19.05.2018

Здравствуйте у меня есть кое какой вопрос. Я бы хотел собрать проекционные часы на контроллере Arduino как у вас. Не могли-ли бы вы отправить схему подключения часов, и подробную информацию о деталях?
Часы делаю для дипломного проекта)