Оглавление:

Часы с прокруткой текста Arduino: 3 шага
Часы с прокруткой текста Arduino: 3 шага

Видео: Часы с прокруткой текста Arduino: 3 шага

Видео: Часы с прокруткой текста Arduino: 3 шага
Видео: Часы для мастерской на ардуино с озвучкой каждого часа, температурой, влажностью и таймером. 2024, Июль
Anonim
Часы с прокруткой текста Arduino
Часы с прокруткой текста Arduino

Цель этого проекта - создать часы с прокручивающимся текстом, которые отображают время в том виде, в каком оно произносится (например, «сейчас полночь»).

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

Шаг 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.

Рекомендуемые: