Самодельные часы с в чехле от наушников Apple

В статье узнаете как сделать часы своими руками в чехле от наушников Apple, пошаговая инструкция для самодельных часов на языке программирования Arduino.

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

Я собираюсь показать вам, как это сделать, просто расслабьтесь и читайте статью.

Запчасти

Вам понадобятся некоторые детали для этого проекта.

  • 1x печатная плата
  • 1x чехол для наушников Apple
  • 1x 74HC595 сдвиговый регистр
  • 1x ATTiny44 или ATTiny84
  • 1x 16 МГц кварцевый генератор
  • 1x 1N4001 или 4007 силовой диод
  • 1x USB B мини-порт
  • 1x литий-ионный аккумулятор
  • 1x дисплей
  • 2х кнопочные переключатели
  • 3х резисторов 10 кОм
  • 4х 330 Ом резисторы

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

Прототип и файлы

Если вы просто хотите построить проект, этот шаг не слишком необходим. Я собираюсь поговорить о том, как работает код и оборудование.

Я собираюсь пройти код построчно

#include "avr / interrupt.h" // Мы используем прерывания

Серия ATtiny24, 44, 84 имеет только 1 внешнее прерывание (INT0). Это прерывание, с котором мы наиболее знакомы с использованием на Arduino. Вы можете просто использовать это прерывание, написав «attachInterrupt ()»

Хотя у него было только 1 прерывание, я хотел, чтобы на моих часах было две кнопки: одна для увеличения времени и другая для уменьшения времени. Оглядываясь назад на таблицу, ATtiny имеет два порта прерывания смены контактов : PCINT0 и PCINT1.

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

volatile int dig1 = 0; // Часы десятки
volatile int dig2 = 0; // Часы единицы
volatile int dig3 = 0; // минуты десятки
volatile int dig4 = 0; // минуты единицы

Каждая из этих переменных определяет, какое число отображается на каждой из четырех цифр на дисплее. Я объявил их изменчивыми, потому что они будут изменены в процессе прерывания. Установка их в 0 означает, что когда я включу свои часы, отсчет начнется в 00:00 (12:00 AM).

const int latchPin = A3; // Контакт подключен к ST_CP 74HC595
const int clockPin = A4; // Контакт подключен к SH_CP 74HC595
const int dataPin = A5; // Контакт подключен к DS 74HC595

Вот некоторые значения, которые мы будем использовать, чтобы отменить две кнопки, когда прерывание активировано. Без отмены, одно нажатие кнопки может быть зарегистрировано как пять, и использование часов будет раздражать. 
Проверьте Arduino Примеры / Digital / Debounce, если хотите.

// Мы будем использовать это значение для предотвращения опрокидывания функции millis (), которое происходит каждые 49 дней.
unsigned long currentMillis = 0;
volatile unsigned long lastMillis = 0;

Arduino может содержать длинные переменные. Я буду использовать длинные переменные currentMillis и lastMillis для чтения millis (); Через 49 дней значение millis () станет слишком большим для микроконтроллера и переполнится, и вернется обратно в 0. 
Это плохо, если я сравниваю currentMillis и lastMillis для отката, а значение currentMillis становится равным 0. Я объясню чуть позже.

int secTime = 0; // байт счетчика секунд
tictoc = 0; // Мигающая точка

Инициализация некоторых вещей. secTime — счетчик секунд, а tictoc определяет, показывать точку или нет каждую секунду.

void setup ()
{
pinMode (latchPin, OUTPUT);
pinMode (clockPin, OUTPUT);
pinMode (dataPin, OUTPUT);
pinMode (dig1Pin, OUTPUT);
pinMode (dig2Pin, OUTPUT);
pinMode (dig3Pin, OUTPUT);
pinMode (dig4Pin, OUTPUT);
cli (); // выключает прерывания
GIMSK | = 0b00110000; // включить прерывания смены контактов
PCMSK0 | = 0b10000000; // включить прерывания на PCINT7 (A7)
PCMSK1 | = 0b00000100; // включить прерывания на PCINT10 (8)
sei (); // снова включает прерывания
}

В функции настройки я буду объявлять выводы регистра сдвига и выводы мультиплексирования, как OUTPUT

Ниже описано, как инициализировать прерывания смены контактов. 
cli (); это функция, которую мы должны вызвать, чтобы отключить прерывания.

GIMSK — Общий регистр масок прерываний, регистр ATtiny. Проверьте страницу 51 таблицы данных, чтобы узнать, что делает каждый бит регистра GIMSK. 
0b00110000 включает 4-й и 5-й бит в регистре, которые включают PCIE0 и PCIE1. PCIE0 включает прерывания смены контактов для порта, имеющего контакты 0–7. PCIE1 включает прерывания смены контактов для части, которая имеет контакты 8–11.

PCMSK0 — это маска разрешения смены контактов для контактов от 0 до 7. Она активируется из PCIE0. Я хочу включить прерывание на PCINT7 или A7 на ATtiny44. 
Для этого я активирую бит 7: 0b10000000

PCMSK1 — это то же самое, что и PCMSK0, за исключением контактов 8–11. Активируется из PCIE1. Я хочу включить прерывание на PCINT10 или контакте 8. 
Для этого я включаю 2-й бит: 0b00000100

SEI (); включает прерывания.

void loop ()
{
display (dig1, dig2, dig3, dig4); // отобразить все цифры
// Эта часть переключается точка каждую секунду
currentMillis = millis ();
if ((unsigned long) (currentMillis - lastMillis)> = 1000)
{secTime ++; // Использование этого цикла if для увеличения второго
if (tictoc == 1)
{dig2 = dig2 - 10;tictoc = 0;}
else
{dig2 = dig2 + 10;tictoc = 1;}
lastMillis = millis ();}

display () — это функция, которую я объясню на следующем шаге. Это именно то, что вы думаете.

Скобка кода в основном переключает точку на дисплее 2 каждую секунду для имитации щелчков. 
По сути, каждые 1000 миллисекунд код проверяет, равен ли tictoc 1 или 0. Если он равен 0, он включает точку и устанавливает значение tictoc в 1. Если это значение равно 1, он выключает точку и устанавливает значение tictoc обратно в 0. 
+ 10 и -10 будут иметь смысл позже. 
В эту скобку также входит приращение для secTime, которое подсчитывает, сколько секунд прошло.

// Эта часть делает подсчет на часах,
if (secTime == 60)
{secTime = 0;
dig4 ++;
if (dig4 == 10)
{dig4 = 0;dig3 ++;
if (dig3 == 6)
{dig3 = 0;dig2 ++;
if (dig2 == 10)
{dig2 = 0;dig1 ++;
if (dig1 == 3)
{dig1 = 0;}}}}}
if (dig1 == 2 && dig2 == 4)
{dig1 = 0;dig2 = 0;} // Циклы if выше просто сообщают, когда цифры должны сбрасываться или переворачиваться
}

Если secTime достигает 60, мы увеличиваем dig4 (минуты)

Следующие циклы if в основном определяют, когда цифра переполняется и должна быть сброшена. Например, если у нас есть 9 на dig4, следующий должен быть 0, а dig2 должен быть увеличен на 1.

Если dig1 (часовые десятки) равен 2, а dig2 (часовые) равен 4, мы сбрасываем часы на 00.

// Выполняется, если A7 нажата
ISR (PCINT0_vect )
{secTime = 0; // Делаем секунды 0
if (tictoc == 1) // Устанавливаем точку в 0, чтобы нас не смущать
{dig2 = dig2 - 10;tictoc = 0;}
currentMillis = millis ();
if ((unsigned long) (currentMillis - xlastDebounceTime)> = debounceDelay) {dig4--;if (dig4 == -1)
{dig4 = 9;dig3--;
if (dig3 == -1)
{dig3 = 5;dig2--;
if (dig2 == -1)
{dig2 = 9;dig1--;
if (dig1 == -1){dig1 = 2;}}}}// Выше было, опять же, больше, если циклы переполнения цифр и прочее.
// Ниже рассматривается проблема перехода на 29 вместо 00 при резервном копировании.
if (dig1 == 2 && dig2 == 9){dig2 = 3;}xlastDebounceTime = millis ();}}

ISR (PCINT0_vect) {} — это процедура прерывания, которая выполняется, когда PCINT0 активируется контактом A7. 
Эта функция в основном устанавливает secTime в 0 и уменьшает dig4 на 1. 
Следующее, если циклы в основном обрабатывают переполнение. 
Вся функция обернута циклом отмены if.

// Выполняется, если 8 нажата
ISR (PCINT1_vect ){secTime = 0; // Делаем секунды 0
if (tictoc == 1) // Устанавливаем точку в 0
{dig2 = dig2 - 10;tictoc = 0;}
currentMillis = millis ();
if ((unsigned long) (currentMillis - ylastDebounceTime)> = debounceDelay) {dig4 ++;
if (dig4 == 10)
{dig4 = 0;dig3 ++;
if (dig3 == 6){dig3 = 0;dig2 ++;if (dig2 == 10)
{dig2 = 0;dig1 ++;
if (dig1 == 3)
{dig1 = 0;}}}} // Выше было, опять же, больше, если циклы переполнения цифр и прочее.
// Ниже рассматривается проблема перехода к 24 вместо 00 при движении вперед.
if (dig1 == 2 && dig2 == 4){dig1 = 0;dig2 = 0;}
ylastDebounceTime = millis ();}}

