Съдържание:

Arduino превъртащ се текстов часовник: 3 стъпки
Arduino превъртащ се текстов часовник: 3 стъпки

Видео: Arduino превъртащ се текстов часовник: 3 стъпки

Видео: Arduino превъртащ се текстов часовник: 3 стъпки
Видео: Как сделать светодиодный дисплей с прокруткой текста (192 светодиода) 2024, Юли
Anonim
Arduino превъртащ се текстов часовник
Arduino превъртащ се текстов часовник

Целта на този проект е да се изгради превъртащ се текстов часовник, който показва времето, в което се говори (например „полунощ е“).

Това е бърз проект - ние ви даваме достатъчно, за да започнете с хардуера и скицата, а след това можете да го направите по -нататък, за да отговаряте на вашите нужди.

Стъпка 1: Хардуер

Хардуер
Хардуер

Ще ви трябват три основни елемента -

  • съвместима с Arduino Uno платка
  • верига или модул на часовник в реално време, използващ DS1307 или DS3231 IC
  • и монохромен LED дисплей в стил P10

Може да искате външно захранване, но ще стигнем до това по -късно.

Първият етап е да настроите часовника си в реално време. Щракнете тук за урок, ако имате нужда от помощ с това.

Надявам се, че вече си мислите „как задавате часа?“.

На този въпрос има два отговора. Ако използвате DS3231, просто го задайте в скицата (вижте по -долу), тъй като точността е много добра, трябва само да качите скицата с новото време два пъти годишно, за да покриете лятното часово време.

В противен случай добавете прост потребителски интерфейс-няколко бутона могат да го направят. Накрая просто трябва да поставите хардуера на гърба на DMD. Има много възможности за задоволяване на вашите собствени нужди, просто решение може да бъде да подравните контролната платка, така че да имате достъп до USB гнездото с лекота - и след това да я залепите с малко Sugru.

По отношение на захранването на часовника - можете да стартирате ЕДИН LED дисплей от Arduino и той работи с добра яркост за вътрешна употреба. Ако искате DMD да работи с пълна яркост при изгаряне на ретината, трябва да използвате отделно 5V 4A DC захранване. Ако използвате два DMD - това отива на 8A и т.н. Просто свържете външното захранване към един терминал на DMD (свържете втория или повече DMD към тези терминали).

Ако не обичате да прекъсвате края на захранващия си кабел, използвайте прекъсвач от DC контакт.

Стъпка 2: Скицата на Arduino

Ще трябва да инсталирате следните две библиотеки на Arduino - TimerOne и DMD. След това качете скицата:

// за RTC #включва "Wire.h" #дефинирайте DS1307_I2C_ADDRESS 0x68 // DS1307 RTC е 0x68

// за LED дисплей

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // може да имате повече от един DMD в a ред #дефиниране DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

Низ finalString; // използва се за задържане на последното изречение за показване на DMD

void ScanDMD () // необходимо за DMD

{dmd.scanDisplayBySPI (); }

void setup ()

{// за DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (вярно);

// за RTC

Wire.begin (); // задейства I2C автобусен байт секунда, минута, час, dayOfWeek, dayOfMonth, месец, година; // променяме променливите и декомментираме setDateDs1307, за да зададем часа // след това коментираме отново функцията и качваме скицата отново second = 0; минута = 13; час = 23; dayOfWeek = 4; dayOfMonth = 19; месец = 5; година = 13; // setDateDs1307 (втора, минута, час, dayOfWeek, dayOfMonth, месец, година); }

// обичайни RTC функции

// Конвертираме нормални десетични числа в двоично кодиран десетичен байт decToBcd (байт val) {return ((val/10*16) + (val%10)); }

// Конвертираме двоично кодирани десетични числа в нормални десетични числа

байт bcdToDec (байт val) {return ((val/16*10) + (val%16)); }

void setDateDs1307 (байт втора, // 0-59

байтова минута, // 0-59 байтов час, // 1-23 байтов денOfWeek, // 1-7 байтов денOfMonth, // 1-28/29/байтов месец, // 1-12 байтова година) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (втори)); // 0 до бит 7 стартира часовника Wire.write (decToBcd (минута)); 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 (байт *секунда, байт *минута, байт *час, байт *dayOfWeek, байт *dayOfMonth, байт *месец, байт *година) {// Нулиране на указателя за регистър 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 часа сутринта/pm *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *месец = bcdToDec (Wire.read ()); *година = bcdToDec (Wire.read ()); }

void drawText (String oldString)

{dmd.clearScreen (true); 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); дълъг старт = millis (); дълъг таймер = старт; дълъг таймер2 = старт; boolean ret = false; while (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); таймер = милис (); }}}

void createTextTime (int hh, int mm)

// това обединява данните за цялото време в текст като едно изречение {finalString = ""; // изтриваме изречението за специални случаи (по -долу) finalString = finalString+"Това е";

// сега добавете часа

if (hh == 1 || hh == 13) {finalString = finalString+"един"; } if (hh == 2 || hh == 14) {finalString = finalString+"две"; } if (hh == 3 || hh == 15) {finalString = finalString+"три"; } if (hh == 4 || hh == 16) {finalString = finalString+"четири"; } if (hh == 5 || hh == 17) {finalString = finalString+"пет"; } if (hh == 6 || hh == 18) {finalString = finalString+"шест"; } if (hh == 7 || hh == 19) {finalString = finalString+"седем"; } if (hh == 8 || hh == 20) {finalString = finalString+"осем"; } if (hh == 9 || hh == 21) {finalString = finalString+"девет"; } if (hh == 10 || hh == 22) {finalString = finalString+"десет"; } if (hh == 11 || hh == 23) {finalString = finalString+"единадесет"; }

// сега добавете минутите

ключ (mm) {случай 1: finalString = finalString+"о, един"; прекъсване; случай 2: finalString = finalString+"о две"; прекъсване; случай 3: finalString = finalString+"о три"; прекъсване; случай 4: finalString = finalString+"о четири"; прекъсване; случай 5: finalString = finalString+"о пет"; прекъсване; случай 6: finalString = finalString+"о шест"; прекъсване; случай 7: finalString = finalString+"о седем"; прекъсване; случай 8: finalString = finalString+"о осем"; прекъсване; случай 9: finalString = finalString+"о девет"; прекъсване; случай 10: finalString = finalString+"десет"; прекъсване; случай 11: finalString = finalString+"единадесет"; прекъсване; случай 12: finalString = finalString+"дванадесет"; прекъсване; случай 13: finalString = finalString+"тринадесет"; прекъсване; случай 14: finalString = finalString+"четиринадесет"; прекъсване; случай 15: finalString = finalString+"петнадесет"; прекъсване; случай 16: finalString = finalString+"шестнадесет"; прекъсване; случай 17: finalString = finalString+"седемнадесет"; прекъсване; случай 18: finalString = finalString+"осемнадесет"; прекъсване; случай 19: finalString = finalString+"деветнадесет"; прекъсване; случай 20: finalString = finalString+"двадесет"; прекъсване; случай 21: finalString = finalString+"двадесет и един"; прекъсване; случай 22: finalString = finalString+"двадесет и две"; прекъсване; случай 23: finalString = finalString+"двадесет и три"; прекъсване; случай 24: finalString = finalString+"двадесет и четири"; прекъсване; случай 25: finalString = finalString+"двадесет и пет"; прекъсване; случай 26: finalString = finalString+"двадесет и шест"; прекъсване; случай 27: finalString = finalString+"двадесет и седем"; прекъсване; случай 28: finalString = finalString+"двадесет и осем"; прекъсване; случай 29: finalString = finalString+"двадесет и девет"; прекъсване; случай 30: finalString = finalString+"тридесет"; прекъсване; случай 31: finalString = finalString+"тридесет и един"; прекъсване; случай 32: finalString = finalString+"тридесет и две"; прекъсване; случай 33: finalString = finalString+"тридесет и три"; прекъсване; случай 34: finalString = finalString+"тридесет и четири"; прекъсване; случай 35: finalString = finalString+"тридесет и пет"; прекъсване; случай 36: finalString = finalString+"тридесет и шест"; прекъсване; случай 37: finalString = finalString+"тридесет и седем"; прекъсване; случай 38: finalString = finalString+"тридесет и осем"; прекъсване; случай 39: finalString = finalString+"тридесет и девет"; прекъсване; случай 40: finalString = finalString+"четиридесет"; прекъсване; случай 41: finalString = finalString+"четиридесет и един"; прекъсване; случай 42: finalString = finalString+"четиридесет и две"; прекъсване; случай 43: finalString = finalString+"четиридесет и три"; прекъсване; случай 44: finalString = finalString+"четиридесет и четири"; прекъсване; случай 45: finalString = finalString+"четиридесет и пет"; прекъсване; случай 46: finalString = finalString+"четиридесет и шест"; прекъсване; случай 47: finalString = finalString+"четиридесет и седем"; прекъсване; случай 48: finalString = finalString+"четиридесет и осем"; прекъсване; случай 49: finalString = finalString+"четиридесет и девет"; прекъсване; случай 50: finalString = finalString+"петдесет"; прекъсване; случай 51: finalString = finalString+"петдесет и едно"; прекъсване; случай 52: finalString = finalString+"петдесет и две"; прекъсване; случай 53: finalString = finalString+"петдесет и три"; прекъсване; случай 54: finalString = finalString+"петдесет и четири"; прекъсване; случай 55: finalString = finalString+"петдесет и пет"; прекъсване; случай 56: finalString = finalString+"петдесет и шест"; прекъсване; случай 57: finalString = finalString+"петдесет и седем"; прекъсване; случай 58: finalString = finalString+"петдесет и осем"; прекъсване; случай 59: finalString = finalString+"петдесет и девет"; прекъсване; }

// обед?

if (hh == 12 && mm == 0) {finalString = finalString+"обед"; } // полунощ? if (hh == 00 && mm == 0) {finalString = finalString+"полунощ"; }

}

void loop ()

{// получаваме времето от RTC байта секунда, минута, час, dayOfWeek, dayOfMonth, месец, година; getDateDs1307 (& втора, & минута, & час, & dayOfWeek, & dayOfMonth, & месец, & година);

// преобразуваме времето в низ от изречения

createTextTime (час, минута);

// сега изпращаме текста до DMD

drawText (finalString); }

Скицата има обичайните функции за задаване и извличане на времето от интегралните схеми на часовника в реално време DS1307/3232 и както обикновено с всички наши часовници можете да въведете информацията за часа в променливите в void setup (), след това да декомментирате setDateDs1307 (), качете скицата, коментирайте отново setDateDs1307, след което качете скицата още веднъж. Повторете този процес, за да зададете отново часа, ако не сте добавили хардуерно базиран потребителски интерфейс.

Стъпка 3:

След като времето се извлече в void loop (), то се предава на функцията createTextTime (). Тази функция създава текстовия низ за показване, като започва с „Това е“и след това определя кои думи да следва в зависимост от текущия час. Накрая функцията drawText () преобразува низ, съдържащ текста за показване, в символна променлива, която може да бъде предадена на DMD.

Препоръчано: