Оглавление:
Видео: Часы с прокруткой текста Arduino: 3 шага
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
Цель этого проекта - создать часы с прокручивающимся текстом, которые отображают время в том виде, в каком оно произносится (например, «сейчас полночь»).
Это быстрый проект - мы даем вам достаточно, чтобы приступить к работе с оборудованием и эскизом, а затем вы можете продолжить его в соответствии с вашими потребностями.
Шаг 1. Аппаратное обеспечение
Вам понадобятся три основных предмета -
- Несовместимая с Arduino плата
- схема или модуль часов реального времени с использованием микросхемы DS1307 или DS3231
- и монохромный светодиодный дисплей в стиле P10
Возможно, вам понадобится внешний блок питания, но об этом мы поговорим позже.
Первый этап - подгонка ваших часов реального времени. Щелкните здесь, чтобы перейти к руководству, если вам нужна помощь с этим.
Надеюсь, вы уже думаете: «Как установить время?».
На этот вопрос есть два ответа. Если вы используете DS3231, просто установите его на эскизе (см. Ниже), поскольку точность очень хорошая, вам нужно загружать эскиз с новым временем только два раза в год, чтобы охватить летнее время.
В противном случае добавьте простой пользовательский интерфейс - пара кнопок могла бы это сделать. Наконец, вам просто нужно положить оборудование на заднюю часть DMD. Существует множество возможностей для удовлетворения ваших собственных потребностей, простое решение может заключаться в том, чтобы выровнять плату управления, чтобы вы могли легко получить доступ к USB-разъему, а затем приклеить его с помощью Sugru.
Что касается питания часов - вы можете запустить ОДИН светодиодный дисплей от Arduino, и он будет работать с хорошей яркостью для использования в помещении. Если вы хотите, чтобы DMD работал с полной яркостью, выжигающей сетчатку, вам необходимо использовать отдельный источник питания 5 В, 4 А постоянного тока. Если вы используете два DMD - это 8A и так далее. Просто подключите внешнее питание к клеммам одного DMD (подключите второй или несколько DMD к этим клеммам).
Если вам не нравится перерезать конец кабеля питания, используйте переходник для розетки постоянного тока.
Шаг 2: Эскиз Arduino
Вам нужно будет установить следующие две библиотеки Arduino - TimerOne и DMD. Затем загрузите скетч:
// для RTC # включаем "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC - 0x68
// для светодиодного дисплея
#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // у вас может быть более одного DMD в строка #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);
String finalString; // используется для хранения последнего предложения для отображения на DMD
void ScanDMD () // требуется для DMD
{dmd.scanDisplayBySPI (); }
установка void ()
{// для DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (правда);
// для RTC
Wire.begin (); // запускаем шину I2C, байт секунда, минута, час, dayOfWeek, dayOfMonth, month, year; // изменяем переменные и раскомментируем setDateDs1307, чтобы установить время // затем повторно закомментировали функцию и снова загрузили скетч second = 0; минута = 13; час = 23; dayOfWeek = 4; dayOfMonth = 19; месяц = 5; год = 13; // setDateDs1307 (секунда, минута, час, день недели, день месяца, месяц, год); }
// обычные функции RTC
// Преобразование обычных десятичных чисел в двоично-десятичный байт decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); }
// Преобразование двоично-десятичных чисел в обычные десятичные числа
байт bcdToDec (байт значение) {возврат ((значение / 16 * 10) + (значение% 16)); }
void setDateDs1307 (байт второй, // 0-59
байтовая минута, // 0-59 байтовый час, // 1-23 байта dayOfWeek, // 1-7 байта dayOfMonth, // 1-28 / 29 / байтовый месяц, // 1-12 байтовый год) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); 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 (); }
// Получает дату и время от ds1307
void getDateDs1307 (byte * second, byte * minute, byte * hour, byte * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {// Сбрасываем указатель регистра Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();
Wire.requestFrom (DS1307_I2C_ADDRESS, 7);
// Некоторым из них нужны маски, потому что определенные биты являются управляющими битами
* второй = bcdToDec (Wire.read () & 0x7f); * минута = bcdToDec (Wire.read ()); * час = bcdToDec (Wire.read () & 0x3f); // Необходимо изменить это, если 12 часов утра / вечера * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * месяц = bcdToDec (Wire.read ()); * год = bcdToDec (Wire.read ()); }
void drawText (Строка oldString)
{dmd.clearScreen (истина); dmd.selectFont (Arial_Black_16); char newString [256]; int sLength = oldString.length (); oldString.toCharArray (newString, sLength + 1); dmd.drawMarquee (newString, sLength, (32 * DISPLAYS_ACROSS) -1, 0); длинный старт = миллис (); длинный таймер = старт; длинный таймер2 = старт; логическое ret = false; в то время как (! ret) {если ((таймер + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); таймер = миллис (); }}}
void createTextTime (интервал чч, интервал мм)
// это объединяет все данные в текст как одно предложение {finalString = ""; // удалить предложение для особых случаев (см. ниже) finalString = finalString + "It's";
// теперь добавляем час
если (чч == 1 || чч == 13) {finalString = finalString + "один"; } если (чч == 2 || чч == 14) {finalString = finalString + "два"; } если (чч == 3 || чч == 15) {finalString = finalString + «три»; } если (чч == 4 || чч == 16) {finalString = finalString + "четыре"; } если (чч == 5 || чч == 17) {finalString = finalString + «пять»; } если (чч == 6 || чч == 18) {finalString = finalString + «шесть»; } если (чч == 7 || чч == 19) {finalString = finalString + «семь»; } если (чч == 8 || чч == 20) {finalString = finalString + «восемь»; } если (чч == 9 || чч == 21) {finalString = finalString + «девять»; } если (чч == 10 || чч == 22) {finalString = finalString + «десять»; } если (чч == 11 || чч == 23) {finalString = finalString + «одиннадцать»; }
// теперь добавляем минуты
переключатель (мм) {case 1: finalString = finalString + "ну один"; перерыв; случай 2: finalString = finalString + "ну два"; перерыв; случай 3: finalString = finalString + "ну три"; перерыв; случай 4: finalString = finalString + "четыре"; перерыв; случай 5: finalString = finalString + "ну пять"; перерыв; случай 6: finalString = finalString + "ну шесть"; перерыв; случай 7: finalString = finalString + "ну семь"; перерыв; случай 8: finalString = finalString + "ну восемь"; перерыв; case 9: finalString = finalString + «ну девять»; перерыв; case 10: finalString = finalString + «десять»; перерыв; case 11: finalString = finalString + «одиннадцать»; перерыв; case 12: finalString = finalString + «двенадцать»; перерыв; case 13: finalString = finalString + «тринадцать»; перерыв; case 14: finalString = finalString + «четырнадцать»; перерыв; case 15: finalString = finalString + «пятнадцать»; перерыв; case 16: finalString = finalString + «шестнадцать»; перерыв; case 17: finalString = finalString + «семнадцать»; перерыв; case 18: finalString = finalString + «восемнадцать»; перерыв; case 19: finalString = finalString + «девятнадцать»; перерыв; case 20: finalString = finalString + «двадцать»; перерыв; case 21: finalString = finalString + «двадцать один»; перерыв; case 22: finalString = finalString + «двадцать два»; перерыв; case 23: finalString = finalString + «двадцать три»; перерыв; case 24: finalString = finalString + «двадцать четыре»; перерыв; case 25: finalString = finalString + «двадцать пять»; перерыв; case 26: finalString = finalString + «двадцать шесть»; перерыв; case 27: finalString = finalString + «двадцать семь»; перерыв; case 28: finalString = finalString + «двадцать восемь»; перерыв; case 29: finalString = finalString + «двадцать девять»; перерыв; case 30: finalString = finalString + «тридцать»; перерыв; case 31: finalString = finalString + «тридцать один»; перерыв; case 32: finalString = finalString + «тридцать два»; перерыв; case 33: finalString = finalString + «тридцать три»; перерыв; case 34: finalString = finalString + «тридцать четыре»; перерыв; case 35: finalString = finalString + «тридцать пять»; перерыв; case 36: finalString = finalString + «тридцать шесть»; перерыв; case 37: finalString = finalString + «тридцать семь»; перерыв; case 38: finalString = finalString + «тридцать восемь»; перерыв; case 39: finalString = finalString + «тридцать девять»; перерыв; case 40: finalString = finalString + «сорок»; перерыв; case 41: finalString = finalString + «сорок один»; перерыв; case 42: finalString = finalString + «сорок два»; перерыв; case 43: finalString = finalString + «сорок три»; перерыв; case 44: finalString = finalString + «сорок четыре»; перерыв; case 45: finalString = finalString + «сорок пять»; перерыв; case 46: finalString = finalString + «сорок шесть»; перерыв; case 47: finalString = finalString + «сорок семь»; перерыв; case 48: finalString = finalString + «сорок восемь»; перерыв; case 49: finalString = finalString + «сорок девять»; перерыв; case 50: finalString = finalString + «пятьдесят»; перерыв; case 51: finalString = finalString + «пятьдесят один»; перерыв; case 52: finalString = finalString + «пятьдесят два»; перерыв; case 53: finalString = finalString + «пятьдесят три»; перерыв; case 54: finalString = finalString + «пятьдесят четыре»; перерыв; case 55: finalString = finalString + «пятьдесят пять»; перерыв; case 56: finalString = finalString + «пятьдесят шесть»; перерыв; case 57: finalString = finalString + «пятьдесят семь»; перерыв; case 58: finalString = finalString + «пятьдесят восемь»; перерыв; case 59: finalString = finalString + «пятьдесят девять»; перерыв; }
// полдень?
если (чч == 12 && мм == 0) {finalString = finalString + «полдень»; } // полночь? если (чч == 00 && мм == 0) {finalString = finalString + "полночь"; }
}
пустой цикл ()
{// получаем время из байта RTC: секунда, минута, час, dayOfWeek, dayOfMonth, month, year; getDateDs1307 (& секунда, & минута, & час, & dayOfWeek, & dayOfMonth, & month, & year);
// конвертируем время в строку предложения
createTextTime (час, минута);
// теперь отправляем текст в DMD
drawText (finalString); }
Скетч имеет обычные функции для установки и извлечения времени из микросхем часов реального времени DS1307 / 3232, и, как обычно, со всеми нашими часами вы можете ввести информацию о времени в переменные в void setup (), затем раскомментировать setDateDs1307 (), загрузите скетч, повторно прокомментируйте setDateDs1307, затем загрузите скетч еще раз. Повторите этот процесс, чтобы заново установить время, если вы не добавляли аппаратный пользовательский интерфейс.
Шаг 3:
Как только время получено в void loop (), оно передается в функцию createTextTime (). Эта функция создает текстовую строку для отображения, начиная с «It’s», а затем определяет, за какими словами следовать в зависимости от текущего времени. Наконец, функция drawText () преобразует строку, содержащую отображаемый текст, в символьную переменную, которую можно передать в DMD.
Рекомендуемые:
Светодиодный матричный дисплей с прокруткой DIY с использованием Arduino: 6 шагов
Светодиодный точечно-матричный прокручиваемый дисплей DIY с использованием Arduino: Hello Instructor Это мое первое руководство. В этом руководстве я покажу, как сделать самодельный светодиодный матричный прокручиваемый дисплей с использованием Arduino в качестве MCU. Такие дисплеи можно увидеть на вокзалах, автовокзалах, улицах и во многих других местах. Там
Часы Gixie: самые красивые часы со светящейся трубкой: 4 шага
Часы Gixie: самые красивые часы Glow Tube: мне очень нравятся часы Nixie Tube, но они слишком дороги, я не могу их себе позволить. Итак, я потратил полгода на создание этих часов Gixie Clock. Gixie Clock достигается за счет использования освещения ws2812 для создания акрилового света. Я делаю все возможное, чтобы сделать трубку RGB тоньше
Светодиодный матричный дисплей с прокруткой 48 X 8 с использованием Arduino и регистров сдвига: 6 шагов (с изображениями)
Светодиодный матричный дисплей с прокруткой 48 x 8 с использованием Arduino и регистров сдвига: Привет всем! Это мой первый учебник, и он посвящен созданию программируемой светодиодной матрицы с прокруткой 48 x 8 с использованием регистров сдвига Arduino Uno и 74HC595. Это был мой первый проект с платой для разработки Arduino. Это был вызов, брошенный м
Создайте настоящие часы с боем колокола для вашего ПК и часы с огнетушителем: 3 шага (с изображениями)
Создайте настоящие часы с боем колокола для вашего ПК и часы с огнетушителем: медный колокол, маленькое реле, еще несколько вещей и настоящий колокол могут пробить часы на вашем рабочем столе. Хотя этот проект работает на Windows и Mac OS X тоже, я решил установить Ubuntu Linux на ПК, который я нашел в мусорном ведре, и поработать над этим: у меня никогда не было
Рамка изображения Twitter с прокруткой: 3 шага
Прокручиваемая рамка изображения Twitter: это руководство покажет вам, как создать рамку изображения Twitter с прокруткой. Вам понадобится: 1. #twatch Ethernet-рюкзак с ЖК-экраном и ЖК-экран 4 * 20 символов. Рамка для изображения, подходящая для ЖК-дисплея. У нас 7,5 см на 11 см (3 дюйма x 4,5 дюйма) 3. Кусочек плазмы