Съдържание:
Видео: Arduino превъртащ се текстов часовник: 3 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:52
Целта на този проект е да се изгради превъртащ се текстов часовник, който показва времето, в което се говори (например „полунощ е“).
Това е бърз проект - ние ви даваме достатъчно, за да започнете с хардуера и скицата, а след това можете да го направите по -нататък, за да отговаряте на вашите нужди.
Стъпка 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.
Препоръчано:
Превъртане на текстов дисплей (водач от А до Я): 25 стъпки (със снимки)
Скролиране на текстов дисплей (ръководство от А до Я): В този инструкционен / видео ще ви насоча стъпка по стъпка инструкции как да направите превъртане на текстов дисплей с Arduino. Няма да обяснявам как се прави код за Arduino, ще ви покажа как да използвате съществуващия код. Какво и къде трябва да сътрудничите
Програмиране на Arduino с помощта на друг Arduino за показване на превъртащ се текст без библиотека: 5 стъпки
Програмиране на Arduino с помощта на друг Arduino за показване на превъртащ се текст без библиотека: Sony Spresense или Arduino Uno не са толкова скъпи и не изискват много енергия. Ако обаче вашият проект има ограничения за мощност, пространство или дори бюджет, може да помислите за използването на Arduino Pro Mini. За разлика от Arduino Pro Micro, Arduino Pro Mi
ESP8266 Мрежов часовник без RTC - Nodemcu NTP Часовник Няма RTC - ИНТЕРНЕТЕН ЧАСОВНИК ПРОЕКТ: 4 стъпки
ESP8266 Мрежов часовник без RTC | Nodemcu NTP Часовник Няма RTC | ИНТЕРНЕТЕН ЧАСОВНИК ПРОЕКТ: В проекта ще се прави часовник проект без RTC, ще отнеме време от интернет с помощта на wifi и ще го покаже на дисплея st7735
DIY LED Dot Matrix превъртащ дисплей с помощта на Arduino: 6 стъпки
DIY LED Dot Matrix превъртащ дисплей с помощта на Arduino: Здравейте Инструмент Това е моят първи инструктаж. В тази инструкция ще покажа как правя DIY LED Dot Matrix превъртащ дисплей, използвайки Arduino като MCU. Този вид дисплеи, представени на гарата, автогарата, улиците и много други места. Там
Как да получите страхотен изцяло текстов телефонен номер с Google Voice: 7 стъпки
Как да получите страхотен изцяло текстов телефонен номер с Google Voice: Google Voice е безплатна услуга, която ви позволява да управлявате всичките си телефони с един номер, преписва гласови съобщения в текст и дава безплатни SMS. Когато се регистрирате за Google Voice, получавате за да изберете число от милионите номера, запазени от Google