часы светодиодная лента

skoctehs
Offline
Зарегистрирован: 27.02.2016
#include <MsTimer2.h>
const char now[] = __TIME__;

// d0,d2-d7 uln2003 7segm abcdefg
//d11 d12 key hour min
//a3 a2 a1 a0 digit hr10 hr1 mn10 mn1

// динамическая индикация 2000мкс
// регулируем яркость
#define t_light_no4 150 // светит = ночью
#define t_light_day 500//=1/16  днем 
#define t_dark_no4 1850 // темно = до 2000 заполнение паузы
#define t_dark_day 1500


byte dg[10] = {0x7F, 0x0E, 0xb7, 0x9f, 0xce, 0xdb, 0xfb, 0xf, 0xff, 0xdf};
byte tt1, tt2 = 0;
byte hr, mn, mnf, hr10, hr1, mn10, mn1;
bool no4 = LOW; // ночь табло темнее

void setup() {

  MsTimer2::set(60083, flash); // коррекция хода часов каждую  минуту =  83 миллисекунды задержка.
  //за 7ч:40м =460минут убежали на 38000 миллиsec  вперед = 82.6мс
  
  MsTimer2::start();


  // put your setup code here, to run once:
  DDRD = B11111111;
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);


  hr =  atoi(&now[0]);
  mn = atoi(&now[3]);
  mnf = mn;
  hrmn();
  //seconds = atoi(&now[6]);



}

void flash()
{
  mnf++;
}


void hrmn() {
  // расчет единиц и десятков
  hr10 = int(hr / 10);
  hr1 = hr - 10 * hr10;
  mn10 = int(mn / 10);
  mn1 = mn - 10 * mn10;
  if ((hr < 7) or (hr > 20)) no4 = HIGH; else no4 = LOW;
}


void tik()
{ // 1 минута

  if (mnf != mn) {               // прошла минута
    mn = mnf;
    if (mnf == 60)
    {                           // 1 час
      mnf = 0;
      mn = 0;
      hr++;
      if (hr == 24) hr = 0;
    }
    hrmn();                     // коррекция индикации
  }
}


void key_k() {


  if (digitalRead(11) == 0) tt1++ ; else tt1 = 0;
  if (digitalRead(12) == 0) tt2++ ; else tt2 = 0;

  // 1 цикл опроса  8 ms * 50 = 400мс
  if (tt1 > 50) {
    hr++;
    tt1 = 0;
    if (hr > 23)hr = 0;
    hrmn();
  }
  if (tt2 > 50) {
    mnf++;
    tt2 = 0;
    if (mnf > 59) mnf = 0;
    mn=mnf;
    hrmn();
  }

}



void loop()
{
  tik(); // контроль хода часов
  dyn_ind(); // индикация
  key_k(); // контроль кнопок
}


void light()
{ // время свечения цифры
  if (no4) delayMicroseconds(t_light_no4); else delayMicroseconds(t_light_day);
}

void dark()
{ // время не свечения между цифрами
  if (no4) delayMicroseconds(t_dark_no4); else delayMicroseconds(t_dark_day);
}


void dyn_ind()
{
  // индикация динамическая 8 мс цикл
  // яркая =каждая цифра 2 мс 1/4
  // ночь = каждая цифра светит 500 мкс, затем темнота 1500 микросекунд

  PORTD = dg[hr10];
  digitalWrite(A3, HIGH);
  light();
  digitalWrite(A3, LOW);
  dark();
  PORTD = dg[hr1];
  digitalWrite(A2, HIGH);
  light();
  digitalWrite(A2, LOW);
  dark();
  PORTD = dg[mn10];
  digitalWrite(A1, HIGH);
  light();
  digitalWrite(A1, LOW);
  dark();
  PORTD = dg[mn1];
  digitalWrite(A0, HIGH);
  light();
  digitalWrite(A0, LOW);
  dark();
}

 

skoctehs
Offline
Зарегистрирован: 27.02.2016

skoctehs
Offline
Зарегистрирован: 27.02.2016
004 // d0,d2-d7 uln2003 7segm abcdefg
005 //d11 d12 key hour min
006 //a3 a2 a1 a0 digit hr10 hr1 mn10 mn1
 
любая светодиодная лента на 12в, нарезанная на кусочки-сегменты, в которых есть резистор
цифра состоит из 7 сегментов соединенных плюсами - анодами
катоды - минусы сегментов ABCDEFG подключены к выходу микросхемы 2003
 
Arduino nano v3, uln2003, bc237(npn)=4 , КТ814(pnp Ic=0.5A)=4, кнопки=2, светодиоды=2, резисторы=R :)
БП 12в, 5в
Точность хода +-1мс в минуту, задается внутренним прерыванием. Около 1 минуты в 40 суток.Подстройка в строке 23
Динамическая индикация = каждая цифра по 2 миллисекунды. Заполнение определяет яркость. строки 8-14
 
ардуино а3 - транзисторы анод цифры десятки часов
а2 -часы
а1 -десятки минут
а0 - минуты