ISR (PCINT1_vect) {} — это процедура прерывания, которая выполняется, когда PCINT1 активируется контактом 8. 
Это в основном делает то же самое, что и другое прерывание, за исключением увеличения вместо уменьшения.

Это то, что происходит в эскизе WATCHG.ino. Чтобы оставаться организованным, я сделал еще один набросок ShiftDatas.ino для хранения некоторых переменных и функций. Мы рассмотрим это на следующем шаге.

ShiftDatas.ino в основном содержит массив, в котором есть байты для каждого отображаемого символа / числа.

Он также имеет функцию display (), которая в основном сдвигает байт символа для цифры, выключает его, сдвигает другой байт и выключает другую цифру. Это мультиплексирование.

byte digits[21] = {
0xFC, //0 case 0
0x60, //1 case 1
0xDA, //2 case 2
0xF2, //3 case 3
0x66, //4 case 4
0xB6, //5 case 5
0xBE, //6 case 6
0xE0, //7 case 7
0xFE, //8 case 8
0xE6, //9 case 9
0xFD, //0. case 10
0x61, //1. case 11
0xDB, //2. case 12
0xF3, //3. case 13
0x67, //4. case 14
0xB7, //5. case 15
0xBF, //6. case 16
0xE1, //7. case 17
0xFF, //8. case 18
0xE7, //9. case 19
0x00, //BLANK case 20 };

Это массив символов. Вы можете вызвать определенный байт ‘n’, вызвав цифры [n]. 
Как я уже говорил ранее, Q0, Q1, Q2, Q3, Q4, Q5, Q6 и Q7 каждый управляет a, b, c, d, e, f, g и dp соответственно. 
Если я хочу отобразить число «0», мне нужно включить сегменты a, b, c, d, e и f. Это означает, что регистр сдвига должен сдвинуть 0b11111100, который является шестнадцатеричным 0xFC. 
Вот как я это сделал.

// 4 аргумента для 4 дисплеев.
// Эта часть для мультиплексирования.
void display (int disp1, int disp2, int disp3, int disp4)
{
// Первая цифра (часы десятки)
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, LSBFIRST, цифры [disp1]);
digitalWrite (latchPin, HIGH);
digitalWrite (dig1Pin, LOW);
digitalWrite (dig2Pin, HIGH);
digitalWrite (dig3Pin, HIGH);
digitalWrite (dig4Pin, HIGH);
// Вторая цифра (часы)
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, LSBFIRST, цифры [disp2]);
digitalWrite (latchPin, HIGH);
digitalWrite (dig1Pin, HIGH);
digitalWrite (dig2Pin, LOW);
digitalWrite (dig3Pin, HIGH);
digitalWrite (dig4Pin, HIGH);
// третья цифра (минуты десятки)
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, LSBFIRST, цифры [disp3]);
digitalWrite (latchPin, HIGH);
digitalWrite (dig1Pin, HIGH);
digitalWrite (dig2Pin, HIGH);
digitalWrite (dig3Pin, LOW);
digitalWrite (dig4Pin, HIGH);
// четвертая цифра (минуты)
digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, LSBFIRST, цифры [disp4]);
digitalWrite (latchPin, HIGH);
digitalWrite (dig1Pin, HIGH);
digitalWrite (dig2Pin, HIGH);
digitalWrite (dig3Pin, HIGH);
digitalWrite (dig4Pin, LOW);
}

Помните ранее, как я написал display (dig1, dig2, dig3, dig4) в коде WATCHG? 
Каждый аргумент обрабатывается в этой функции. 
Допустим, я хотел показать 04:20. Это означает, что dig1 равен 0, dig2 равен 4, dig3 равен 2 и dig1 равен 0.

Чтобы отобразить все числа, я делаю это:

  1. сдвиньте биты на 0, включите dig4
  2. выключите dig4, сдвиньте биты на 2, включите dig3.
  3. выключите dig3, сдвиньте биты на 4, включите dig2.
  4. выключите dig2, сдвиньте биты на 0, включите dig1.

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

Загрузка программы

Даже если есть два кода Arduino, просто откройте WATCHG.ino и загрузите его. ShiftDatas откроется как вкладка вместе с ней.

Микроконтроллером будет ATtinyX4, работающий на частоте 16 МГц, поэтому перед загрузкой кода убедитесь, что вы загрузили загрузчик на ATtiny. После того, как вы запустите загрузчик, вам понадобится 16 МГц, чтобы загрузить программу.

Изготовления печатной платы

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

Прилагаются файлы RRB для печатных плат. Я использую программу под названием Copper Connection. 

Я также приложил файлы PDF для переноса тонера или светочувствительного переноса. Вам просто нужно распечатать PDF как фактический размер.

Я покажу вам, как использовать метод светочувствительной передачи.

  1. Распечатайте проекты печатных плат на воздушных пленках
  2. Отмерь свою печатную плату и отрежьте. Печатная плата имеет размер 4,1 на 4,3 мм, если вам интересно. 
    Вы должны быть точным, когда измеряете и режете, чтобы конечный продукт был красивым.

РЕДАКТИРОВАТЬ:

Я добавил схему от Fritzing для тех, кто этого хочет. Это в папке Zip. Если у вас есть Fritzing, это может облегчить работу.

WATCHG.rrb
Powerboard.rrb
Powerboard.pdf
WATCHG.pdf
Schmatics.zip

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

Изготовление печатной платы для самодельных часов

Первая плата — это главная вычислительная плата.

  1. Снимите защитный слой и положите прозрачную пленку в правильной ориентации сверху платы. 
    Вы должны проверить, есть ли прозрачность вверх дном или нет.
  2. Положите прозрачный кусок материала сверху и поместите фонарь сверху.
  3. Подождите от 7 до 8 минут.
  4. Поместите плату в проявитель, пока не появятся следы.
  5. Поместите плату в травитель.

Пока на другой плате идет гравировка, мы можем работать над второй.

Мы в основном выполняем те же шаги, что и другие на предыдущий плате.

  1. После того, как обе платы окажутся в травителе, вам следует на некоторое время заняться чем-то другим.
  2. После того, как платы закончены, протрите светочувствительное покрытие средством для снятия лака
  3. Во время травления некоторые царапины избавились от следов на моей плате. Если это произойдет с вами, убедитесь, что вы не забыли починить их во время пайки
  4. После того, как вы заметите любые сломанные следы почините и просверлите отверстия на плате.

Пайка

Теперь вы готовы припаять детали к печатной плате. Обратитесь к файлам в предыдущих шагах, чтобы узнать, что и куда идет

Несколько советов:

  • Припой низкопрофильный и мелкие детали первыми.
  • Проверьте ориентацию диодов и микросхем, сравнив их с файлами печатных плат.
  • Все на Powerboard SMD. Просто согните провода, чтобы все сошлось.
  • Чтобы припаять, добавьте припой с вышеуказанных прокладок и нагрейте прокладку. Припой стекает вниз и прикрепляется к плате.
  • Горячим клеем прикрепите аккумулятор к плате.

После того, как обе платы спаяны и исправлены все неисправные следы, припаяйте питание от материнской платы к материнской плате. Проверьте, работает ли он правильно. Если нет, отключите питание и отладьте.

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

Закрепите первую гайку и болт на силовой плате, а затем сложите основную плату поверх нее.

Модификация чехла для наушников Apple

Я решил, что эти часы будут хорошо смотреться в чехле Apple Airpods. Есть несколько вещей, которые нам нужно сделать, чтобы часы уместились в коробку.

  1. Отрежьте вкладыш, удерживающий часть корпуса. Ножовка или ленточная пила отлично подойдут.
  2. Оторвите оставшиеся гребни, чтобы разрезать рельеф для порта USB. Гребни могут быть легко оторваны с помощью плоскогубцев.
  3. Пометьте и просверлите отверстия для гаек и болтов, чтобы прикрепить плату к корпусу.
  4. Установите плату питания, затем основную плату. Использование двух гаек обеспечит безопасность платы
  5. Накройте схему липкой лентой, а затем отрежьте излишки болта, чтобы они могли поместиться под крышкой корпуса.
  6. Просверлите два отверстия в крышке, чтобы кнопки можно было нажимать карандашом.

Последний этап для изготовления самодельных часов

Теперь вы закончили! Это делает милые настенные часы или настольные часы.

Для зарядки просто подключите его к мини-кабелю USB B примерно на 10 минут. Это небольшая батарея, а порты USB обеспечивают ток 1А.

Схема не настолько энергоэффективна: на 16 МГц часы могут работать в течение 10 часов без необходимости перезарядки. Это не очень энергоэффективно, но выглядит красиво: P.

Надеюсь, тебе понравилось!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

meanderss.ru © 2020

Adblock
detector