Arduino: светодиодные часы с синхронизацией времени

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



Итак, вот она, светодиодная лента:

Питается от постоянного тока 12 вольт. Лента состоит из соединённых между собой светодиодов размещённых на полимерной основе, с обратной стороны — самоклейка.
Ленту можно резать! И это самое главное. Места реза обозначены меткой и имеют с двух сторон контакты для пайки. Каждое такое звено состоит из трёх светодиодов и резистора, соединённых последовательно. Звенья же соединяются вместе параллельно. Таким образом, каждое звено питается от напряжения 12 вольт. Длина отрезка ленты равна 5 сантиметрам.
Ленты есть разные по мощности. Соответственно, если нужны часы для уличного применения, то необходимо брать помощнее. Для домашнего — самые тусклые, иначе в комнате будет светло как днём (не шучу).

Список того, что нам понадобится для сборки часов:

  • корпус;
  • 29 отрезков светодиодной ленты;
  • Arduino;
  • RTC (часы реального времени) на микросхеме DS1307;
  • Ethernet-shield Wiznet W5100;
  • 4 микросхемы PCF8574;
  • 4 микросхемы ULN2003A;
  • 2 резистора по 1.5 кОм;
  • 1 резистор на 3 кОм;
  • npn-транзистор, любой на напряжение питания 12 вольт и более;
  • блок питания 12 вольт;
  • макетная плата (либо можете вытравить свою), монтажные провода;
  • синяя изолента 🙂

Теперь надо всё подключить по следующим схемам:


Ethernet-shield нам понадобится для подключения к Интернету, чтобы можно было синхронизировать часы с NTP-сервером.
Ethernet Shield
Микросхемы PCF8574 — 8-битные расширители для шины I2C:

Их распиновка следующая:

  • VDD — питание 5 вольт;
  • SDA, SCL — шина I2C;
  • A0..2 — пины для установки адреса микросхемы;
  • P0..7 — входы/выходы;
  • VSS — земля.

Адресация PCF8574:

ВходАдрес на шине I2C
A2A1A0DECHEX
000320x20
001330x21
010340x22
011350x23
100360x24
101370x25
110380x26
111390x27

ULN2003A — сборка Дарлингтона. Распиновка:

  • COM — питание 12 вольт;
  • E — земля;
  • 1..7B — входы;
  • 1..7C — выходы.

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

Светодиодную ленту нарезал на кусочки и приклеил в виде восьмёрок на пластик:

Примеряем:

Теперь собираем схему и припаиваем «восьмёрки». Плюсовые выводы ленты подключаем все вместе к +12 вольт, минусовые к ULN2003A:



Пробуем включить:

Всё светится, отлично.
Для подключения точек нам понадобится любой npn-транзистор на напряжение не менее 12 вольт. Я взял первый попавшийся под руку. Это оказался C5027F-R. Ищем даташит на него, определяем местоположение коллектора, эмиттера и базы. Подключаем по схеме. Светодиоды LED1, LED2, LED3 и резистор R4 — расположены на отрезке ленты. Плюсовой вывод подключаем к питанию 12 вольт, минусовой — к коллектору транзистора. Средний светодиод заклеиваем чёрной изолентой, чтобы его не было видно.
Чтобы в комнате ночью не стало светло от таких часов, я заклеил все светодиоды двумя слоями синей изоленты и листом полупрозрачного синего пластика:



А затем всё сверху закрыл стеклом. Получились вот такие часы:


Ну и конечно исходный код скетча:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
// Скетч для Arduino. Светодиодные часы с синхронизацией.
// Версия 1.0 (29.07.2014)
//
// Автор: Гладышев Дмитрий (2014)
// http://student-proger.ru/2014/07/arduino-svetodiodnye-chasy-s-sinhronizaciej-vremeni/
 
#include <SPI.h>         //для Ethernet-shield
#include <Ethernet.h>    //   --//--
#include <EthernetUdp.h>
#include <Wire.h>        //I2C для RTC
#include <DS1307RTC.h>   //RTC
#include <Time.h>
#include <Metro.h>       //для задания интервалов времени (аля Cron)
 
//****************************************************************************************
byte mac[] = {  0xDE, 0xAD, 0x00, 0x00, 0x00, 0x00 }; //MAC-адрес Arduino
byte clock_addr[] = {0x20, 0x21, 0x22, 0x23}; //адреса PCF8574
 
IPAddress timeServer(132, 163, 4, 101);   // IP-адрес NTP сервера
const int timeZone = 8;                   // TimeZone
//****************************************************************************************
unsigned int localPort = 53;
Metro TimeSync = Metro(86400000); //Частота синхронизации (1 сутки)
 
char clockbuf[4];
 
EthernetClient client2;
EthernetUDP Udp;
 
unsigned long lastTimeUpdate = 0;
 
bool DotTimeState = false;
 
void setup() {
 
  for (int i=0; i<4; i++)
  {
    clockbuf[i]='-';
  }
  UpdateClock();
 
  // Ethernet connection:
  do 
  {
    delay(1000);
  } while (Ethernet.begin(mac) == 0);
 
  Wire.begin();
  Udp.begin(localPort);
 
  //Запрашиваем время с NTP сервера
  setSyncProvider(getNtpTime);
  //Если время получили успешно, то записываем данные в RTC
  if (timeStatus() != timeNotSet)
  {
    RTC.set(now());
  }
}
 
//==============================
 
void loop()
{
  tmElements_t tm;
 
  if (TimeSync.check() == 1) //Синхронизация по времени
  {
    //Запрашиваем время с NTP сервера
    setSyncProvider(getNtpTime);
    //Если время получили успешно, то записываем данные в RTC
    if (timeStatus() != timeNotSet)
    {
      RTC.set(now());
    }
  }    
 
  if (client2.available())
  {
    char c = client2.read();
  }
 
  if (abs(millis() - lastTimeUpdate) > 500)
  {
    lastTimeUpdate = millis();
 
    if (RTC.read(tm))
    {
      DotTimeState=!DotTimeState;
 
      clockbuf[0] = (char)(tm.Hour/10)+'0';
      if (tm.Hour<10)
      {
        clockbuf[0] = ' ';
      }
      clockbuf[1] = (char)(tm.Hour%10)+'0';
      clockbuf[2] = (char)(tm.Minute/10)+'0';
      clockbuf[3] = (char)(tm.Minute%10)+'0';
      UpdateClock();
    }
 
  }
 
}
 
//================================================
 
void reverse(char s[])
{
  int i, j;
  char c;
 
  for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
  }
}
 
void itoa(int n, char s[])
{
  int i, sign;
 
  if ((sign = n) < 0)  /* записываем знак */
  n = -n;          /* делаем n положительным числом */
  i = 0;
  do {       /* генерируем цифры в обратном порядке */
    s[i++] = n % 10 + '0';   /* берем следующую цифру */
  } while ((n /= 10) > 0);     /* удаляем */
  if (sign < 0)
    s[i++] = '-';
  s[i] = '\0';
  reverse(s);
}
 
int len(char *buf)
{
  int i=0;
  do
  {
    i++;
  } while (buf[i]!='\0');
  return i;
}
 
void UpdateClock()
{
  for (int i=0; i<4; i++)
  {
    Wire.beginTransmission(clock_addr[i]);
    Wire.write(SegmentValue(clockbuf[i]));
    Wire.endTransmission();
  }
}
 
byte SegmentValue(char k)
{
  byte u;
  switch (k)
  {
    case '0':
      u=B1111110;
      break;
    case '1':
      u=B0110000;
      break;
    case '2':
      u=B1101101;
      break;
    case '3':
      u=B1111001;
      break;
    case '4':
      u=B0110011;
      break;
    case '5':
      u=B1011011;
      break;
    case '6':
      u=B1011111;
      break;
    case '7':
      u=B1110000;
      break;
    case '8':
      u=B1111111;
      break;
    case '9':
      u=B1111011;
      break;
    case '-':
      u=B0000001;
      break;
    case ' ':
      u=B0000000;
      break;
    case 'E':
      u=B1001111;
      break;
    case 'U':
      u=B0111110;
      break;
    case 'u':
      u=B0011100;
      break;
    case 'I':
      u=B0110000;
      break;
    case 'i':
      u=B0010000;
      break;
    case 'O':
      u=B1111110;
      break;
    case 'o':
      u=B0011101;
      break;
    case 'P':
      u=B1100111;
      break;
    case 'A':
      u=B1110111;
      break;
    case 'S':
      u=B1011011;
      break;
    case 'F':
      u=B1000111;
      break;
    case 'H':
      u=B0110111;
      break;
    case 'J':
      u=B0111100;
      break;
    case 'L':
      u=B0001110;
      break;
    case 'C':
      u=B1001110;
      break;
    case 'B':
      u=B1111111;
      break;
    case 'b':
      u=B0011111;
      break;
    case 'd':
      u=B0111101;
      break;
    case '°':
      u=B1100011;
      break;
    default:
      u=B0000000;
  }
 
  byte t=0;
 
  //переворачиваем биты
  for (byte i=0; i<7; i++)
  {
    if ((u&(1<<i))!=0)
    {
      t=t|(1<<(6-i));
    }
  }
  u=t;
 
  u=u<<1;
  if (DotTimeState)
  {
    u=u+1;
  }
 
  return u;
}
 
 
/*-------- NTP code ----------*/
 
const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets
 
time_t getNtpTime()
{
  while (Udp.parsePacket() > 0) ; // discard any previously received packets 
  sendNTPpacket(timeServer);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) 
  {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) 
    {
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }  
  return 0; // return 0 if unable to get the time
}
 
// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}
 
/*-------- NTP code END ----------*/

Смотрим строки 16-20:

16
17
18
19
20
byte mac[] = {  0xDE, 0xAD, 0x00, 0x00, 0x00, 0x00 }; //MAC-адрес Arduino
byte clock_addr[] = {0x20, 0x21, 0x22, 0x23}; //адреса PCF8574
 
IPAddress timeServer(132, 163, 4, 101);   // IP-адрес NTP сервера
const int timeZone = 8;                   // TimeZone

mac — MAC-адрес Ethernet-shield. В принципе, можете оставить таким же.
clock_addr — адреса микросхем PCD8574 на шине I2C. Если не меняли, то должны быть такими же. Определить адреса можно с помощью скетча i2c_scanner, который есть в конце статьи.
timeServer — IP-адрес NTP-сервера.
timeZone — номер часового пояса.

Видео посетителей сайта, оставленные ими в комментариях:
Павел:

AlexSoft:

Файлы
Скетч (7.15 KB)

Библиотеки:
DS1307RTC (4.8 KB)
Time (23.2 KB)
Metro (76.11 KB)

I2C scanner (1.02 KB)

Работа проверялась с Arduino IDE v1.0.5-r2.
Библиотеки являются собственностью их авторов!

Предупреждение!
Автор не несёт ответственности за возможную порчу оборудования. Всё, что вы делаете — вы делаете на свой страх и риск!

Похожие записи:

99 Комментарии “Arduino: светодиодные часы с синхронизацией времени

  1. Часы с синхронизацией времени по интернету, это что-то новенькое!
    Вот, если часы дома не синхронизируются — это проблема, секунду в секунду их всё равно не настроить…
    Классные часы, в темноте наверно светятся клёво:)

      1. Подскажи пожалуйста, схему полностью проверял, после заливки скретча не работает индикатор, выход есть только на 10 pin uln2003a, Подскажи как протестировать работу скретча!

        1. Если на 10 выходе есть питание, то должны гореть 4 тире

          "-- --"

          . Не горят? Получает ли Ethernet-shield IP-адрес от роутера? Это можно проверить в настройках роутера. Если необходимо, можно установить статический IP в скетче.

          1. Да горят но время не показывает и они просто постоянно горят, Ethernet-shield IP получает ip-адрес от роутера, у нас в сети тоже есть ntp server. Я так понимаю, что микросхема pcf подает питание на uln и она должна давать выход на ноги с 16 по 10, но у меня постоянно только горит «—:—«. А да перед заливкой скетча горят все индикаторы вместе! Помогите разобраться!

          2. PCF подаёт сигнал на входы ULN. На соответствующих выходах ULN появляется земля.
            Необходимо найти, а каком месте зависает. Сразу после строки «void setup()» добавьте «Serial.begin(9600);». Далее по коду расставьте вывод в консоль последовательных чисел. И смотрите в выводе порта. Какое число появится последним, в том месте и зависание.
            Пример:

            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            45
            46
            47
            48
            49
            50
            51
            52
            53
            54
            55
            56
            57
            58
            59
            60
            61
            62
            63
            
            void setup() {
              Serial.begin(9600);
              Serial.println(1);
              for (int i=0; i<4; i++)
              {
                clockbuf[i]='-';
              }
              UpdateClock();
              Serial.println(2);
              // Ethernet connection:
              do 
              {
                delay(1000);
                Serial.println(3);
              } while (Ethernet.begin(mac) == 0);
              Serial.println(4);
              Wire.begin();
              Serial.println(5);
              Udp.begin(localPort);
              Serial.println(6);
              //Запрашиваем время с NTP сервера
              setSyncProvider(getNtpTime);
              Serial.println(7);
              //Если время получили успешно, то записываем данные в RTC
              if (timeStatus() != timeNotSet)
              {
                RTC.set(now());
              }
              Serial.println(8);
            }
          3. Спасибо буду пробовать, а без семисегментного индикатора на выходах uln мультиметром должно показывать.? А отличие ULN2003A от ULN2003AN есть? Может в этом причина. Сканером адреса PCF показывает I2C Scanner
            Scanning…
            I2C device found at address 0x38 !
            I2C device found at address 0x39 !
            I2C device found at address 0x3A !
            I2C device found at address 0x3B !
            I2C device found at address 0x68 !
            done
            Это правильно?

          4. Спасибо функция Serial.println(1); помогла! А можно как нибудь вывод температуры с ds18b20 вывести на индикаторы?

          5. Что значит помогла? Эта функция только выводит число в консоль для отладки. Она не может решить проблему, если она имеется. Адреса PCF прописали?
            Температуру вывести можно, у меня сейчас так и сделано. Думаю как-нибудь выложу обновлённый код устройства.

  2. Здравствуйте. Очень интересный проект. А нельзя ли переделать блок индикации под газоразрядные лампы? К примеру 155ИД1 и ИН-12. Очень они мне нравятся.

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

  3. Чудесно работает! В доме первые совершенно точные часы! Жаль синхронизация по шнурку а не по WIFI в роутере больше нет входов.

  4. Абсолютно точно ходят часы. Секунда в секунду, как на САЙТЕ СИНХРОНИЗАЦИИ. Опережают местное время на 4 секунды. Уж не знаю почему. Я доволен как слон.

  5. спасибо! мне кажется проблема в моем RTC модуле после установки точного времени все работает точно неделю потом замечаю что спешат
    сейчас сделал (86400); //Частота синхронизации . пожевем посмотреть!

  6. Здравствуйте! Повторил ваш проект, очень понравилось, спасибо вам! ещё вопрос, можно ли сюда прикрутить ds18b20 ? если можно помогите с кодом

    1. Здравствуйте. Да, можно. У меня уже так и работает. Я объединил эти часы со вторым своим проектом — метеостанцией. На днях постараюсь выложить код для всего устройства.

  7. Очень жду, потому что часы по плану будут встроены в стену, хотелось бы быстрее доделать их до конца и закончить ремонт дома, и радоваться )))

  8. Добрый день, Когда вы выложите проект часов с метеостанцией? очень уж жду, или может скините мне на почту?

    1. Здравствуйте. Лично я с Arduino Pro mini не работал, но думаю никаких препятствий не должно быть. Особенно если версия 5 вольтовая.

  9. Здравствуйте. Хочу повторить проект. Есть несколько вопросов. Каким образом осуществляется соединение с сетью Интернет? Часы каким нибудь образом отображают соединение с сервером синхронизации, удачную синхронизацию? Люди в коментах пишут, что часики спешат либо отстают. При синхронизации раз в сутки такого не должно быть.

    1. Здравствуйте. Соединение с помощью Wiznet W5100. Отображения синхронизации нет. Комментарий о неточности хода пока только один. У меня всё работает без проблем. Корпус кварца на RTC посадил на землю.

  10. День добрый. Спасибо автору за проект, очень помог в изучении дуинки.
    На основе этих часов делаю большой индикатор для отображения температуры/даты/времени.
    Практически все работает, только никак не могу разобраться, где в приведенном коде активация «двоеточия» на четвертой ноге первой PCF8574.
    Просто я хочу сделать отдельное управление верхней и нижней точкой, чтоб было понятно, что выведено на табло: дата (просто точка) или время (мигающее двоеточие)

    1. Здравствуйте. Это строки 270-273. За двоеточие отвечает последний (младший разряд) в байте данных. В моей программе он изменяется на всех четырёх микросхемах, т.е. фактически вывод можно делать с любого чипа. Для вашего случая необходимо сделать дополнительную проверку на номер чипа.

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

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

  12. Здравствуйте. Рискну спросить еще раз, нельзя ли переделать блок индикации под газоразрядные лампы? К примеру 155ИД1 и ИН-12? Что-то у меня так и не вышло…

      1. Здравствуйте, проблема с програмной частью. На самом деле проблем нет, есть куча проектов, даже с синхронизацией по GPS, но все на Atmega, а очень хочется на STM32F0. К сожадению опыт программирования только Бэйсик и Паскаль (и то остатки). Поэтому могу выслать и схемы и исходные коды для програмного решения для Atmega. Да вы и сами можете найти. если вобъете в поисковике Nixie Clock или часы на газоразрядных индикаторах.

  13. Зажигаются они просто: +180 В на анод лампы, выводы цифр на соответствующий выход К155ИД1. А вот как подать код на вход дешифратора.

    1. Если я правильно понял, то нужно сформировать на выходах PCF8574 такие сигналы как в таблице на этой странице: http://www.microshemca.ru/ID1/
      Вместо тех сигналов, которые формируются для семисегментных индикаторов. Значит нужно соединить по 4 вывода с PCF8574 к К155ИД1. Чуть позже подробнее распишу и постараюсь код дать.

      1. На к155ид1 лучше не повторять, вот здесь отличная схемка вот здесь http://www.nixieclock.com.ua/#!kit-in-14-mini-4-tube/cq7i
        С процессора идут сигналы на счетчик который силовыми ключами подает на католы лампы напряжение и подсвечивает их. Если схему посмотрите сразу все поймете. Если можно напишите на почту в личку, я смогу детально описать и предоставить схемки.

    1. Отстали за неделю примерно на минуту — и сами синхронизировались! Т.е. получается синхронизация проходит не стабильно.

          1. Здравствуйте. Не совсем понял вопрос. Светодиодная лента нарезана и приклеена к пластику. Затем вся электроника помещена в деревянный корпус и прикрыта стеклом.

  14. Здравствуйте, а возможно ли такое повторить на плотформе STM32F0 ? Если да, то могу Вам подсказать решение для SOVA.
    @ @@
    sova
    24 августа 2015 в 15:19
    Зажигаются они просто: +180 В на анод лампы, выводы цифр на соответствующий выход К155ИД1. А вот как подать код на вход дешифратора.
    @@@
    Просто есть элементная база и принципиальная схема, без применения К155, но вот программирование у меня хромает.
    Если можно, то напишите в личку.

    1. На STM32 конечно повторить возможно. Только код естественно другой будет. У меня сейчас только нет возможности перекинуть STM32 из другого проекта.

  15. Могу подарить подопытный проц. STM32F030F4P, в чип и дип он рублей 80 стоит, и письмом отправить. В общем пишите в личку обсудим все моменты.

    1. Питаю от блока питания светодиодных лент. Есть такие специально для создания светодиодного освещения. Выдаёт 12 вольт. Мощность выбирается по необходимости. Для часов много не надо, поэтому брал 36 Ватт, запас большой остаётся. От него же можно и питать остальную часть схемы, если поставить стабилизатор напряжения (КРЕНка)

      1. А насколько эти блоки стабилизированы? Просто ленты то питаются напряжением, а не током, вот и интересует, на сколько там критично отклонение….

  16. Здравствуйте. Очень понравился ваш проект. Подскажите пожалуйста как изменить скетч так чтобы часы выводились в монитор порта с сохранением синхронизации. (использую Arduino 1.6.6 Arduino Mega2560 и часы DS3231)

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

      1. Лежит он дня по 3-4, проверить можно с компа либо просто передёрнуть сетку на часах. Может и на дольше ложится. Я замечаю, когда часы сильно отстают. Начинаю передёргивать сеть — далеко не каждый день соединяется. Ещё от времени суток зависит. Эти дни опять не обновляется. Не плохо бы к этим часикам GPS прикрутить, например как https://sourceforge.net/projects/arduinoledgpsclock/

  18. Здравствуйте, тоже заинтересовался синхронизацией. Собрана схема из брошюры «В помощь радиолюбителю» выпуск 95 за 1986 год. С доработкой заключающейся подключением индикаторов к дешифратору через эмиттерные повторители. Схема на К176 серии. Как подружить это ретро с Arduino.
    И в финале добавить табло обратного отсчёта. До **:**:** осталось **:**:**

    1. Здравствуйте. Подключить PCF8574 к К176. Изменить данные, которые поступают на PCF8574 в соответствии с даташитом на К176. По сути, вся функция SegmentValue превратится в такую:

      155
      156
      157
      158
      
      byte SegmentValue(char k)
      {
        return k - '0';
      }
  19. Здравствуйте. Отличный проект, огромное спасибо! Только у меня появилась проблема с ULN2003A. Когда подаю на вход 7 едениц (цифра 8) на выходе получаю не 7 нолей, а 7 едениц. Поэтому цифра 8 у меня не горит. А когда вывожу цифру 9 или 0, один оставшийся сегмент горит в пол накала, хотя должен быть потушен (на вход ULN2003A подаю 0, на выходе получаю 3 В ). Не подскажите в чем может быть проблема. Схему собрал по вашему примеру.. Спасибо.

    1. Здравствуйте. Как-то у вас не правильно работают ULN… Они просто физически никак не могут выдавать единицу на выход. Там может появляться только земля при подаче единицы на вход.
      С явлением свечения в полнакала знаком. Это убит канал в ULN. Сам недавно столкнулся с неработоспособностью двух каналов в ULN при сборке цветомузыки.

  20. Здравствуйте. Собрал. Все все отлично работает. Спасибо….
    У меня вопрос. В период с 0 до 9 часов на первом индикаторе 7Seg1 не должен ли гореть «0»? (Может у меня глюки из-за длины проводов линии i2s, около 10м. Хотя «1» и «2» нормально работают).
    А то у меня получается « 9:45», а хотелось бы «09:45».
    Как этот «0» в первом индикаторе 7Seg1 дописать в проект?
    Заранее спасибо.

      1. Здравствуйте! Скажите пожалуйста, а Ваш проект часов можно сделать на базе Ардуино Нано на процессоре Атмега 168? Спасибо!

  21. Здравствуйте Дмитрий! Помогите пожалуйста разобраться, Ваш скетч со всеми библиотеками запускаю на проверку в Ардуино 1.6.7, плата UNO, вот вываливаются следующие ошибки компиляции, что это и где искать? Большое спасибо!

    In file included from C:\Users\Stroevv\Documents\Arduino\libraries\Time\DateStrings.cpp:11:0:

    C:\Users\Stroevv\Documents\Arduino\libraries\Time\DateStrings.cpp:41:22: error: variable ‘monthNames_P’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’

    PGM_P monthNames_P[] PROGMEM =

    ^

    C:\Users\Stroevv\Documents\Arduino\libraries\Time\DateStrings.cpp:58:20: error: variable ‘dayNames_P’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’

    PGM_P dayNames_P[] PROGMEM = { dayStr0,dayStr1,dayStr2,dayStr3,dayStr4,dayStr5,dayStr6,dayStr7};

    ^

    C:\Users\Stroevv\Documents\Arduino\libraries\Time\DateStrings.cpp:59:24: error: variable ‘dayShortNames_P’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’

    char dayShortNames_P[] PROGMEM = «ErrSunMonTueWedThrFriSat»;

    ^

    exit status 1
    Ошибка компиляции.

  22. Здравствуйте. Все работало прекрасно, но вот появился глюк: на пол секунды появляются непонятные цифры потом часы идут нормально, время не сбивается и так далее. Лечится кнопкой reset. Где копать не подскажете?

    1. Здравствуйте. Расстояние от дисплея до микроконтроллера большое? Предполагаю, что помехи на шине I2C. У меня такое бывает, когда холодильник за стенкой включается. Но у меня провод около двух метров.

  23. Здравствуйте. Расстояние от дисплея до микроконтроллера 200мм-в одной коробке. Два года работало без единого сбоя!

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

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