Мазмуну:

Arduino Текст Сааты: 3 кадам
Arduino Текст Сааты: 3 кадам

Video: Arduino Текст Сааты: 3 кадам

Video: Arduino Текст Сааты: 3 кадам
Video: Функция Arduino Millis поясняется 3 примерами 2024, Июль
Anonim
Arduino жылдыруучу текст сааты
Arduino жылдыруучу текст сааты

Бул долбоордун максаты - убакытты сүйлөө убактысын чагылдырган жылдыруучу текст саатын куруу (мисалы, "түн ортосу").

Бул тез долбоор - биз сизге аппараттык жана эскиз менен иштөө үчүн жетиштүү беребиз, андан кийин аны муктаждыктарыңызга ылайыкташтырып алсаңыз болот.

1 -кадам: Аппараттык

Аппараттык
Аппараттык

Сизге үч негизги нерсе керек болот -

  • An Arduino Uno менен шайкеш келген такта
  • DS1307 же DS3231 ICди колдонгон реалдуу убакыт режиминдеги схема же модуль
  • жана монохромдуу P10 стилиндеги LED дисплей

Сиз тышкы электр менен камсыздоону каалашыңыз мүмкүн, бирок биз кийинчерээк ага жетебиз.

Биринчи этап-бул реалдуу убакыт режимине туура келүү. Эгер жардам керек болсо, үйрөткүч үчүн бул жерди басыңыз.

Азырынча сиз "убакытты кантип белгилейсиз?" Деп ойлоп жатасыз деп үмүттөнөм.

Бул суроого эки жооп бар. Эгерде сиз DS3231ди колдонуп жатсаңыз, аны жөн гана эскизге орнотуңуз (төмөндө караңыз), анткени тактык абдан жакшы, күндүзгү убакытты жабуу үчүн эскизди жылына эки жолу жаңы убакыт менен гана жүктөө керек.

Болбосо, жөнөкөй колдонуучу интерфейсин кошуңуз-муну бир нече баскыч жасай алат. Акыр -аягы, сиз жабдыкты DMDдин арт жагына коюшуңуз керек. Өз муктаждыктарыңызды канааттандыруу үчүн көптөгөн мүмкүнчүлүктөр бар, жөнөкөйлөтүү жолу - бул USB -розеткасына оңой кирүү үчүн башкаруу тактасын тегиздөө, анан аны Sugru менен жабыштыруу.

Саатты иштетүү боюнча - сиз Arduinoдон ONE LED дисплейин иштете аласыз жана ал үй ичинде колдонуу үчүн жакшы жарыкта иштейт. Эгерде сиз DMDдин толук иштешин кааласаңыз, торчо күйгүзүүчү жаркыроо үчүн өзүнчө 5V 4A DC электр булагын колдонуу керек. Эгерде сиз эки DMD колдонуп жатсаңыз - бул 8Ага барат, ж.б. Жөн эле тышкы кубатты бир DMD терминалына туташтырыңыз (экинчи же андан көп DMDлерди бул терминалдарга туташтырыңыз).

Эгерде сиз электр менен камсыздоо кабелинин учун кесүүнү каалабасаңыз, анда DC розеткасын колдонуңуз.

2 -кадам: Arduino эскизи

Сиз төмөнкү эки Arduino китепканасын орнотушуңуз керек - TimerOne жана DMD. Андан кийин эскизди жүктөңүз:

// RTC #үчүн "Wire.h" кирет #DS1307_I2C_ADDRESS аныктоо 0x68 // DS1307 RTC 0x68

// LED дисплейи үчүн

#кошуу "SPI.h" #кошуу "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 (); }

жараксыз орнотуу ()

{// DMD Timer1.initialize үчүн (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (чыныгы);

// RTC үчүн

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

// кадимки RTC функциялары

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

// бинардык коддуу ондукту кадимки ондук сандарга айландыруу

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

жараксыз 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 (мүнөт)); Wire.write (decToBcd (саат)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (ай)); Wire.write (decToBcd (жыл)); Wire.write (00010000); // 0x10 (hex) 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:00/pm *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *ай = bcdToDec (Wire.read ()); *жыл = bcdToDec (Wire.read ()); }

жараксыз DrawText (String 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); узак баштоо = millis (); узак таймер = баштоо; long timer2 = баштоо; логикалык ret = false; while (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); таймер = миллис (); }}}

жараксыз createTextTime (int hh, int mm)

// бул бардык убакыттагы маалыматтарды текстке бир сүйлөм катары бириктирет {finalString = ""; // өзгөчө учурлар үчүн сүйлөмдү өчүрүү (төмөндө) finalString = finalString+"Бул";

// азыр саатты кошуу

if (hh == 1 || hh == 13) {finalString = finalString+"one"; } if (hh == 2 || hh == 14) {finalString = finalString+"two"; } if (hh == 3 || hh == 15) {finalString = finalString+"three"; } if (hh == 4 || hh == 16) {finalString = finalString+"four"; } if (hh == 5 || hh == 17) {finalString = finalString+"беш"; } if (hh == 6 || hh == 18) {finalString = finalString+"six"; } if (hh == 7 || hh == 19) {finalString = finalString+"seven"; } if (hh == 8 || hh == 20) {finalString = finalString+"сегиз"; } if (hh == 9 || hh == 21) {finalString = finalString+"тогуз"; } if (hh == 10 || hh == 22) {finalString = finalString+"ten"; } if (hh == 11 || hh == 23) {finalString = finalString+"eleven"; }

// азыр мүнөттөрдү кошуңуз

которуу (мм) {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+"жыйырма"; тыныгуу; Case 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+"отуз төрт"; тыныгуу; Case 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+"элүү беш"; тыныгуу; Case 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+"midnight"; }

}

боштук цикл ()

{// убакытты RTC байтынан секунд, мүнөт, саат, dayOfWeek, dayOfMonth, ай, жыл алуу; getDateDs1307 (& экинчи, & мүнөт, & саат, & dayOfWeek, & dayOfMonth, & ай, & жыл);

// убакытты сүйлөмдүн сабына айландырыңыз

createTextTime (саат, мүнөт);

// азыр текстти DMDге жөнөтүңүз

drawText (finalString); }

Эскизде DS1307/3232 реалдуу убакыт сааттарынан убакытты белгилөө жана алуу үчүн кадимки функциялар бар, жана адаттагыдай эле, биздин бардык сааттарыбызда убакыт маалыматын өзгөрмөлөргө void setup (), андан кийин setDateDs1307 (), эскизди жүктөп, setDateDs1307ге кайра комментарий бериңиз, андан кийин эскизди дагы бир жолу жүктөңүз. Эгерде сиз жабдыкка негизделген колдонуучу интерфейсин кошпосоңуз, убакытты кайра коюу үчүн ошол процессти кайталаңыз.

3 -кадам:

Убакыт void loop () ичинде алынгандан кийин, createTextTime () функциясына өткөрүлөт. Бул функция "Бул" менен башталып, көрсөтүлө турган текст сабын түзөт, андан кийин учурдагы убакытка жараша кайсы сөздөр ээрчиш керектигин аныктайт. Акыры drawText () функциясы текстти кармап турган сапты DMDге өткөрүлө турган символдордун өзгөрмөсүнө айландырат.

Сунушталууда: