Სარჩევი:

Arduino გადახვევის ტექსტური საათი: 3 ნაბიჯი
Arduino გადახვევის ტექსტური საათი: 3 ნაბიჯი

ვიდეო: Arduino გადახვევის ტექსტური საათი: 3 ნაბიჯი

ვიდეო: Arduino გადახვევის ტექსტური საათი: 3 ნაბიჯი
ვიდეო: Using Micro SD Card and Data logging with Arduino | Arduino Step by Step Course Lesson 106 2024, ივლისი
Anonim
Arduino გადახვევის ტექსტური საათი
Arduino გადახვევის ტექსტური საათი

ამ პროექტის მიზანია შექმნას გადახვევის ტექსტური საათი, რომელიც აჩვენებს დროს ნათქვამს (მაგალითად, "შუაღამეა").

ეს არის სწრაფი პროექტი - ჩვენ გაძლევთ საკმარისს იმისთვის, რომ დაიწყოთ ტექნიკა და ესკიზი, შემდეგ კი შეგიძლიათ გააგრძელოთ იგი თქვენი საჭიროებების შესაბამისად.

ნაბიჯი 1: აპარატურა

ტექნიკა
ტექნიკა

თქვენ დაგჭირდებათ სამი ძირითადი ელემენტი -

  • Arduino Uno თავსებადი დაფა
  • რეალურ დროში საათის ჩართვა ან მოდული DS1307 ან DS3231 IC გამოყენებით
  • და მონოქრომული P10 სტილის LED დისპლეი

შეიძლება დაგჭირდეთ გარე კვების წყარო, მაგრამ ჩვენ ამას მოგვიანებით შევეხებით.

პირველი ეტაპი არის რეალურ დროში საათის მორგება. დააწკაპუნეთ აქ სამეურვეო თუ გჭირდებათ დახმარება ამაში.

ჯერჯერობით ვიმედოვნებ, რომ თქვენ ფიქრობთ "როგორ განსაზღვრავთ დროს?".

ამ კითხვაზე ორი პასუხი არსებობს. თუ თქვენ იყენებთ DS3231– ს, უბრალოდ ჩაწერეთ ესკიზში (იხ. ქვემოთ), რადგან სიზუსტე ძალიან კარგია, თქვენ გჭირდებათ მხოლოდ ესკიზის ატვირთვა ახალი დროით წელიწადში ორჯერ, დღის სინათლის დასაფარად.

წინააღმდეგ შემთხვევაში დაამატეთ მარტივი ინტერფეისი-ამის გაკეთება რამდენიმე ღილაკს შეეძლო. დაბოლოს, თქვენ უბრალოდ უნდა დააყენოთ ტექნიკა DMD– ის უკანა მხარეს. უამრავი მოთხოვნილებაა თქვენი საჭიროებების დასაკმაყოფილებლად, მარტივი გამოსავალი შეიძლება იყოს მართვის დაფის გასწორება, ასე რომ თქვენ ადვილად შეხვალთ USB სოკეტში - და შემდეგ მიამაგრეთ იგი Sugru– სთან ერთად.

რაც შეეხება საათის გააქტიურებას - თქვენ შეგიძლიათ გაუშვათ ერთი LED ეკრანი არდუინოდან და ის კარგად მუშაობს შიდა გამოყენებისათვის. თუ გსურთ DMD იმუშაოს სრულად, ბადურის დაწვის სიკაშკაშე, თქვენ უნდა გამოიყენოთ ცალკე 5V 4A DC კვების წყარო. თუ თქვენ იყენებთ ორ DMD– ს - ეს მიდის 8A– მდე და ასე შემდეგ. უბრალოდ შეაერთეთ გარე ენერგია ერთ DMD ტერმინალთან (შეაერთეთ მეორე ან მეტი DMD ამ ტერმინალებთან).

თუ არ გნებავთ კვების ბლოკის ბოლომდე გაწყვეტა, გამოიყენეთ DC ბუდე.

ნაბიჯი 2: არდუინოს ესკიზი

თქვენ უნდა დააინსტალიროთ Arduino– ს შემდეგი ორი ბიბლიოთეკა - TimerOne და DMD. შემდეგ ატვირთეთ ესკიზი:

// RTC- სთვის #მოიცავს "Wire.h" #განსაზღვრეთ DS1307_I2C_ADDRESS 0x68 // DS1307 RTC არის 0x68

// LED ჩვენებისთვის

#მოიცავს "SPI.h" #მოიცავს "DMD.h" #მოიცავს "TimerOne.h" #მოიცავს "SystemFont5x7.h" #მოიცავს "Arial_black_16.h" #განსაზღვრა DISPLAYS_ACROSS 1 // შეიძლება გქონდეს ერთზე მეტი DMD მწკრივი #განსაზღვრეთ DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

