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

Основные часы

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

Arduino UNO
× 1
Дисплей DMD Freetronics
× 1
Модуль RTC
× 1
Мгновенная кнопка
× 1
Переключатель включения / выключения
× 1

Приложения и онлайн-сервисы

IDE Arduino

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

О

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

Вам понадобится:

● Дисплей Freetronics DMD

● Модуль часов реального времени для Arduino

● Зуммер (необязательно - что-нибудь достаточно громкое, чтобы разбудить вас утром)

● Кнопка с мгновенным включением

● 2 кнопки включения-выключения (одна кнопка питания не обязательна)

● Плата, совместимая с Arduino UNO или Arduino

● Proto-shield для Arduino (опционально)

● Блок питания для Arduino

● Регулируемый источник питания 5 В постоянного тока, рассчитанный на 4–30 А (дополнительно для высокой яркости - не требуется для нормальной работы)

Строительство:

Часть 1. Электроника:

Шаг 1. Подключите зуммер, кнопку отключения звука и переключатель будильника к макетной плате

Шаг 2:Подключите один из контактов каждого переключателя к земле, а контакт GND зуммера к контакту GND на Arduino (как показано на схеме)

Шаг 3:Подключите другой контакт переключателя установки аварийной сигнализации к D2, контакт отключения звука к D3 и зуммера к D4

Шаг 4. Подключите модуль RTC к Arduino в соответствии с его типом (прочтите данные производителя - в большинстве случаев следуйте диаграмме)

Шаг 5:Подключите DMDCON к Arduino и подключите DMD

Шаг 6:Для полной яркости DMD подключите источник 5 В к клеммам High Brightness

Шаг 7:Если вы хотите сделать это на прототипе экрана, припаяйте все части к экрану и подключите соответствующим образом

Часть 2 - Программное обеспечение:

Сначала вам нужно установить библиотеку DMD, доступную отсюда, и установить ее в папку ваших библиотек.

Программное обеспечение можно загрузить из Prototyping Corner или внизу этой страницы. Он содержит основные операции для Master Clock.

Чтобы установить время на модуле RTC, найдите строки 117–124 и установите в них текущее время. Теперь раскомментируйте строку 124 и загрузите ее в Arduino. Теперь снова прокомментируйте строку 124 и загрузите снова. Если этого не сделать, время RTC останется прежним.

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

1 =воскресенье

2 =понедельник

3 =вторник

4 =среда

5 =четверг

6 =пятница

7 =суббота

Затем в строке 594 установите время срабатывания будильника в 24-часовом формате.

Дальше:

Добавление дополнительных дисплеев:

Вы можете добавить больше дисплеев DMD, чтобы часы стали больше. Прочтите это для получения дополнительной информации.

Добавление дополнительных будильников:

Чтобы добавить больше сигналов тревоги, добавьте в эскиз следующие строки кода и вызовите пустоту в основном цикле:

void CheckAlarm-ALARM-NO- () {

AlarmSet =digitalRead (AlarmSetPin); .

Snooze =digitalRead (SnoozePin);

байт, секунда, минута, час, день недели, день месяца, месяц, год;

getDateDs1307 (&секунда, &минута, &час, &dayOfWeek, &dayOfMonth, &month, &year);

/ * Только активировать тревогу, если это день, указанный ниже. Это можно изменить, изменив числа на любое из следующих:

1 =воскресенье

2 =понедельник

3 =вторник

4 =среда

5 =четверг

6 =пятница

7 =суббота

* /

if (dayOfWeek ==2 || dayOfWeek ==3 || dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6) {// Это дни, РАЗРЕШЕННЫЕ для включения будильника

if (hour ==18 &&minute ==05) {// Установить время здесь (в 24-часовом времени)

if (AlarmSet ==LOW) {// Если сигнал тревоги включен

Snooze =digitalRead (SnoozePin);

while (Snooze ==HIGH)

{

Snooze =digitalRead (SnoozePin);

// Добавляем, что здесь происходит

}

}

}

}

Код

  • Код для главных часов
Код для основных часов C / C ++
 / * Эскиз Master Clock. Создано 26/03/14. Это программа для Arduino, использующая DMD Freetronics в качестве вывода для отображения. Он содержит функцию будильника. День, дата и время напечатаны на DMD. Функциональная кнопка будильника находится на контактах 2 для установки будильника, 3 для повтора сигнала и 4 для выхода будильника. Время будильника и дни недели могут быть установлены в строках 551 и 552. Jed Hodson 2014 * / byte dayOfWeek =4; byte dayOfMonth =1; #include  //SPI.h должен быть включен при записи DMD по SPI (в противном случае IDE жалуется) #include  // # include  // # include "SystemFont5x7.h" #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68int AlarmSetPin =2; int SnoozePin =3; int Alarm =4; int AlarmSet =0; int Snooze =0; // Преобразование обычных десятичных чисел в двоично-десятичные байты decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} // Преобразование двоично-десятичного числа в обычное десятичное число byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16));} // 1) Устанавливает дату и время на ds1307 // 2) Запускает часы. dayOfWeek, // 1-7 байтов dayOfMonth, // 1-28 / 29/30/31 байтов в месяц, // 1-12 байтов в год) // 0-99 {Wire.beginTransmission (DS1307_I2C_AD ОДЕВАТЬСЯ); Wire.write (0); Wire.write (decToBcd (второй)); // от 0 до 7 запускает часы Wire.write (decToBcd (minute)); Wire.write (decToBcd (час)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (месяц)); Wire.write (decToBcd (год)); Wire.write (00010000); // отправляет 0x10 (шестнадцатеричный) 00010000 (двоичный) в регистр управления - включает прямоугольную волну Wire.endTransmission ();} // Получает дату и время из ds1307void getDateDs1307 (байт * секунда, байт * минута, байт * час, byte * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {// Сбрасываем указатель регистра Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission (); Wire.requestFrom (DS1307_I2C_ADDRESS, 7); // Некоторым из них нужны маски, потому что определенные биты являются управляющими битами * second =bcdToDec (Wire.read () &0x7f); * минута =bcdToDec (Wire.read ()); * час =bcdToDec (Wire.read () &0x3f); // Необходимо изменить это, если 12 часов утра / вечера * dayOfWeek =bcdToDec (Wire.read ()); * dayOfMonth =bcdToDec (Wire.read ()); * месяц =​​bcdToDec (Wire.read ()); * year =bcdToDec (Wire.read ());} // Запускаем библиотеку DMD как dmdDMD dmd (1,1); void ScanDMD () {dmd.scanDisplayBySPI ();} void setup () {байт секунда, минута , час, день недели, день месяца, месяц, год; // инициализировать прерывание TimerOne / использование ЦП, используемое для сканирования и обновления дисплея Timer1.initialize (5000); // период в микросекундах для вызова ScanDMD. Если длина превышает 5000 (5 мс), вы можете увидеть мерцание. Timer1.attachInterrupt (ScanDMD); // присоединяем прерывание Timer1 к ScanDMD, которое переходит к dmd.scanDisplayBySPI () // очищаем / инициализируем пиксели DMD, хранящиеся в ОЗУ dmd.clearScreen (true); // true - нормально (все пиксели выключены), false - отрицательно (все пиксели включены) dmd.selectFont (System5x7); Wire.begin (); // Измените эти значения на те, которые вы хотите установить на часах. // Вероятно, вы захотите установить часы только один раз, а затем удалить // вызов setDateDs1307. второй =0; минута =35; час =11; // использовать 24-часовое время, иначе расчет дня / даты будет отключен dayOfWeek =1; dayOfMonth =23; месяц =​​3; год =14; // раскомментируйте вызов setDateDs1307 ниже, чтобы установить время на интервалы, указанные выше. Помните, что если вы установите время, // вам нужно снова раскомментировать строку ниже, иначе эскиз останется только в установленное время. // setDateDs1307 (секунда, минута, час, день недели, день месяца, месяц, год); pinMode (AlarmSetPin, INPUT_PULLUP); pinMode (SnoozePin, INPUT_PULLUP); pinMode (Тревога, ВЫХОД); digitalWrite (Alarm, LOW);} void drawDay () // показывает день недели {байтовая секунда, минута, час, dayOfWeek, dayOfMonth, month, year; getDateDs1307 (&секунда, &минута, &час, &dayOfWeek, &dayOfMonth, &month, &year); переключатель (dayOfWeek) {случай 1:dmd.drawString (1,0, "Солнце,", 3, GRAPHICS_NORMAL); ломать; случай 2:dmd.drawString (1,0, «Пн,», 3, GRAPHICS_NORMAL); ломать; случай 3:dmd.drawString (1,0, "Вт,", 3, GRAPHICS_NORMAL); ломать; случай 4:dmd.drawString (1,0, «среда,», 3, GRAPHICS_NORMAL); ломать; случай 5:dmd.drawString (1,0, «Чт,», 3, GRAPHICS_NORMAL); ломать; случай 6:dmd.drawString (1,0, «Пт,», 3, GRAPHICS_NORMAL); ломать; случай 7:dmd.drawString (1,0, «Сб,», 3, GRAPHICS_NORMAL); ломать; }} void drawDate () // показывает числовую дату {байтовая секунда, минута, час, dayOfWeek, dayOfMonth, month, year; getDateDs1307 (&секунда, &минута, &час, &dayOfWeek, &dayOfMonth, &month, &year); переключатель (dayOfMonth) {case 1:dmd.drawString (20,0, "01", 2, GRAPHICS_NORMAL); ломать; случай 2:dmd.drawString (20,0, "02", 2, GRAPHICS_NORMAL); ломать; случай 3:dmd.drawString (20,0, "03", 2, GRAPHICS_NORMAL); ломать; случай 4:dmd.drawString (20,0, «04», 2, GRAPHICS_NORMAL); ломать; случай 5:dmd.drawString (20,0, «05», 2, GRAPHICS_NORMAL); ломать; случай 6:dmd.drawString (20,0, "06", 2, GRAPHICS_NORMAL); ломать; случай 7:dmd.drawString (20,0, "07", 2, GRAPHICS_NORMAL); ломать; случай 8:dmd.drawString (20,0, «08», 2, GRAPHICS_NORMAL); ломать; случай 9:dmd.drawString (20,0, "09", 2, GRAPHICS_NORMAL); ломать; случай 10:dmd.drawString (20,0, «10», 2, GRAPHICS_NORMAL); ломать; case 11:dmd.drawString (20,0, «11», 2, GRAPHICS_NORMAL); ломать; case 12:dmd.drawString (20,0, "12", 2, GRAPHICS_NORMAL); ломать; case 13:dmd.drawString (20,0, «13», 2, GRAPHICS_NORMAL); ломать; case 14:dmd.drawString (20,0, "14", 2, GRAPHICS_NORMAL); ломать; case 15:dmd.drawString (20,0, "15", 2, GRAPHICS_NORMAL); ломать; case 16:dmd.drawString (20,0, "16", 2, GRAPHICS_NORMAL); ломать; case 17:dmd.drawString (20,0, "17", 2, GRAPHICS_NORMAL); ломать; case 18:dmd.drawString (20,0, "18", 2, GRAPHICS_NORMAL); ломать; case 19:dmd.drawString (20,0, "19", 2, GRAPHICS_NORMAL); ломать; case 20:dmd.drawString (20,0, «20», 2, GRAPHICS_NORMAL); ломать; case 21:dmd.drawString (20,0, "21", 2, GRAPHICS_NORMAL); ломать; case 22:dmd.drawString (20,0, "22", 2, GRAPHICS_NORMAL); ломать; case 23:dmd.drawString (20,0, "23", 2, GRAPHICS_NORMAL); ломать; case 24:dmd.drawString (20,0, "24", 2, GRAPHICS_NORMAL); ломать; case 25:dmd.drawString (20,0, «25», 2, GRAPHICS_NORMAL); ломать; case 26:dmd.drawString (20,0, "26", 2, GRAPHICS_NORMAL); ломать; case 27:dmd.drawString (20,0, "27", 2, GRAPHICS_NORMAL); ломать; case 28:dmd.drawString (20,0, "28", 2, GRAPHICS_NORMAL); ломать; case 29:dmd.drawString (20,0, "29", 2, GRAPHICS_NORMAL); ломать; case 30:dmd.drawString (20,0, «30», 2, GRAPHICS_NORMAL); ломать; case 31:dmd.drawString (20,0, "31", 2, GRAPHICS_NORMAL); ломать; }} void drawHour () // рисует часовую стрелку {байтовая секунда, минута, час, dayOfWeek, dayOfMonth, month, year; getDateDs1307 (&секунда, &минута, &час, &dayOfWeek, &dayOfMonth, &month, &year); if (hour> 12) // Удаляем эту команду if на 24 часа {hour =hour-12; // Это 12-часовой формат времени} переключатель (час) {case 1:dmd.drawString (1,8, "01", 2, GRAPHICS_NORMAL); ломать; случай 2:dmd.drawString (1,8, "02", 2, GRAPHICS_NORMAL); ломать; случай 3:dmd.drawString (1,8, "03", 2, GRAPHICS_NORMAL); ломать; случай 4:dmd.drawString (1,8, «04», 2, GRAPHICS_NORMAL); ломать; случай 5:dmd.drawString (1,8, «05», 2, GRAPHICS_NORMAL); ломать; случай 6:dmd.drawString (1,8, "06", 2, GRAPHICS_NORMAL); ломать; случай 7:dmd.drawString (1,8, «07», 2, GRAPHICS_NORMAL); ломать; случай 8:dmd.drawString (1,8, «08», 2, GRAPHICS_NORMAL); ломать; случай 9:dmd.drawString (1,8, "09", 2, GRAPHICS_NORMAL); ломать; случай 10:dmd.drawString (1,8, "10", 2, GRAPHICS_NORMAL); ломать; case 11:dmd.drawString (1,8, "11", 2, GRAPHICS_NORMAL); ломать; case 12:dmd.drawString (1,8, "12", 2, GRAPHICS_NORMAL); ломать; case 13:dmd.drawString (1,8, "13", 2, GRAPHICS_NORMAL); ломать; случай 14:dmd.drawString (1,8, "14", 2, GRAPHICS_NORMAL); ломать; case 15:dmd.drawString (1,8, "15", 2, GRAPHICS_NORMAL); ломать; case 16:dmd.drawString (1,8, "16", 2, GRAPHICS_NORMAL); ломать; case 17:dmd.drawString (1,8, "17", 2, GRAPHICS_NORMAL); ломать; case 18:dmd.drawString (1,8, "18", 2, GRAPHICS_NORMAL); ломать; case 19:dmd.drawString (1,8, "19", 2, GRAPHICS_NORMAL); ломать; case 20:dmd.drawString (1,8, "20", 2, GRAPHICS_NORMAL); ломать; case 21:dmd.drawString (1,8, "21", 2, GRAPHICS_NORMAL); ломать; case 22:dmd.drawString (1,8, "22", 2, GRAPHICS_NORMAL); ломать; case 23:dmd.drawString (1,8, "23", 2, GRAPHICS_NORMAL); ломать; case 24:dmd.drawString (1,8, "24", 2, GRAPHICS_NORMAL); ломать; }} void drawMinute () {байтовая секунда, минута, час, dayOfWeek, dayOfMonth, month, год; getDateDs1307 (&секунда, &минута, &час, &dayOfWeek, &dayOfMonth, &month, &year); переключатель (минута) {case 0:dmd.drawString (20,8, "00", 2, GRAPHICS_NORMAL); ломать; случай 1:dmd.drawString (20,8, "01", 2, GRAPHICS_NORMAL); ломать; случай 2:dmd.drawString (20,8, "02", 2, GRAPHICS_NORMAL); ломать; случай 3:dmd.drawString (20,8, "03", 2, GRAPHICS_NORMAL); ломать; случай 4:dmd.drawString (20,8, «04», 2, GRAPHICS_NORMAL); ломать; случай 5:dmd.drawString (20,8, «05», 2, GRAPHICS_NORMAL); ломать; случай 6:dmd.drawString (20,8, "06", 2, GRAPHICS_NORMAL); ломать; случай 7:dmd.drawString (20,8, «07», 2, GRAPHICS_NORMAL); ломать; случай 8:dmd.drawString (20,8, «08», 2, GRAPHICS_NORMAL); ломать; случай 9:dmd.drawString (20,8, "09", 2, GRAPHICS_NORMAL); ломать; случай 10:dmd.drawString (20,8, «10», 2, GRAPHICS_NORMAL); ломать; case 11:dmd.drawString (20,8, «11», 2, GRAPHICS_NORMAL); ломать; case 12:dmd.drawString (20,8, "12", 2, GRAPHICS_NORMAL); ломать; case 13:dmd.drawString (20,8, «13», 2, GRAPHICS_NORMAL); ломать; case 14:dmd.drawString (20,8, «14», 2, GRAPHICS_NORMAL); ломать; case 15:dmd.drawString (20,8, «15», 2, GRAPHICS_NORMAL); ломать; case 16:dmd.drawString (20,8, "16", 2, GRAPHICS_NORMAL); ломать; case 17:dmd.drawString (20,8, «17», 2, GRAPHICS_NORMAL); ломать; case 18:dmd.drawString (20,8, «18», 2, GRAPHICS_NORMAL); ломать; case 19:dmd.drawString (20,8, "19", 2, GRAPHICS_NORMAL); ломать; case 20:dmd.drawString (20,8, «20», 2, GRAPHICS_NORMAL); ломать; case 21:dmd.drawString (20,8, "21", 2, GRAPHICS_NORMAL); ломать; case 22:dmd.drawString (20,8, "22", 2, GRAPHICS_NORMAL); ломать; case 23:dmd.drawString (20,8, "23", 2, GRAPHICS_NORMAL); ломать; case 24:dmd.drawString (20,8, «24», 2, GRAPHICS_NORMAL); ломать; case 25:dmd.drawString (20,8, «25», 2, GRAPHICS_NORMAL); ломать; case 26:dmd.drawString (20,8, «26», 2, GRAPHICS_NORMAL); ломать; case 27:dmd.drawString (20,8, «27», 2, GRAPHICS_NORMAL); ломать; case 28:dmd.drawString (20,8, «28», 2, GRAPHICS_NORMAL); ломать; case 29:dmd.drawString (20,8, "29", 2, GRAPHICS_NORMAL); ломать; case 30:dmd.drawString (20,8, «30», 2, GRAPHICS_NORMAL); ломать; case 31:dmd.drawString (20,8, «31», 2, GRAPHICS_NORMAL); ломать; case 32:dmd.drawString (20,8, «32», 2, GRAPHICS_NORMAL); ломать; case 33:dmd.drawString (20,8, "33", 2, GRAPHICS_NORMAL); ломать; case 34:dmd.drawString (20,8, "34", 2, GRAPHICS_NORMAL); ломать; case 35:dmd.drawString (20,8, "35", 2, GRAPHICS_NORMAL); ломать; case 36:dmd.drawString (20,8, "36", 2, GRAPHICS_NORMAL); ломать; case 37:dmd.drawString (20,8, "37", 2, GRAPHICS_NORMAL); ломать; case 38:dmd.drawString (20,8, «38», 2, GRAPHICS_NORMAL); ломать; case 39:dmd.drawString (20,8, "39", 2, GRAPHICS_NORMAL); ломать; case 40:dmd.drawString (20,8, «40», 2, GRAPHICS_NORMAL); ломать; case 41:dmd.drawString (20,8, "41", 2, GRAPHICS_NORMAL); ломать; case 42:dmd.drawString (20,8, "42", 2, GRAPHICS_NORMAL); ломать; case 43:dmd.drawString (20,8, "43", 2, GRAPHICS_NORMAL); ломать; case 44:dmd.drawString (20,8, «44», 2, GRAPHICS_NORMAL); ломать; case 45:dmd.drawString (20,8, «45», 2, GRAPHICS_NORMAL); ломать; case 46:dmd.drawString (20,8, "46", 2, GRAPHICS_NORMAL); ломать; case 47:dmd.drawString (20,8, «47», 2, GRAPHICS_NORMAL); ломать; case 48:dmd.drawString (20,8, "48", 2, GRAPHICS_NORMAL); ломать; case 49:dmd.drawString (20,8, "49", 2, GRAPHICS_NORMAL); ломать; case 50:dmd.drawString (20,8, «50», 2, GRAPHICS_NORMAL); ломать; case 51:dmd.drawString (20,8, "51", 2, GRAPHICS_NORMAL); ломать; case 52:dmd.drawString (20,8, "52", 2, GRAPHICS_NORMAL); ломать; case 53:dmd.drawString (20,8, "53", 2, GRAPHICS_NORMAL); ломать; case 54:dmd.drawString (20,8, "54", 2, GRAPHICS_NORMAL); ломать; case 55:dmd.drawString (20,8, "55", 2, GRAPHICS_NORMAL); ломать; case 56:dmd.drawString (20,8, «56», 2, GRAPHICS_NORMAL); ломать; case 57:dmd.drawString (20,8, "57", 2, GRAPHICS_NORMAL); ломать; case 58:dmd.drawString (20,8, «58», 2, GRAPHICS_NORMAL); ломать; case 59:dmd.drawString (20,8, "59", 2, GRAPHICS_NORMAL); ломать; }} void drawCol () {dmd.drawString (14,8, ":", 1, GRAPHICS_NORMAL);} void runClock () {drawDay (); drawDate (); drawHour (); drawCol (); drawMinute (); CheckAlarm ();} аннулирование AlarmSequence () {drawDay (); drawDate (); drawHour (); drawCol (); drawMinute (); digitalWrite (Тревога, ВЫСОКИЙ); задержка (1000); dmd.clearScreen (правда); digitalWrite (Тревога, НИЗКИЙ); задержка (1000);} void CheckAlarm () {AlarmSet =digitalRead (AlarmSetPin); Отложить =digitalRead (SnoozePin); байтовая секунда, минута, час, день недели, день месяца, месяц, год; getDateDs1307 (&секунда, &минута, &час, &dayOfWeek, &dayOfMonth, &month, &year); / * Только активировать тревогу, если это день, указанный ниже. Это можно изменить, изменив числа на любое из следующих:1 =воскресенье 2 =понедельник 3 =вторник 4 =среда 5 =четверг 6 =пятница 7 =суббота * / if (dayOfWeek ==2 || dayOfWeek ==3 | | dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6) {// Это дни, РАЗРЕШЕННЫЕ для включения будильника if (hour ==18 &&minute ==05) {// Установите время здесь (в 24 часах Time) if (AlarmSet ==LOW) {// Если сигнал тревоги включен Snooze =digitalRead (SnoozePin); в то время как (Snooze ==HIGH) {Snooze =digitalRead (SnoozePin); AlarmSequence (); }}}}} недействительный цикл () {runClock (); } 

Схема


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

  1. Часы с кукушкой
  2. Часы видения Arduino pov
  3. Самодельные простейшие часы Numitron IV9 с Arduino
  4. Простые часы со словами (Arduino)
  5. Часы Arduino с исламским временем молитв
  6. Arduino Spybot
  7. FlickMote
  8. Самодельный телевизор B-Gone
  9. Arduino Temp. Монитор и часы реального времени с дисплеем 3.2
  10. Простой будильник с DS1302 RTC