Пользователь
0,0
рейтинг
27 февраля в 23:53

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

image

Компоненты необходимые для изготовления часов:
1. Микроконтроллер atmega328p в корпусе QFP32;
2. OLED Display 128x64 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 «LowPower.h»
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include <DS1337.h>
#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);

#include <stdio.h>
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 wakeUp(){}

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

}

void loop() {

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<=150;)
{
RTC.readTime();
int state1=digitalRead(b1);
int state2=digitalRead(b2);
int state3=digitalRead(b3);


if (state2==1&&lock==0)
{
mode++;
delay(130);
state2=0;
}

if (state3==1)
{
display.begin(SH1106_SWITCHCAPVCC, 0x3c);
display.setRotation(2);
display.clearDisplay();
delay(100);
}

if (mode==1){
time();
battery();
display.display();
val++;
}

// ++++++++++++++++ MODE SET TIME +++++++++++++++++
while (mode==2)
{
int state1=digitalRead(b1);
int state2=digitalRead(b2);
int state3=digitalRead(b3);

lock=1;
if (state2==1)
{
modest++;
delay(150);
state2=0;
}
//+++++++++++++++++++ Set HOURS++++++++++++++++++++
if (modest==1)
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(BLACK,WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.setTextColor(WHITE);
display.print(":");
if (m<=9)
{display.print(«0»);}
display.print(m);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
if (s<=9)
{display.print(«0»); }
display.print(s);
battery();
display.setTextSize(1);
display.setCursor(40,50);
display.print(d);
display.print('/');
display.print(mo);
display.print('/');
display.print(y);
display.display();
if (state1==1)
{
h++;
delay(150);
}
if (state3==1)
{
h--;
delay(150);
}

if (h>=24)
{ h=0;}

if (h<0)
{ h=23;}

if (state2==1)
{
modest++;
delay(150);
state2=0;
}

}
// +++++++++++++++++++++++++++++ SET MIN ++++++++++++++++++
if (modest==2)
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.print(":");
display.setTextColor(BLACK,WHITE);
if (m<=9)
{display.print(«0»);}

display.print(m);
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
if (s<=9)
{display.print(«0»); }
display.print(s);
battery();
display.setTextSize(1);
display.setCursor(40,50);
display.print(d);
display.print('/');
display.print(mo);
display.print('/');
display.print(y);
display.display();
if (state1==1)
{
m++;
delay(100);
}
if (state3==1)
{
m--;
delay(150);
}

if (m>=60)
{ m=0;}

if (m<0)
{ m=59;}

if (state2==1)
{
modest++;
delay(150);
state2=0;
}
}

// +++++++++++++++++++++++ SET SEC +++++++++++++++++++++
if (modest==3)
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.print(":");
if (m<=9)
{display.print(«0»);}
display.print(m);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
display.setTextColor(BLACK,WHITE);
if (s<=9)
{display.print(«0»); }
display.print(s);
display.setTextColor(WHITE);
battery();
display.setTextSize(1);
display.setCursor(40,50);
display.print(d);
display.print('/');
display.print(mo);
display.print('/');
display.print(y);
display.display();
if (state1==1)
{
s++;
delay(100);
}
if (state3==1)
{
s--;
delay(150);
}

if (s>=60)
{ s=0;}

if (s<0)
{ s=59;}

if (state2==1)
{
modest++;
delay(150);
state2=0;
}
}
// +++++++++++++++++++++++ END SET SEC +++++++++++++++++++++

// +++++++++++++++++++++++ SET DAY +++++++++++++++++++++
if (modest==4)
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.print(":");
if (m<=9)
{display.print(«0»);}
display.print(m);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
if (s<=9)
{display.print(«0»); }
display.print(s);
display.setTextColor(WHITE);
battery();
display.setTextSize(1);
display.setCursor(40,50);
display.setTextColor(BLACK,WHITE);
display.print(d);
display.setTextColor(WHITE);
display.print('/');
display.print(mo);
display.print('/');
display.print(y);
display.display();
if (state1==1)
{
d++;
delay(100);
}
if (state3==1)
{
d--;
delay(150);
}

if (d>=32)
{ d=1;}

if (d<0)
{ d=31;}

if (state2==1)
{
modest++;
delay(150);
state2=0;
}
}
// +++++++++++++++++++++++ END SET DAY +++++++++++++++++++++

// +++++++++++++++++++++++ SET MON +++++++++++++++++++++
if (modest==5)
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.print(":");
if (m<=9)
{display.print(«0»);}
display.print(m);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
if (s<=9)
{display.print(«0»); }
display.print(s);
display.setTextColor(WHITE);
battery();
display.setTextSize(1);
display.setCursor(40,50);
display.print(d);
display.print('/');
display.setTextColor(BLACK,WHITE);
display.print(mo);
display.setTextColor(WHITE);
display.print('/');
display.print(y);
display.display();
if (state1==1)
{
mo++;
delay(100);
}
if (state3==1)
{
mo--;
delay(150);
}

if (mo>=13)
{ mo=1;}

if (mo<0)
{ mo=12;}

if (state2==1)
{
modest++;
delay(150);
state2=0;
}
}
// +++++++++++++++++++++++ END SET DAY +++++++++++++++++++++

// +++++++++++++++++++++++ SET YEAR +++++++++++++++++++++
if (modest==6)
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.print(":");
if (m<=9)
{display.print(«0»);}
display.print(m);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
if (s<=9)
{display.print(«0»); }
display.print(s);
display.setTextColor(WHITE);
battery();
display.setTextSize(1);
display.setCursor(40,50);
display.print(d);
display.print('/');
display.print(mo);
display.print('/');
display.setTextColor(BLACK,WHITE);
display.print(y);
display.display();
if (state1==1)
{
y++;
delay(100);
}
if (state3==1)
{
y--;
delay(150);
}

if (y>=2020)
{ y=2000;}

if (state2==1)
{
modest++;
delay(150);
state2=0;
}
}
// +++++++++++++++++++++++ END SET YEAR +++++++++++++++++++++

// ++++++++++++++++++++++ WRITE to DS1337 +++++++++++++++

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++;

}
val=0;
display.clearDisplay();
//delay(50);
}

void battery(void)
{
if (voltTime==1)
{
volt=analogRead(vb);
vbat=volt*0.0045;
voltTime=5;
}
voltTime--;

if (2>vbat && vbat>=1) {display.drawBitmap(0,0,bat_bmp0, 16, 7, 1);}
if (2.1>vbat && vbat>=2) {display.drawBitmap(0,0,bat_bmp1, 16, 7, 1);}
if (2.2>vbat && vbat>=2.1) {display.drawBitmap(0,0,bat_bmp2, 16, 7, 1);}
if (2.3>vbat && vbat>=2.2) {display.drawBitmap(0,0,bat_bmp3, 16, 7, 1);}
if (2.4>vbat && vbat>=2.3) {display.drawBitmap(0,0,bat_bmp4, 16, 7, 1);}
if (2.5>vbat && vbat>=2.4) {display.drawBitmap(0,0,bat_bmp5, 16, 7, 1);}
if (2.6>vbat && vbat>=2.5) {display.drawBitmap(0,0,bat_bmp6, 16, 7, 1);}
if (2.7>vbat && vbat>=2.6) {display.drawBitmap(0,0,bat_bmp7, 16, 7, 1);}
if (2.8>vbat && vbat>=2.7) {display.drawBitmap(0,0,bat_bmp8, 16, 7, 1);}
if (2.9>vbat && vbat>=2.8) {display.drawBitmap(0,0,bat_bmp9, 16, 7, 1);}
if (3>vbat && vbat>=2.9) {display.drawBitmap(0,0,bat_bmp10, 16, 7, 1);}
if (3.1>vbat && vbat>=3) {display.drawBitmap(0,0,bat_bmp11, 16, 7, 1);}
if (3.2>vbat && vbat>=3.1) {display.drawBitmap(0,0,bat_bmp12, 16, 7, 1);}
if (4>vbat && vbat>=3.2) {display.drawBitmap(0,0,bat_bmp13, 16, 7, 1);}
/*
if (2>vbat && vbat>=1) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);}
if (2.1>vbat && vbat>=2) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(13,1,13,1,1);}
if (2.2>vbat && vbat>=2.1) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(13,1,2,6,1);}
if (2.3>vbat && vbat>=2.2) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(12,1,3,6,1);}
if (2.4>vbat && vbat>=2.3) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(11,1,4,6,1);}
if (2.5>vbat && vbat>=2.4) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(10,1,5,6,1);}
if (2.6>vbat && vbat>=2.5) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(9,1,6,6,1);}
if (2.7>vbat && vbat>=2.6) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(8,1,7,6,1);}
if (2.8>vbat && vbat>=2.7) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(7,1,8,6,1);}
if (2.9>vbat && vbat>=2.8) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(6,1,9,6,1);}
if (3>vbat && vbat>=2.9) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(5,1,10,6,1);}
if (3.1>vbat && vbat>=3) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(4,1,11,6,1); }
if (3.2>vbat && vbat>=3.1){display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(3,1,12,6,1);}
if (4>vbat && vbat>=3.2) {display.drawRect(0,2,2,4,1);display.drawRect(2,0,14,8,1);display.fillRect(2,1,13,6,1);}
*/
display.setTextSize(1);
display.setCursor(90,0);
display.print(vbat);
display.print(" V");
}

void time(void)
{
h=RTC.getHours();
m=RTC.getMinutes();
s=RTC.getSeconds();
d=RTC.getDays();
mo=RTC.getMonths();
y=RTC.getYears();

display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.print(":");
if (m<=9)
{display.print(«0»);}
display.print(m);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
if (s<=9)
{display.print(«0»); }
display.print(s);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(40,50);
display.print(d);
display.print('/');
display.print(mo);
display.print('/');
display.print(y);
}

void show_time(void)
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,20);
if (h<=9)
{display.print(«0»);}
display.print(h);
display.print(":");
if (m<=9)
{display.print(«0»);}
display.print(m);
display.setTextSize(2);
display.setCursor(90,28);
display.print(":");
if (s<=9)
{display.print(«0»); }
display.print(s);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(40,50);
display.print(d);
display.print('/');
display.print(mo);
display.print('/');
display.print(y);
}


В конце статьи будет ссылка на все необходимые материалы для самостоятельного изготовления часов. В эти материалы внесены несколько изменений, которые должны исправить мелкие недочёты найденные в уже сделанных часах. Например, исправлена печатная плата и теперь она не требует дополнительных перемычек, так же немного увеличен размер самой платы, что позволило сместить разъем micro USB ближе к корпусу часов.

В перечень материалов входит:
— скетч
— печатная плата (Sprint Layout)
— 3D-модель корпуса часов (stl)
— необходимые библиотеки для Arduino
— схема электрическая принципиальная

СКАЧАТЬ ФАЙЛЫ
ФАЙЛ ПЕЧАТНОЙ ПЛАТЫ

Планы на будущее:
— заменить ds1337 на ds3231
— добавить контроллер для зарядки аккумулятора
— добавить вибромотор
— реализовать работу будильников
— заменить подключение дисплея с I2C на SPI
— добавить BLE

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

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




Вот собственно пока всё. Ожидаю ваши вопросы и здоровую критику…

UPD. Добавил файл печатной платы будет добавлен в понедельник 29 февраля.
Иван @ivizil
карма
30,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

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

  • +4
    Ну, что сказать. В жизни любого электронщика есть период когда он делает часы. С чем и поздравляю :)

    заменить ds1337 на ds3231

    Чисто для ликбеза, можете пояснить почему не использовали 1307 и чем 3231 будут лучше?
    • +1
      ds1307 расчитано на 2 вида питания: обычное, для работы и батарейку для хранения времени, что не очень подходит для компактных часов.
      В то же время ds1337 имеет только один вид питания, которое позволяет как работать с rtc так и хранить время. А ds3231 удобен тем, что часовой кварц уже встроен в корпус rtc.
      • 0
        Я как-то на макетке собирал интереса ради часы на ds1307. Потом забросил. Вспомнил и включил где-то через 7-8 месяцев. Отстали, паразиты, на 7 минут)
        • +1
          Точность зависит от кварца, а китайцы любят экономить на всем — вот и получается большая погрешность. А вот ds3231 помимо точного встроенного кварца обладают термокомпенсацией, что благоприятно влияет на точность..
          • 0
            7 минут более чем за полгода — это все-таки приличная точность, как по мне… У меня часы в старой Нокии спешили на 2 минуты в месяц. В принципе некритично, т.к. проверить и перенастроить раз в пару месяцев — совершенно несложно.
            • +2
              В наше время это неприемлемо. Это точность попадающая под определение "+ — лапоть". раньше часы были с ЦНХ, выставляешь с точностью хода 0.1сек в сутки и не имеешь проблем, а современные часы… 1.25 сек в сутки, каждые две недели подстраивать по сигналам точного времени. Утомляет после нормальных часов.
              • 0
                Простите, а что в «нашем времени» изменилось?
                Нет, я понимаю, пунктуальность важна и все такое… Но раз в полгода подвести часы (потратить 30 секунд) не такая уж большая беда.
                Сам с механикой старой хожу, из-за износа пружины (ей уже лет 15, наверное), часики отстают на 3-4 минуты в неделю. Хотя работа по графику, дискомфорта не ощущаю.

                К тому же часы окружают нас совершенно везде. Оглянитесь. Я ради интереса посчитал — смарт, рабочий телефон, плеер, планшет домашний, на стене часы висят + в коридоре, их видно с моего места. А, еще в телевизоре часы (+ по некоторым каналам время вещают, т.е. прям двое часов в одном девайсе), и на руке часы. И китайский будильник стоит еще на подоконнике.
                И у всех у них показатели по чисто физическим причинам расходятся на +-1 минуту примерно. ну невозможно все часы в мире, до последнего будильника за 50 центов…

                Так что извините, в упор не вижу проблемы…
                • 0
                  Перфекционистов много…
                  Часов много в разных девайсах и в этом проблема, они постоянно показывают разное время и не каждый из них умеет синхронизироваться. В таких условиях непонятно каким часам верить а подстраивать вручную все из них это просто АД, если одни надо подстраивать раз в две недели, то несколько приходится либо игнорировать либо подстраивать кого-то из них каждые 2-3 дня.
  • +2
    Неплохо. Особенно если батарейка оправдает срок жизни. Однако, слушайте "фе". У вас же есть доступ к 3D принтеру! Он умеет печатать кривые линии, там, разные объемы, загагулины всякие… Но почему вы делаете квадратный ужасный уродливый дизайн? Хоть бы уголки скруглили...
    • +1
      К сожалению доступа к принтеру нет.Заказывал печать в фирме, которая специализируется на печати. И к тому же это мой первый опыт проетирования корпуся для печати. А ещё уверен что в данном случае кривые и загогулины приведут к увеличению корпуса, что противоречит поставленной задаче.
    • 0
      > Но почему вы делаете квадратный ужасный уродливый дизайн? Хоть бы уголки скруглили...

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

    • 0
      Правильный корпус, отлично гармонирующий с ретроинтерфейсом.
  • 0
    Я не очень понял технику ЛУТа с Оракалом. Можно объяснить еще детальнее? Зачем печатать сначала на бумаге, затем клеить пленку и снова печатать?
    • 0
      В первую очередь это делается для экономии самой плёнки. Согласитесь что если на бумагу наклеить небольшой кусочек плёнки и потом попытаться попасть при печати на эту область то высока вероятность что промахнетесь. А так вы сначала просто печатаете на бумаге первый раз, затем заклеиваете пленкой рисунок вашей платы и ложите этот лист опять в принтер точно так же как и в первый раз. Повторяет печать и принтер напечатет ровно на том же месте рисунок вашей платы, но только уже на ви ниловой пленке, наклееной на бумаге.
      • 0
        Ага. Проверим, правильно ли я понял в этот раз. Вы берете лист А4, печатаете на нем изображение. Затем, вырезается кусочек пленки чуть больше изображения и наклеивается поверх рисунка на тот же самый лист А4. Это делается просто для того, чтобы знать куда на листе клеить пленку. Затем второй прогон, когда печать уже оказывается на этом участке, заклеенном пленкой. Верно?

        Еще вопросы. Я правильно понял, что пленку надо отрывать еще горячей, пока она мягкая?

        Где берете пленку? Оракал на каждом шагу не продается вроде. И какая конкретно марка пленки? Я не знаю имеет ли это значение, но Оракал обычно используется для струйной печати сольвентными чернилами, немного страшно совать в лазерный принтер неизвестный пластик, вдруг он мне печку угробит.

        Тестировали минимальную ширину дорожек и зазоров, которую удается надежно получить?

        Я тут пробовал термотрансферную бумагу, которая похожа на подложку от самоклейки. Увы, мой принтер не способен на ней печатать — тонер не держится. В принципе, хорошо получалось с фотобумагой, но ее потом сложно и долго отмывать. Ищу альтернативу. Уже хотел перейти на фоторезист, но он требует больше оборудования. Кстати, еще недавно попалась интересная техника переноса тонера без нагрева https://youtu.be/HBIxvwZ_0og

        • 0
          Да вы совершенно верно меня поняли. А пленку я отрываю сразу после того как прогрел утюгом. Минимальную толщина линий, которую я успешно переносил была 0.25, хотя мне кажется можно и меньше. Уверено что пленка безопасна для принтера, главное что бы она была чистой. Пленка можно достать в любой фирме, которая занимается изготовлением рекламы, вывесок, стендов… У них как правило всегда много обрезков, которые могу отдать даром. Ну или просто купить, я отдавал за 1 кв.м около 10 $..
          • 0
            Не факт, что безопасна. Струйник печатает без контактным методом. В лазерном принтере же пленка проходит через горячий барабан, и может приклеится к нему. Я раз так попал, к счастью без последствий. Разобрал, оторвал и норм.
  • +1
    Как то вы узко мыслите. Раз уж смогли сделать часы — то почему нет уникального функционала? Барометр, шагомер (гироскоп), пульсомер — разве так сложно добавить? Был бы у вас фитнес-трекер. Можно еще прогноз погоды встроить на основе давления.
    • +2
      Вы пробовали разработать подобное устройство?
      • 0
        Делал из стандартных плат. К примеру использовал барометр GY-68. Компоненты малого размера, по этому проблемы в размещении нет.

        Сами платы травил еще в школе, это было лет 15 назад. Делал достаточно много, может 40-50 плат сделал различной сложности (в основном не слишком сложных, конечно).

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

        Но смысла что-либо делать практически нет — заработать на этом не просто.
        • +7
          Почему люди всегда думают, что все делается только ради "заработать"? :)
          • +1
            Потому что после фазы «сделаю, потому что это интересно/нужно мне» вполне логично наступает фаза «сделаю (не бесплатно) тем, кому это интересно/нужно тоже». Коментатор указал, что сделал «40-50 плат» — время задуматься о том, как окупить инвестиции.
      • +1
        Я пробовал.
        Проблема, как и ожидалось, возникает на питании.
        Делать громоздкое создание только с функциями часов с прибамбасами, но размерами с "Rufus Cuff" мне показалось излишеством и в итоге уже который год довольствуюсь обычными Casio DB-E30, которым даже батарейку менять не надо.
    • 0
      Вы знаете, я думал об этом… Барометр добавить не сложно, есть компактные решения, возможно и пульсометр с гироскопом можно добавить… Но тут встает большой вопрос по времени автономной работы часов. Если уж и делать подобные вещи то уж точно не на atmega328 уж слишком она прожорливая как во время работы так и во время сна, добавьте сюда потребление дополнительных устройств… Тот же самы акселерометр в минимальном рабочем режиме потребляет около 200мкА — а это уже слишком много… В идеале брать какой нибудь msp430 и делать все на нем, но тогда пропадает совместимость с Arduino… И это уже никому не будет интересно..
  • –5
    Это какой-то апофеоз небрежности на грани трэша.

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

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

    На этом фоне постоянно скачущий датчик батареи и дебаунсинг через задержку в 150мс. уже смотрятся органично.

    В общем, автор молодец, что оно у него работает. А я пойду искать миксер.
    • +1
      Да действительно первый блин всегда комом… А делать такую мелкую плату самому сложновато, потому когда внесу все изменения, то закажу на стороне, так будет лучше… намного лучше…
      А что со скетчем не так? Подскажите, может ваши замечания позволят улучшить работу часов…
      Почему то при работе от батарейки CR2032 показания вольтметра сильно скачут, а при работе от аккумулятора — всегда стабильны..
      • +1
        Почему то при работе от батарейки CR2032 показания вольтметра сильно скачут, а при работе от аккумулятора — всегда стабильны..

        У "таблеток" относительно высокое внутреннее сопротивление — увеличьте С7. Это, кстати, благотворно и на ресурс батарейки повлияет (вот тут с разными батарейками и замерами делали).
        А вот чего на схеме не вижу — так это блокировочных конденсаторов по питанию непосредственно у "потребителей".
      • 0
        P.P.S. Что-то тут с временем редактирования для "недоверенных"участников...

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

        Если не собираетесь отказываться от делителя для контроля напряжения, то надо зашунтировать R10 конденсатором хотя-бы в 0.01 мкФ, который будет принимать на себя ток перезарядки конденсатора УВХ АЦП (см. раздел Analog Input Circuitry в описании Atmega328).
        • 0
          Спасибо учту в будущем обязательно..
      • +1
        Вы небрежно и второпях сделали схему, потому и воплощение платы оказалось сложным. Например, у вас выше R4 и C4 есть необозначенный на схеме компонент. Видно, что вы зарезервировали под него место, но в схему не внесли. Часть элементов можно было бы повернуть или сместить, чтобы получилось более равномерное заполнение, а то у вас то пустое место, то каша из дорожек и SMD. Разумеется следовало проверить отступы: Sprint Layout 6, который вы вероятно использовали, это позволяет. Стоило выровнять дорожки по сетке, избегать лишних углов и везде где только можно сделать дорожки шире. Я прекрасно понимаю сложности связанные с попытками разместить множество элементов на ограниченном пространстве.

        Их кривой схемы последовала аналогичная реализация — слишком тонкие дорожки вероятно частично были сожраны при травле и плохо держались. Чтобы избежать проблем с отслоением части кусков и микротрещинами — обычно тратят еще минут 5-10 и, аккуратно все лудят. Вообще все, а не только контактные площадки. Вам же, похоже, приходилось лудить прямо во время пайки, что еще больше усугубляло бардак. Часть дорожек, вероятно, оторвалась от перегрева, следы восстановления видны в четырех местах. Чтобы аккуратно паять мелкие SMD-компоненты используется тонкое необгораемое жало (извините фанаты меди), тогда точечные касания образуют аккуратную и ровную пайку, а излишки олова (если они как-то появились) снимаются оплеткой или тем же предварительно вытертым о мокрую тряпку жалом. Это спасает и от перегрева. Но вы использовали не очень подходящий инструмент, чем еще больше усложнили себе задачу.

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

        Для начала вам следовало бы оформить управление в каждом режиме (mode / modest) в виде отдельной функции, чтобы логика работы всех режимов помещалась на одном экране, а не была размазана по четырем сотням строк.

        Затем стоило бы избавиться от массы почти одинаковых блоков в коде, например — вывести показ времени/даты при настройках в отдельную функцию (у вас есть просто функция для времени, но не для времени с выделением параметра). Дело не только в размере кода, но и в том, что отладить одну функцию проще, чем множество копипаст. Аналогично и с выводом заряда батарейки — вы могли объявить набор символов в начале как массив и сократить тринадцать if-ов до четырех аккуратных строк.

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

        Следует привести в порядок оформление — у вас отступы расставлены как попало, в половине случаев параметры отделяются пробелом, а в половине — нет. Глобальные переменные не выделяются ни регистром, ни префиксом и никак не прокомментированы.

        Собственно, поэтому и функционал получился такой обрезанный — вы создали код, который проще выбросить и написать заново, чем пытаться улучшить.

        P.S.: Дебаунсинг через delay — почти всегда плохое решение. А у вас даже его значения скачут: 100, 130, 150.
        • 0
          В первую очередь хочу вас поблагодарить за то, что вы нашли время и потратили его на то что бы дать оценку моей работе. В целом все ваши замечания по-существу, поэтому в дальнейшей работе я их обязательно учту.
          Сильно сказывается нехватка опыта в проектировании и написании кода, но это не оправдание...
    • +1
      Да ладно вам. Человек для себя делал. Делал как умел. Делал, моежт быть, вообще в первый раз. И получилось, что работает. Во второй версии, если она будет, учтёт, наверняка, опыт и сделает получше)
      • 0
        Во второй версии все будет уже по-другому… Уберу явные недостатки и поработаю над уменьшением занимаемого места на плате компонентами. Перейду на более компактный контроллер, поставлю более компактный кварц для avr, перейду на ds3231, что позволит убрать часовой кварц, сменю подключение дисплея с I2C на SPI, что позволит увеличить скорость работы экрана в 4 раза.Реализую зарядку аккумулятора через micro USB. Появиться вибромотр и возможно bluetooth 4.0.
  • 0
    Свои часы всегда лучше покупных, тем более, что этим часам можно добавить игру "Змейка", молодец!
  • +1
    Горшков, Зеленко, Озеров и Попов одобряют этот интерфейс.
  • 0
    Ток в режиме ожидания несколько великоват. В хорошо «от-power-down-енном» AVR этот ток ниже предела разрешения китайского 3.5 разрядного мультиметра. У DS1337 заявляется «не более 2 мкА» (к тому-же — при разрешённом выходе SQW). Неплохо-бы найти виновника(ов).
    Первый лежит на поверхности — схема контроля питания. Можно совсем исключить делитель (порядка 2 с четвертью мкА) если ставить опорным для АЦП напряжение питания и измерять напряжение встроенной опоры по каналу 0xE АЦП. Формула расчёта напряжения перевернётся с головы на ноги (или наоборот) — и всё.
    Во-вторых, возможно, не вполне правильно подключен индикатор. По документации на контроллер SSD1306 — при использовании интерфейса I2C надо оставлять вывод D2 не подключённым.
    • 0
      Действительно, в режиме ожидания ток великоват… Виновник уже давно найден — дисплей. Если его отключить, то потребляемый ток снижается до 1мкА. Получается, что в режиме сна потребление дисплея 6-7 мкА. Единственный вариант отключать питание физически через мосфет. И проводить инициализацию дисплея каждый раз когда контроллер просыпается.
    • 0
      Забыл добавить здесь установлен не ssd1306, а sh1106 и хоть они и очень похожи, но отличия в подключении имеются.
      • 0
        ИМХО, SH1106 — это конкретная модель индикатора на базе драйвера (контроллера) SSD1306.
        P.S. Почему-то из первого комментария потерялась ссылка на описание SSD1306 — https://www.adafruit.com/datasheets/SSD1306.pdf
        • 0
          Сейчас глянул на даташит sh1106 И увидел что выводы D2-D7 неподключатся вообще или подключаются к полюсу. А я свою схему подключения брал один в один с платы на которую был напаян дисплей с обвязкой.
  • +3
    Это всё нужно делать не на Arduino, а на STM32Lxxx — там и встроенные часы, и специальные спящие режимы и встроенные RTC, а потребление меньше микроампера.
    • 0
      Посмотрел параметры и действительно этот микроконтроллер отлично бы подошёл бы в эти часы. Вот только насколько удобно было бы программировать его в Arduino и как обстоят дела с совместимостью библиотек?
      • +1
        Библиотеки не совместимы — это совсем другая архитектура. И многих библиотек там нет — придётся делать самому, но в большенстве случаев это не страшно =)
        Да, с программированием там всё не так просто, как на авр, а тем более на ардуино, но это того стоит.
        Раньше я тоже работал лишь с аврками, но когда я узнал и поработал с стм — смотрю на ардуины все как на страшный сон, но с плюсами пришли и минусы(довольно много неожиданных подводных камней), но без этого никак.
        Вообщем, советую посмотреть и начать работать с stm32 — не пожалеете ;)
        • 0
          Давно посмвтриваю на stm32, но большой порог вхождения в программирование немного отпугивает… Преимужества arduino в том, что мой проект может повторить намного больше людей, чем если бы я делал это на stm32. Которые потом смогут легко внести свои изменения в программу и легко получить желаемый результат.
          P.S. уже заказал пару платок stm32f103c8t6 на Али.
          • +1
            Порог вхождения только внешне кажется тяжёлым — уже существует довольно много хороших статей и уроков для новичков, так же есть официальные библиотеки(HAL) и программа STM32cubeMX, которые позволяют работать с stm32 не намного сложнее, чем с ардуино.

            //навсякийслучай.А заказали с программатором? А то я облажался и заказ впервый раз только платку, надеясь, что отладка тоже будет по usb =Р
            • 0
              Заказал вот такую их вроде как по UART можно прошивать.
              • +1
                Да, я так же ошибся =)

                Но на самом деле для нормальной работы и самое главное — отладки нужен программатор с SWD интерфейсом(четыре пина на конце). Там на али их много, называется "st-link v2"

                image
                • 0
                  Спасибо… Вы правы. Я ошибался… Сейчас закажу… Спасибо ещё раз…
                  • 0
                    Не за что, если возникнут вопросы — можете обращаться :3
                • 0
                  на чипах stm32l0x2 есть встроенный USB бутлоадер. можно шить прямо так, двумя проводами с USB.

                  Я шью любые stm32 с демоплат stm32-??-discovery или Nucleo по SWD
                  • 0
                    Шить можно, но отлаживать нельзя, а на стм без отладки никак.
                    • 0
                      ну ардуинщики-то как-то живут без отладчика :)
                      я-то сам через дискавери шью, и с отладчиком, и с debug output.
                      • 0
                        Согласен. На ардуино все пользуются serial monitor — хорошая альтернатива отладчику…
                        • 0
                          начнем с того, что на большом количестве stm32 аппаратных uart более одного, и подобный монитор, соответсвенно, не занимает единственный доступный uart.
                          Кстати, они недавно новые чипы анонсировали, в оч приятном корпусе TSSOP-14, с ультранизким потреблением.
                          Запросите сэмпл, что-ли(наверное лучше от имени конторы)…
                          http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1817/LN1843/PF262175
                          единственно, часы реального времени придется, видимо, оставить внешние.
          • 0
            Да вы правы. Для Arduino и паять не нужно, мост GPRS-Ethernet-RS485 делается за один вечер из готовых шилдов. Аналог stm32 — Arduino Due, та же среда разработки. Если нужен более мощный процессор — Raspbery Pi. Как-то сам хотел поработать с stm32, но им просто нет места. Все потребности покрывает Arduino с запасом.
  • 0
    Часы прикольные, но почему у вас так скачет напряжение?
    • 0
      Выше в комментариях это уже обсуждалось. Прыгает только с батарейкой с аккумулятором показания стабильны.
  • 0
    А почему использовали OLED Display? А не e-ink? Ресурс бы по времени работы бы вырос. Или вопрос стоял "из того что было"?

    Почему информация о батарее напряжением, а не индикатором в %? Более дружественно к пользователю.

    Какой ресурс работы от одной зарядки АКБ?

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

    В целом, смотрится впечатляюще)
    • +1
      Oled дисплей хорош своей невысокой ценой и тем что не требует подсветки. E-ink дисплеи не выпускают с подходящими размерами и цена довольно высокая. Я позже попробую сделать часы с sharp memory lcd прекрасная альтернатива для e-ink дисплеев.
      • 0
        Здравствуйте, а не подскажите где именно вы брали sharp memory lcd? Уже очень давно хочу приобрести его. Случаем не на сайте adafruit?
        • 0
          Я его ещё не покупал, но купить можно на adafruit или TI
      • 0
        Почему информация о батарее напряжением, а не индикатором в %? Более дружественно к пользователю.

        Какой ресурс работы от одной зарядки АКБ?
        • 0
          Напряжением потому что использовались разные источники питания то CR2032 то аккумулятор… У них разные напряжения… При желании под проценты можно легко переделать, скетч то есть…
          От батарейки CR2032 время работы 5-6 месяцев.
  • 0
    Было б там питание чуток побольше, вольта четыре хотя бы, можно было бы добавить LM35 и получить круглосуточный монитор температуры запястья пользователя. Но от трёх вольт эта микросхема не работает, а преобразователь бы резко увеличил потребление.
    • 0
      Можно попробовать с ds18b20..
      • 0
        Если для Arduino есть библиотека поддержки 1-Wire, можно и так.
        • +1
          Конечно есть =) Все работает на ура… Проверено много раз..
    • 0
      Преобразователь включается раз в минуту на 0.01 секунды…
  • 0
    Почему не используете для изготовления плат фоторезист?
    • 0
      Всё очень банально… Нет необходимых материалов… За то всегда под рукой есть утюг, виниловая пленка, лазерный принтер, перекись водорода и лимонная кислота…
      • 0
        Это иначе как левыми отмазками (да простят меня) назвать сложно. Что нужно дополнительно: сам фоторезист, УФ лампа и прозрачная пленка для принтера и кусок стекла из полки. ВСЁ! Фотошаблон печатаем на пленке тем же самым принтером, при экспонировании прижимаем стеклом, проявляем или кальцинированной содой или жидким стеклом из ближайшего хозмага, травим той же самой лимонкой с перекисью.
        Мнение о том чно нужно много дополнительного оборудования и материалов для фоторезиста иначе как заблуждением от незнания назвать сложно.
        И кстати бонусом на этих же самых материалах и оборудовании легко делается маска из однокомпонентной УФ отверждаемой маски/краски.
        • 0
          До использования мною виниловой пленки, я частенько задумывался о фоторезисте, потому как белые ворсинки, котрые оставались на печатной плате сильно усложняли процесс особенно если было много мелких дорожек. Но сейчас с использованием пленки я всегда получаю прекрасный результат. Если всё устраивает, то не вижу особого смысла что- то менять. Я не говорю что фоторезист плох, просто у меня нет уф лампы, фоторезиста и прозрачной пленки..
          • 0
            Фоторезист обладает лучшим разрешением чем ЛУТ, и нет проблем с большими полигонами, что важно в таких устройствах с микроконтроллерами.
            Фоторезист — заказывается через интернет, одного листа хватит очень надолго. УФ лампа заказывается там же где и фоторезист, по цене не дороже обычных энергосберегаек на 26Вт(или две сотни УФ светодиодов на ибее за 3...4$ на панель размером с лист А4) которые будут работать даже лучше лампы.
            Кальцинированая сода это конечно хорошо, но её прекрасно заменяет бытовая жидкость для прочистки труб(жидкость либо в гранулах).
            • 0
              Как ни крути, набор материалом и сама технология получается сложнее. Кроме того, чтобы получить хорошее разрешение с использованием лазерного принтера в случае фоторезиста нужен еще чернитель тонера — еще один расходный материал, которого нет в соседнем магазине. Я собираюсь переходить на фоторезист потому, что мне кажется, им намного проще делать двухсторонние платы. Но для этого мне придется добыть все эти недостающие материалы и отработать технологию в своих условиях. А ЛУТ он всегда со мной. И я нормально делал на нем дорожки 0,2/0,2 мм. Я много читал о фоторезисте, там такое разрешение тоже близко к предельному.
              • 0
                Фоторезист еще и технологичнее. Один раз отработать техпроцесс и дальше уже по накатанной. 0,2/0,2 — это совершенно рядовые нормы и получаются просто не глядя и чтобы запороть (при уже отработанном процессе) нужно постараться. Вот ниже, например 0,15/0,15 и ниже — уже да, надо отрабатывать и косяков не прощает, хотя основная проблема не в ФР а на этапе травления.
                Зачернитель — банка, ватка с ацетоном (дихлорэтаном, жидкостью для снятия лака)
                Сложность двусторонних плат не в самом ЛУТе, а в принципе в лазерном принтере, т.к. кроме термодеформации носителя у него есть еще и собственные искажения. Подогнать конечно можно, я делал 0,25/0,25 двусторонку 150х180мм но помучиться пришлось изрядно, конечно.
                Лучше всего фоторезист+струйник. Но это потом придет. Вместе с ламинатором, люстрой из пяти УФ ламп, вакуумным прижимом, ламинатором и ротаспреем. Конечно если будет интересно.
                • 0
                  У меня основная проблема при изготовлении двухсторонних плат в сложности совмещения рисунков. Во-первых, в отличие от пленки, используемой для засветки фоторезиста, любая принтерная бумага не очень прозрачна, что затрудняет совмещение по меткам. Во-вторых, для накатки рисунка я использую не утюг, а ламинатор. Но ламинатор при захвате склонен немного смещать бумагу относительно текстолита. И если для односторонней платы это не большая проблема, то для двухсторонних очень даже проблема.

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

                  То есть я сейчас для себя вижу перспективы в переходе на фоторезист, но даже с осознанием этого, такой переход не очень прост. Пусть материалы и не дефицитны, но их нужно добыть. И нужно время на обкатку технологии. А уж для новичка проще ЛУТа ничего нет, все делается буквально на подручных материалах, из которых все кроме принтера можно найти в ближайшем супермаркете (даже не хозмаге), а принтер, если уж дома нет, найдется на работе.
                  • 0
                    Не надо сужать рамки своих возможностей доступностью локальных магазинов, откройте для себя заказы в интернет-магазинах.
  • 0
    Можно воткнуть гироскоп и включать дисплей по взмаху руки, когда пользователь намеревается посмотреть время. Не ясно только как выйдет с энергопотреблением.

    На просторах Интернетов есть прошивка Arduino'вского загрузчика с софт USB. Позволяет загружать скетчи через USB без переходника. Правда не факт, что взлетит на 8МГц.
    • 0
      Гироскоп сам по себе работать не будет, должен ещё его показания обрабатывать и микроконтроллер. Конечно можно попробовать несколько десятков раз в секунду будить его, но потребление схемы будет довольно большим.
      А софт USB даже если и взлетит то будет сильно грузить контроллер, уж лучше использовать тогда atmega32u4 с железным USB.
      • 0
        Понятно, что сам по себе не будет. Для включения процессора можно воткнуть датчик наклона, допустим. Хотя тогда можно и без гироскопа. :)

        Какая разница, как он будет грузить процессор, если это только на время заливки скетча?
  • 0
    Всегда внимательно отношусь к конструкторам разных часов. Попытался найти на рынке часы своей мечты. В результате — полный пролет!
    Итак требования к часам моей мечты:
    1) Работа от 2х AAA 3-5 лет. Явно показывать расход батареи. В идеале работать только от отсвещения в комнате.
    2) В месяц уходить не более чем на 1 сек. Либо уметь самостоятельно сихронизироваться (на выбор: и от настраиваемой радио станции, и по WiFi, и по RDS, и по DCF77.5). Можно 1 раз в неделю.
    3) Иметь большой 10см на 20 см монохромных жидкокристаллический экран. Показывать время постоянно.
    Хотелось бы цену до 100 долл.
    Мне казалось, что каждая из задач стандартна для всего человечества для часов. Был удивлен, что на рынке предельно мало часов, которые явно (и об этом заявлено) удовлетворяют любому из требований. А уж часов, которые удовлетворяют всем 3м требованиям вообще не существует. Это я перфекционист? Мне нужно всего лишь надежно видеть время на стене.
    • +1
      Все требования осуществимы, только по отдельности. Или дешево, или качественно, или быстро, известное противоречие.
      • 0
        Тут ведь в чем дело. Мне кажется, что это логичные требования предъявляемые к каждым часам на рынке. Смотреть время на телефоне — задалбывает. Ходить все время в наручных часах — не совсем комфортно. Это ведь требования предъявляемые вот уже 50 лет и более. Нет никакого «быстро и дешево». Можно закрыть глаза на дешево — пусть будет не дешево. Но нету же…
        • 0
          Логичные, но не массовые требования. Больше всего требований к внешнему виду и дешевизне, а остальное как получится. Рынок реагирует, часы с вашими требованиями становятся невостребованными поскольку реализация данного функционала становится слишком дорогой и соответственно недоступна большинству потребителей. Остаётся только кастомная разработка, только кастом!
          Синхронизация времени это ладно, но требование к точности хода в +-1 сек в месяц входят в противоречие с требованием экономичного батарейного питания. 1 сек в месяц это необходимая точность источника опорной частоты 1ppm, которая на данный момент не реализуема без термостатирования, а значит батарейки в пролёте.
          Близкий по требованиям источник опорной частоты — ГИАЦИНТ, заявленная стабильность частоты — 0.1ppm, при этом он потребляет примерно 1.5Вт энергии.
          Поэтому, ИМХО требования необходимо пересмотреть. Раз есть требование к возможности синхронизации времени, то надо убрать требование к стабильности хода и реализуемость конструкции сразу возрастёт.
          • 0
            Есть такие микросхемы: M41T82, M41T83. После ряда мероприятий обещают 1ppm при 25 грд при потреблении 80 uA. Сама стоит 4 долл.
            • 0
              Это базовая точность в 1ppm, дальше надо обеспечить стабильность напряжения и стабильность температуры. И не дышать. И надеяться на то что кристалл кварца не деградирует через 2..5 лет и не потребует подстройки частоты. Кстати даташит говорит об уходе частоты 5ppm после двух паек… а разброс параметров между экземплярами микросхем 10ppm. Плюс ко всему, зависимость резонансной частоты самого кварца, кои бывают очень разные и по добротности в том числе(которая влияет на уход частоты из-за параметров схемы осциллятора).
              И еще пролистал по диагонали, так и не понял там кварц на 32.000КГц используется или 32.768КГц? Где-то написано про 32КГц а на схемах встречается 32.768КГц…
              • 0
                Почитал даташит на ds3231 там написано что при температуре эксплуатации от 0 до 40 градусов всего 2ppm. Вполне подходящий и недорогой вариант да и к тому же с термокомпенсацией и встроенным кварцем.
                • 0
                  Это базовая точность, т.е. минимальная. Тут еще такая фишка, добавляется нестабильность 1ppm на каждый вольт отклонения напряжения питания, не очень конечно актуально но…
                  И за первый год 1ppm уход частоты, а в пределах 10 лет +-5ppm. Каждый год надо будет компенсацию подстраивать, занося в регистр соответствующее значение компенсации, которое еще и подбирать надо по частотомеру(соответствующего класса!) поскольку цена младшего бита не регламентирована.
                  Короче, на длительных интервалах времени(5...10 лет) для обеспечения точности хода часов надо будет ими заниматься. Хотя может дико повезти и у встроенного кварца старение окажется в пределах +-1ppm за 10 лет. Но это я полагаю только в виде исключения, в реальности будет несколько хуже.
                  Судя по даташиту, если рассчитывать на точность хода в 10ppm то вы будете полностью удовлетворены этим чипом. Но перфекционизм… куда его деть? Как избавится?
    • 0
      Проблема в том что это мало кому нужно. Заказать такие кастомные часы — совсем не проблема, это только проблема стоимости поскольку оплатить надо будет не только железо а ещё и работу дизайнеров и инженеров, которые наверняка потребуют оплаты от 50$ в час.
      Да, в стационарном варианте питания от батареек будет проблема точности часов — для этого нужно термостатировать кварц, чтобы добиться точности лучше чем 1сек в сутки, при этом ЦНХ поможет победить только точность резонатора, но не его температурную зависимость.
      В принципе от этого можно отказаться если реализовать вариант первичные-вторичные часы. Те часы что вам нужны будут работать от батареек и ждать сигналы точного времени в интервале +-10 сек каждый час, таким образом экономя энергию на постоянной работе приёмника(он тоже потребляет как слон, если смотреть на большие интервалы времени). Первичные же часы работают от сети, имеют передатчик и GPS-модуль который находится в постоянной синхронизации с точным временем и выдаёт в эфир время каждую минуту. На вторичных часах достаточно предусмотреть кнопку начальной синхронизации, которая вынуждает их слушать эфир не менее 2-х минут. Достаточно использовать эту функцию один раз при смене батарей и дальше часы будут синхронизироваться сами.
      В крайнем случае, в таких часах вообще может не быть кварцевой стабилизации — просто принимать время от первичных часов и показывать их на индикаторе.

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