სიმებიანი საბოლოო სიმებიანი; // გამოიყენება ბოლო წინადადების ჩასატარებლად DMD- ზე გამოსახვისთვის

void ScanDMD () // საჭიროა DMD– სთვის

{dmd.scanDisplayBySPI (); }

ბათილად დაყენება ()

{// DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (ჭეშმარიტი);

// RTC– სთვის

Wire.begin (); // აანთეთ I2C ავტობუსი ბაიტი წამი, წუთი, საათი, dayOfWeek, dayOfMthth, თვე, წელი; // შეცვალეთ ცვლადები და დააკომენტარეთ setDateDs1307 დროის დასაყენებლად // შემდეგ ხელახლა დატოვეთ კომენტარი ფუნქციაზე და კვლავ ატვირთეთ ესკიზი მეორე = 0; წუთი = 13; საათი = 23; კვირა კვირა = 4; თვის თვე = 19; თვე = 5; წელი = 13; // setDateDs1307 (მეორე, წუთი, საათი, დღე კვირაში, დღე თვეში, თვე, წელი); }

// ჩვეულებრივი RTC ფუნქციები

// ნორმალური ათობითი რიცხვების ორობითი კოდირებული ათობითი ბაიტი decToBcd (ბაიტი val) {return ((val/10*16) + (val%10)); }

// ორობითი კოდირებული ათწილადის ნორმალურ ათეულ ციფრებად გადაყვანა

ბაიტი bcdToDec (ბაიტი val) {დაბრუნება ((val/16*10) + (val%16)); }

void setDateDs1307 (ბაიტი მეორე, // 0-59

ბაიტი წუთი, // 0-59 ბაიტი საათი, // 1-23 ბაიტი კვირა, // 1-7 ბაიტი თვე, // 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 ();

მავთული. მოთხოვნა (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 = დაწყება; ლოგიკური რეტ = ყალბი; while (! ret) {if ((ტაიმერი+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); ტაიმერი = მილი (); }}}

void createTextTime (int hh, int mm)

// ეს აერთიანებს ყველა დროის მონაცემებს ტექსტში, როგორც ერთი წინადადება {finalString = ""; // წაშალე წინადადება სპეციალური შემთხვევებისთვის (ქვემოთ) finalString = finalString+"It's";

// ახლა დაამატე საათი

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+"თერთმეტი"; }

// ახლა დაამატეთ წუთები

გადართვა (მმ) {შემთხვევა 1: finalString = finalString+"oh one"; შესვენება; შემთხვევა 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+"შუაღამე"; }

}

ბათილი მარყუჟი ()

{// მიიღეთ დრო RTC ბაიტიდან წამი, წუთი, საათი, დღე კვირაში, დღე თვეში, თვეში, წელს; getDateDs1307 (& მეორე, & წუთი, & საათი, & dayOfWeek, & dayOfemth, & month, & year);

// გადააქციე დრო წინადადების სტრიქონად

createTextTime (საათი, წუთი);

// ახლა გაგზავნეთ ტექსტი DMD– ში

drawText (საბოლოო სტრიქონი); }

ესკიზს აქვს ჩვეულებრივი ფუნქციები დროის რეალურ დროში DS1307/3232 საათის IC- ებიდან დასადგენად და დასაბრუნებლად, და როგორც ყოველთვის, ჩვენს ყველა საათთან ერთად თქვენ შეგიძლიათ შეიტანოთ დროის ინფორმაცია ცვლადებში void setup (), შემდეგ კი კომენტირებისათვის setDateDs1307 (), ატვირთეთ ესკიზი, გაიმეორეთ კომენტარი setDateDs1307, შემდეგ ატვირთეთ ესკიზი კიდევ ერთხელ. გაიმეორეთ ეს პროცესი დროის ხელახლა დასადგენად, თუ არ დაამატებთ აპარატურაზე დაფუძნებულ ინტერფეისს.

ნაბიჯი 3:

მას შემდეგ, რაც დრო მოიძებნება ბათილ მარყუჟში (), ის გადადის ფუნქცია createTextTime (). ეს ფუნქცია ქმნის ტექსტის სტრიქონს საჩვენებლად "ეს", და შემდეგ განსაზღვრავს რომელი სიტყვები უნდა დაიცვას მიმდინარე დროის მიხედვით. საბოლოოდ ფუნქცია drawText () გარდაქმნის ტექსტს, რომელიც შეიცავს ტექსტს საჩვენებლად, სიმბოლოების ცვლადად, რომელიც შეიძლება გადავიდეს DMD– ზე.

გირჩევთ: