Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Берлинские часы

Компоненты и расходные материалы

Arduino UNO
× 1
Maxim Integrated max7219
Только микросхема, которая используется в выводах светодиодной матрицы ...
× 1
Часы реального времени (RTC)
× 1
5 мм светодиод:желтый
× 13
5 мм светодиод:красный
× 11
Резистор 10 кОм
× 1

Об этом проекте

Прежде всего ...

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

Введение:Берлинские часы

Берлинские часы, BerlinUhr или Mengenlehreuhr, вероятно, были самыми первыми цифровыми часами.

Здесь с 1975 года ...

Много информации вы можете найти здесь:https://en.wikipedia.org/wiki/Mengenlehreuhr

Как это сделано, как узнать время?

Короче говоря, есть четыре ряда фонарей. В верхнем ряду даны часы x 5, в следующем - «отдельные часы» от 1 до 4. В третьем ряду даны «минуты x5», в нижнем ряду - минуты.

На изображении (на самом деле одна лампа разбита ...) время составляет:2x5 часов плюс 3 часа + 6x5 минут + 2 минуты.

Итак, 13:32. Хорошо, я полагаю, мы, европейцы, привыкли определять время по 24 часам. формат, как и часы.

Самый большой индикатор сверху мигает каждую секунду.

Я подумал, что эти часы может быть забавным сделать в Arduino.

Шаг 1. Немного электроники

Что нам нужно для этого проекта?

В первую очередь (конечно же) наш Arduino.

Я использую одну из своих Uno, которые лежат повсюду возле моего компьютера.

Поскольку мы говорим о часах, мы могли бы использовать RTC. Я использовал дешевый с DS 1307.

Для «дисплея» нам понадобятся светодиоды. Я использовал 13 желтых, 5 мм и 11 красных. (Я на самом деле использовал RGB для красных, так как у меня не было достаточно красных ...)

Макет, печатная плата только с дырками и «островками припоя». Я просто использовал часть так называемого «еврокарт-формата».

2 резистора я использовал. Один 220 Ом (индикатор секунд), а другой 68 кОм.

И еще одна дополнительная микросхема:MAX7219.

MAX - это 8-разрядный драйвер светодиодного дисплея. Многие из нас знают его, так как он также используется в светодиодных матрицах.

Для простоты я также использовал библиотеку Arduino «LedControl». Если у вас его все еще нет, вы можете скачать его отсюда:

https://github.com/wayoda/LedControl

Шаг 2. Настройка.

Вы можете найти очень хороший технический паспорт этого MAX 7219 здесь:

https://www.sparkfun.com/datasheets/Components/Gen ...

COM-09622-MAX7219-MAX7221.pdf

Я не буду больше вдаваться в эту таблицу данных, но ее стоит использовать, это своего рода "забавная" ИС.

Переход к Arduino.

На этой схеме вы видите очень простую конструкцию:я использую SDA и SCL для использования часов (прорыв A 1307) и еще четыре выхода:DataIn, Clock и Chipselect, которые идут на MAX 7219, и OUT 13, которые мы используем для наших мигает светодиод "секунды".

Большинство вещей действительно происходит в Arduino:он считывает часы, преобразует их в различные типы вывода, а затем отправляет данные в 7219.

Когда вы прочтете код, вы увидите, что я использую для этого просто свой родной язык, голландский. Например:int "vijfuren", который я использую, - это переменная, которая считает "Пять часов", то же самое для "vijfminuten" и "vijfminuten1":они дают результат "Пять минут".

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

В схеме Fritzing (c) микросхема не подключена:я сделал это для простоты, так как у нее много выходов.

Подведем итоги:

контакты 4 и 9 подключены к GND,

19 - это VCC

18, ISet, подключен к VCC с помощью резистора:он ограничивает ток, идущий на выходы. Сначала я попробовал с резистором 20 кОм, но через 10 минут или около того все потемнело ... Теперь с резистором 68 кОм часы все еще работают (более чем через 24 часа). Но есть разница между яркостью красного и желтого цветов, я думаю, это связано с тем, что красные на самом деле являются светодиодами RGB. Я должен разобраться с этим ...

пин 1 - это DataIn, он идет от Arduino, пин 12

вывод 12 - это нагрузка, поступающая от вывода 10 Arduino

вывод 13 - это Clk, идущий от Arduino 11.

Пока что для входов 7219.

Взглянем на результаты:

7219 может питать 8 7-сегментных дисплеев.

Эти выходы, от DIG 0 до DIG 4, используются здесь для управления «линиями» светодиодов:так как «пятиминутная» линия состоит из 11 светодиодов, я использую DIG 1 и DIG 2 для управления ими.

Другие выходы:сегменты от A до G и DP (обычного 7-сегментного дисплея).

В этом случае (с LedControl) я отправляю им двоичные слова (байтовая форма, например, B01010100).

И тут я ошибся. Какая-то логика подсказывала мне, что SEG A будет MSB, B - вторым наиболее значимым битом и так далее, до DP, который, как я думал, будет младшим значащим битом (LSB). Неправильно ... По тем или иным причинам производители IC думали, что DP будет MSB. Не вижу логики этого ...

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

Шаг 3. Светодиоды

На этой схеме вы видите, как светодиоды соединены вместе. Я нарисовал только первые три, остальные тоже.

Светодиод секунд подключен прямо к контакту 13.

На картинке показано «как это работает». Сейчас 17:47 ...

Ладно, нижний ряд не такой четкий, он на макетной плате. Надеюсь, вы мне поверите, что это действительно работает. (это так!).

О, впереди еще один шаг ...

Шаг 4:Шаг «последний», Код.

  #include  #include  const int DS1307 =0x68; // A5 =SCL, A4 =SDA const char * days [] ={"воскресенье", "понедельник" , «Вторник», «Среда», «Четверг», «Пятница», «Суббота»}; const char * months [] ={«Январь», «Февраль», «Март», «Апрель», «Май», «Июнь», «июль», «август», «сентябрь», «октябрь», «ноябрь», «декабрь»}; byte second =0; байтовая минута =0; байтовый час =0; байт дня недели =0; байт monthday =0; байт месяц =​​0; байт год =0; byte lastMinute =0; байт lastSecond =0; int Led =13; нулевой байт =B0000000; байт een =B01000000; байт twee =B01100000; байт drie =B01110000; байт vier =B01111000; байт vijf =B01111100; byte zes =B01111110; байт zeven =B01111111; byte acht =B11111111; байт negen =B01000000; byte tien =B01100000; byte elf =B01110000; Int a =0; int b =0; int c =0; int vijfMinTwee =0; int uitgang =LOW; / * контакт 12 подключен к DataIn, контакт 11 подключен к CLK, контакт 10 подключен к LOAD * / LedControl lc =LedControl (12, 11, 10, 1); unsigned long delaytime =100; пустая настройка () {Wire.begin (); Serial.begin (9600); pinMode (Led, OUTPUT); lc.shutdown (0, false); / * Устанавливаем средние значения яркости * / lc.setIntensity (0, 8); / * и очищаем дисплей * / lc.clearDisplay (0);} void loop () {readTime (); digitalWrite (Led, uitgang); if (second! =lastSecond) {if (uitgang ==LOW) uitgang =HIGH; иначе uitgang =LOW; digitalWrite (Led, uitgang); lastSecond =второй; } если (минута! =lastMinute) {printTime (); lastMinute =минута;}} byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16));} void printTime () {char buffer [3]; long minuten =minute; long uren =час; int vijfmin =минуты / 5; int eenminuut =минут - (vijfmin * 5); int vijfuren =uren / 5; int eenuren =uren - (виджфурен * 5); а =vijfmin; digitaal (); vijfmin =b; vijfMinTwee =c; a =eenminuut; digitaal (); eenminuut =b; а =vijfuren; digitaal (); vijfuren =b; a =eenuren; digitaal (); eenuren =b; lc.setRow (0, 4, vijfuren); lc.setRow (0, 3, eenuren); lc.setRow (0, 1, vijfmin); lc.setRow (0, 2, vijfMinTwee); lc.setRow (0, 0, eenminuut);} void readTime () {Wire.beginTransmission (DS1307); Wire.write (байт (0)); Wire.endTransmission (); Wire.requestFrom (DS1307, 7); второй =bcdToDec (Wire.read ()); минута =bcdToDec (Wire.read ()); час =bcdToDec (Wire.read ()); будний день =bcdToDec (Wire.read ()); monthday =bcdToDec (Wire.read ()); месяц =​​bcdToDec (Wire.read ()); год =bcdToDec (Wire.read ()); } void digitaal () {переключатель (a) {case 0:b =nul; c =нуль; ломать; случай 1:b =een; c =нуль; ломать; случай 2:b =тви; c =нуль; ломать; случай 3:b =drie; c =нуль; ломать; случай 4:b =vier; c =нуль; перерыв; случай 5:b =vijf; c =нуль; ломать; случай 6:b =zes; c =нуль; ломать; случай 7:b =zeven; c =нуль; ломать; случай 8:b =ахт; c =нуль; ломать; случай 9:b =acht; с =неген; ломать; Случай 10:b =ахт; c =tien; ломать; case 11:b =acht; c =эльф; ломать; }}  

Думаю, довольно просто.

Еще одно преимущество этого скетча:теперь вы научитесь считать по-голландски ... От 0 до 11 ...;-)

Надеюсь, вам это понравится!

Марк

Код

Github
https://github.com/wayoda/LedControlhttps://github.com/wayoda/LedControl

Производственный процесс

  1. Уравнения постоянной времени
  2. Часы с кукушкой
  3. Песочные часы
  4. Посмотреть
  5. Сон питона ()
  6. Rpibot - Об обучении робототехнике
  7. Часы видения Arduino pov
  8. Генератор часов Verilog
  9. Python — Дата и время
  10. Зеркальные часы бесконечности