Цифровые часы atmega328: создание своими руками

Записки программиста

Паяем простые электронные часы на базе ATmega328P

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

Честно говоря, поначалу я хотел сделать электронные часы основанными на микросхемах стандартной логики 74xx и таймере 555. То есть, безо всяких микроконтроллеров. Как оказалось, это вполне реально, и потребует всего лишь пары логических И. Однако, такие часы оказались не очень точными. С помощью потенциометров можно установить частоту таймера очень близкой к 1 Гц, но недостаточно близкой. Мои эксперименты показали, что за год такие часы начнут врать часов на 8, и это в лучшем случае. Плюс к этому, такие часы физически будут занимать больше места, чем основанные на микроконтроллере, не говоря уже о том, что их функционал будет крайне сложно расширить (скажем, добавить будильник). В итоге от идеи полностью аналоговых часов пришлось отказаться. Тем не менее, рекомендую подумать над схемой таких часов в качестве упражнения.

Первая версия часов, основанная уже на ATmega328P, выглядела так:

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

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

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

/* inc/dec buttons */
const int HINC_PIN = A5 ;
const int HDEC_PIN = A4 ;
const int MINC_PIN = A3 ;
const int MDEC_PIN = A2 ;

/* pin to 4026 IC’s reset inputs */
const int RESET_PIN = 5 ;

const int DOT_PIN = 8 ;

/* pins to 4026 IC clock inputs */
const int HPIN_H = 10 ;
const int HPIN_L = 9 ;
const int MPIN_H = 7 ;
const int MPIN_L = 6 ;

/* current time */
int hour = 0 ;
int min = 0 ;
int sec = 0 ;
int msec = 0 ;

bool hinc_released = true ;
bool hdec_released = true ;
bool minc_released = true ;
bool mdec_released = true ;

unsigned long prevMillis ;

void setup ( )
<
pinMode ( HDEC_PIN, INPUT ) ;
pinMode ( HINC_PIN, INPUT ) ;
pinMode ( MDEC_PIN, INPUT ) ;
pinMode ( MINC_PIN, INPUT ) ;

pinMode ( RESET_PIN, OUTPUT ) ;
pinMode ( DOT_PIN, OUTPUT ) ;

pinMode ( HPIN_H, OUTPUT ) ;
pinMode ( HPIN_L, OUTPUT ) ;
pinMode ( MPIN_H, OUTPUT ) ;
pinMode ( MPIN_L, OUTPUT ) ;

void displayTime ( )
<
digitalWrite ( RESET_PIN, HIGH ) ;
digitalWrite ( RESET_PIN, LOW ) ;

digitalWrite ( DOT_PIN, ( sec & 1 ) ? HIGH : LOW ) ;

for ( int i = 0 ; i min % 10 ; i ++ )
<
digitalWrite ( MPIN_L, HIGH ) ;
digitalWrite ( MPIN_L, LOW ) ;
>

for ( int i = 0 ; i min / 10 ; i ++ )
<
digitalWrite ( MPIN_H, HIGH ) ;
digitalWrite ( MPIN_H, LOW ) ;
>

for ( int i = 0 ; i hour % 10 ; i ++ )
<
digitalWrite ( HPIN_L, HIGH ) ;
digitalWrite ( HPIN_L, LOW ) ;
>

for ( int i = 0 ; i hour / 10 ; i ++ )
<
digitalWrite ( HPIN_H, HIGH ) ;
digitalWrite ( HPIN_H, LOW ) ;
>
>

void loop ( )
<
unsigned long currMillis ;
unsigned long delta ;

currMillis = millis ( ) ;
delta = currMillis – prevMillis ;
prevMillis = currMillis ;
msec + = delta ;

while ( msec >= 1000 )
<
msec – = 1000 ;
sec ++ ;
if ( sec == 60 )
<
sec = 0 ;
min ++ ;
if ( min == 60 )
<
min = 0 ;
hour ++ ;
if ( hour == 24 )
hour = 0 ;
>
>
>

if ( digitalRead ( HDEC_PIN ) == LOW )
<
if ( hdec_released )
<
hdec_released = false ;
hour — ;
if ( hour 0 )
hour = 23 ;
>
> else
hdec_released = true ;

if ( digitalRead ( HINC_PIN ) == LOW )
<
if ( hinc_released )
<
hinc_released = false ;
hour ++ ;
sec = msec = 0 ;
if ( hour > 23 )
hour = 0 ;
>
> else
hinc_released = true ;

if ( digitalRead ( MDEC_PIN ) == LOW )
<
if ( mdec_released )
<
mdec_released = false ;
min — ;
sec = msec = 0 ;
if ( min 0 )
min = 59 ;
>
> else
mdec_released = true ;

if ( digitalRead ( MINC_PIN ) == LOW )
<
if ( minc_released )
<
minc_released = false ;
min ++ ;
sec = msec = 0 ;
if ( min > 59 )
min = 0 ;
>
> else
minc_released = true ;
>

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

Питание я решил подавать по USB. Мне не хотелось постоянно менять батарейки, а USB-кабелей и зарядников в любом доме нынче в избытке. Плюс у меня есть USB-аккумулятор, благодаря которому часы не перестанут идти, если внезапно отключат свет. Но если вам больше нравятся батарейки, часы будут прекрасно работать от двух батареек AA или одной CR2032.

Плата, как несложно догадаться по форме дорожек, была разведена вручную. Изначально я пытался сделать ее при помощи ЛУТ. Но поскольку это был мой первый опыт изготовления двухсторонней печатной платы, я не учел, что расстояние между отверстиями и дорожками на обратной стороне стоит сделать побольше. Пару отверстий я просверлил не совсем под прямым углом. В итоге на обратной стороне сверло вышло вовсе не там, где нужно, повредив дорожки. Я пытался исправить ошибку, навешивая «сопли», но не преуспел — плата так и осталась нерабочей. Изготовление двухсторонней платы 11 x 9 см занимает довольно много времени. Поэтому вместо того, чтобы переделывать плату, я просто заказал ее на Резоните.

Если вы полны решимости сделать такие же часы и собираетесь изготовить плату при помощи ЛУТ, советую переделать плату в одностороннюю. На второй стороне почти нет дорожек, вместо них можно использовать обычные провода. Если же вам интересно поупражняться в изготовлении двухсторонних плат, советую ее слегка увеличить, хотя бы до 12 x 10 см, и сделать так, чтобы дорожки на обратной стороне были как можно дальше от каких-либо отверстий. Травление двухсторонних плат происходит так. Травиться первая сторона, вторая при этом заклеивается скотчем. Сверлиться три отверстия. Тонер на вторую сторону наносится по ним. Затем первая сторона заклеивается и травиться вторая.

Исходники двух версий прошивок, для часов с секундами и без, а также исходники платы в формате EAGLE вы найдете в этом репозитории на GitHub. Стоит отметить, что на самом деле часы лучше делать совсем не так. Как уже отмечалось, можно обойтись вообще без счетчиков 4026. Большинство компонентов можно заменить на компоненты для поверхностного монтажа. За счет этого часы получаться компактнее, их будет проще сделать ЛУТом, и отверстий придется сверлить намного меньше. Кроме того, раз уж мы все равно использовали микроконтроллер, стоит добавить в часы будильник и термометр, а также синхронизировать время при помощи GPS. Увы, мы со всем этим еще не знакомы, но непременно скоро познакомимся.

Arduino DIY Watch — самодельные часы на Arduino

После нескольких лет знакомства с Arduino захотелось сделать что-то действительно интересное и полезное. Было решено сделать наручные часы. Но не просто часы, а действительно компактные, удобные, внешне не очень страшные и самое главное с длительным временем автономной работы часы.
И так встречайте самодельные часы на Arduino или DIY Arduino Watch!

DIY Arduino Watch – это компактные и лёгкие наручные часы с дисплеем размером 1,3 дюйма выполненным по технологии OLED. Часы можно легко программировать в среде Arduino через micro USB разъем, с помощью внешнего программатора. При программировании часов в настройках среды необходимо выбрать плату Arduino pro mini 3.3V 8MHz. Часы обладают низким энергопотреблением, что позволяет проработать более 6 месяцев от одной батарейки CR2032 ( при условии, что время отображается в течении 3 секунд, а в сутки владелец просматривает время 12 раз). Ток в режиме ожидания составляет около 7-8 мкA, в режиме отображения времени 10-12 мA. Так же часы позволяют измерять напряжение питания используя встроенный источник опорного напряжения на 1,1В.

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

Поговорим о задействованных пинах микроконтроллера:
А0 – измерение напряжения батареи часов
2 — Кнопка 1 ( будит часы из режима сна)
А1 – Кнопка 2
3 — Кнопка 3

Компоненты необходимые для изготовления часов:
1. Микроконтроллер atmega328p в корпусе QFP32;
2. OLED Display 128×64 1.3” (SH1106);
3. Часы реального времени DS1337 в корпусе SOP-8;
4. Тактовые кнопки;
5. Разьёмы micro USb мама и папа;
6. Батарейка CR2032;
7. SMD конденсаторы, резисторы и кварцы на 8MHz и 32kHz;
8. Двухсторонняя печатная плата;
9. Корпус, состоящий из 3-х деталей, напечатанный на 3D-принтере.

Принципиальная схема часов

Когда в наличии есть все необходимые детали, можно приступать к изготовлению печатной платы. Я делал плату методом ЛУТ, но только с одной оговоркой – вместо глянцевой бумаги я использовал прозрачную (можно и цветную, просто с прозрачной удобнее) виниловую самоклеющуюся пленку Oracl, которая позволяет идеально перенести весь тонер на текстолит. Технология следующая. Сначала на обычной бумаге печатаете рисунок платы, затем вырезаете виниловую пленку размером чуть больше чем сам рисунок и наклеиваете на напечатанный рисунок платы на бумаге. Затем снова на этом же листе бумаги печатаете рисунок платы, так, что бы печать получилась на самой виниловой пленке. Ну а дальше по отработанной схеме. Держать рисунок под утюгом около минуты — как правило за это время тонер успевает прилипнуть к текстолиту, а пленка успевает размягчиться, благодаря чему тонер полностью отстает от винила. В итоге получается отличный перенос рисунка без ворсинок и белого налета.

Схема расположения элементов на плате

На рисунке печатной платы сверху и снизу есть точки, которые позволяют точно совместить рисунки на разных сторонах платы.

Следующий шаг – прошивка бутлоадера в микроконтроллер. Бутлоадер используется от Arduino pro mini 3.3V 8MHz с небольшими изменениями. Для того что бы сделать потребление микроконтроллера в режиме сна около 1мкА а также позволить микроконтроллеру работать при напряжении ниже 1.8В необходимо отключить Brown-out Detection (BOD). Для этого необходимо открыть файл boards.txt, который лежит в папке с Arduino по следующему пути hardware/arduino/avr. В файле нужно найти строку

«## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328»

ниже которой указаны настройки фьюзов для бутлоадера для Arduino Pro or Pro Mini (3.3V, 8 MHz). Ниже находим строку:
pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05
И заменяем её на
pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x07

Сохраняем boards.txt и прошиваем загрузчик в микроконтроллер.

Напаиваем все детали на печатную плату согласно рисунку с расположением элементов.

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

Корпус печатался на 3D-принтере ABS пластиком. Для часов подойдут любые подходящие ремешки шириной 20мм.

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

// Arduino DIY Watch
// Ivan Grishin
// e-mail: arduinowatch@mail.ru
//
//
// Button 1 >>>> 2
// Button 2 >>>> A1
// Button 3 >>>> 3
// Vbat >>>>>>>> A0;

#include
DS1337 RTC = DS1337();

int val=0;
const int b1=2;
const int b2=A1;
const int b3=3;
const int vb=A0;
int mode=1;
int modest=0;
int h=0;
int m=0;
int s=0;
int d=0;
int mo=0;
int y=0;
int lock=0;
int volt=0;
float vbat=0;
int timebat=1;
int voltTime=1;

//#define BAT_HEIGHT 16
//#define BAT_GLCD_WIDTH 7
static const unsigned char PROGMEM bat_bmp0[] =
< B00111111,B11111111,
B00100000,B00000001,
B11100000,B00000001,
B11100000,B00000001,
B11100000,B00000001,
B00100000,B00000001,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp1[] =
< B00111111,B11111111,
B00100000,B00000011,
B11100000,B00000011,
B11100000,B00000011,
B11100000,B00000011,
B00100000,B00000011,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp2[] =
< B00111111,B11111111,
B00100000,B00000111,
B11100000,B00000111,
B11100000,B00000111,
B11100000,B00000111,
B00100000,B00000111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp3[] =
< B00111111,B11111111,
B00100000,B00001111,
B11100000,B00001111,
B11100000,B00001111,
B11100000,B00001111,
B00100000,B00001111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp4[] =
< B00111111,B11111111,
B00100000,B00011111,
B11100000,B00011111,
B11100000,B00011111,
B11100000,B00011111,
B00100000,B00011111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp5[] =
< B00111111,B11111111,
B00100000,B00111111,
B11100000,B00111111,
B11100000,B00111111,
B11100000,B00111111,
B00100000,B00111111,
B00111111,B11111111,>;
static const unsigned char PROGMEM bat_bmp6[] =
< B00111111,B11111111,
B00100000,B01111111,
B11100000,B01111111,
B11100000,B01111111,
B11100000,B01111111,
B00100000,B01111111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp7[] =
< B00111111,B11111111,
B00100000,B11111111,
B11100000,B11111111,
B11100000,B11111111,
B11100000,B11111111,
B00100000,B11111111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp8[] =
< B00111111,B11111111,
B00100001,B11111111,
B11100001,B11111111,
B11100001,B11111111,
B11100001,B11111111,
B00100001,B11111111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp9[] =
< B00111111,B11111111,
B00100011,B11111111,
B11100011,B11111111,
B11100011,B11111111,
B11100011,B11111111,
B00100011,B11111111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp10[] =
< B00111111,B11111111,
B00100111,B11111111,
B11100111,B11111111,
B11100111,B11111111,
B11100111,B11111111,
B00100111,B11111111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp11[] =
< B00111111,B11111111,
B00100111,B11111111,
B11100111,B11111111,
B11100111,B11111111,
B11100111,B11111111,
B00100111,B11111111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp12[] =
< B00111111,B11111111,
B00101111,B11111111,
B11101111,B11111111,
B11101111,B11111111,
B11101111,B11111111,
B00101111,B11111111,
B00111111,B11111111,>;

static const unsigned char PROGMEM bat_bmp13[] =
< B00111111,B11111111,
B00111111,B11111111,
B11111111,B11111111,
B11111111,B11111111,
B11111111,B11111111,
B00111111,B11111111,
B00111111,B11111111,>;

void setup() <
display.begin(SH1106_SWITCHCAPVCC, 0x3c);
RTC.start();
pinMode(b1, INPUT);
pinMode(b2, INPUT);
pinMode(vb, INPUT);
analogReference(INTERNAL);
display.setRotation(2); // поворот изображения на 180 градусов

display.SH1106_command(SH1106_DISPLAYOFF);
mode=1;
attachInterrupt(0,wakeUp, HIGH);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(0);
display.clearDisplay();
delay(10);
display.SH1106_command(SH1106_DISPLAYON);

for ( val; val =24)

if (modest==7)
<
RTC.setSeconds(s);
RTC.setMinutes(m);
RTC.setHours(h);
RTC.setDays(d);
RTC.setMonths(mo);
RTC.setYears(y);
RTC.writeTime();
delay(1);
lock=0;
modest=1;
mode=1;
val=0;
>
>
val++;

void battery(void)
<
if (voltTime==1)
<
volt=analogRead(vb);
vbat=volt*0.0045;
voltTime=5;
>
voltTime–;

Делаем наручные цифровые часы на ATMega328 своими руками

В этом уроке мы создадим симпатичные наручные цифровые часы на основе ATMega328 и некоторых деталей своими руками.

Идея урока возникла после того, как на одном сайте мы увидели аналогичные часы, которые продавались за 15 долларов.

Шаг 1. Комплектующие для часов

Компоненты часов

  • Один запрограммированный ICMP ATM3232 DIP
  • Одна 28-контактная база DIP IC
  • Один 4-значный дисплей
  • Один кристалл 32 кГц
  • Один резистор 10 кОм
  • Два конденсатора 0.1uF
  • Одна тактильная кнопка
  • Одна 20-миллиметровая аккумуляторная батарея с держателем батареи
  • Четыре винта M2 * 7 мм
  • Четырехточечная латунь M2 * 7 мм
  • Один нейлоновый браслет
  • Акриловый корпус

Оборудование

  • Паяльник
  • Припой
  • Медный фитиль
  • Отвертка 2 мм
  • Кусачки

Шаг 2. Пайка резистора

Вначале всегда проще поставить мельчайшие детали, поэтому начните с резистора.

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

Шаг 3. Пайка кристалла

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

Шаг 4. Пайка базы чипа

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

Шаг 5. Пайка 4-значного дисплея

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

Шаг 6. Пайка конденсаторов

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

Шаг 7. Пайка тактильной кнопки

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

Шаг 8. Вставляем чип в базу

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

Шаг 9. Пайка литиевой батареи

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

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

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

Шаг 10. Собираем всё вместе

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

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

aslambek34 › Блог › Большие ЖК часы на ардуино

Давно хотел сделать электронные часы на диодной ленте, и вот как-то наткнулся в инете на статью и сразу захотел реализовать — подкупила относительная простота и малое количество проводов — накосячить будет сложно.
Там же, в статье, указаны необходимые компоненты с ссылками на алиэкспресс, по которым я все сразу и заказал и стал изучать тему в ожидании посылки. Как оказалось, слегка поторопился, некоторые элементы можно было заменить, об этом ниже, в недочетах
Компоненты электроники:
— Диодная лента на микросхемах ws2811 (RGB, питание 12в) 5 метров — 700 рублей;
— ардуино нано — 200 рублей;
— датчик освещенности — 28 рублей;
— модуль реального времени RTC DS1307 AT24C32 — 37 рублей;
— преобразователь питания LM2596 — 41 рубль;
— блок питания 12 в 1А — нашел в закромах;
— датчик температуры DALLAS DS18B20 — 48 рублей;
— кусок макетной платы, две таковые кнопки, провода — нашел в закромах.

Для изготовления часов понадобилось так же:
— картон жесткий (изначально хотел фанеру)
— ватман (2 шт)
— двусторонний скотч (3М)
— обычный скотч
— листы вспененного полиэтилена (взял из защитных упаковок оборудования)

Изготовление часов.
1. Установка шрифта в MS Officce, и печать символа 8 на весь размер листа А4. Я сделал это в Visio

2. Нанесение границ кусков диодной ленты на картон

3. По следующему шаблону делаем разметку на вспененном полиэтилене, толщина 15 мм, и далее по разметке вырезаем.

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

4. По размеченным на картоне границам приклеиваем куски диодной ленты и соединяем пайкой по цепочке.

5. Далее приклеил контуры цифр к картонке с диодной лентой:

Далее сделал из ватмана внешний корпус, хотел сделать из фанеры, деревянных реек и тонированного стекла или акрила — но пока ни времени ни возможности нет.

Электроника
Основную схему вынес в отдельную коробочку, так как такой корпус хлипковат. В итоге к часам подходит кабель, в котором:
+12В — на питание диодной ленты;
+5В — на питание модуля освещенности;
0 — общий провод (минус);
выход данных с ардуино на диодную ленту;
выход сигнала с датчика освещенности на ардуино;

На деле все получилось не так красиво, но вроде работает:

Алгоритм работы:
Часы показывают время, дату и температуру в помещении: первые 15 секунд — время, затем 3 секунды — дату, еще 3 секунды — температуру, затем снова время. С 45-й секунды вновь дата 3 секунды, температура 3 секунды и снова время.
Когда в помещении светло — яркость отображения высокая, когда темно — снижается до минимального.

Скетч
yadi.sk/d/apVZ5DBw3XYTZo
Список скетчей:
1. clock_date (02.01.2017) — отображает время, дату и температуру, слегка подтормаживает при смене показаний
2. clock_temp (09.09.2017) — отображает время и температуру, смена каждые 5 секунд
3. new_clock (04.01.2017) — отображает просто время, анимированная смена цвета каждую минуту
4. new_clock_без кнопок (09.09.2017) — то же, что и п. 3, только убрал кнопки корректировки времени
5. clock_temp_animation (09.09.2017) — скетч из п.2 с анимацией как в п.3.
6. clock_temp_x2_animation (25.11.2017) — скетч из п.5 с двумя датчиками температуры: 5 секунд время, 2 секунды — температура внутри, 2 секунды — температура снаружи (наружный отображает отрицательную температуру)

в скетче возможны ошибки — переделывал много раз

для корректировки времени в архиве отдельный скетч, иначе выставить дату проблематично

Источники:

http://m.habr.com/ru/post/368101/

http://arduinoplus.ru/cifrovye-chasy-atmega328/

http://www.drive2.ru/b/462707479390715926/

http://amperkot.ru/blog/arduino-smarthome-part-2/

Ссылка на основную публикацию