Სარჩევი:

რეალურ დროში საათი არდუინოთი: 3 ნაბიჯი
რეალურ დროში საათი არდუინოთი: 3 ნაბიჯი

ვიდეო: რეალურ დროში საათი არდუინოთი: 3 ნაბიჯი

ვიდეო: რეალურ დროში საათი არდუინოთი: 3 ნაბიჯი
ვიდეო: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, ივნისი
Anonim
რეალურ დროში საათი არდუინოსთან ერთად
რეალურ დროში საათი არდუინოსთან ერთად

ამ პროექტში ჩვენ გავაკეთებთ საათს Arduino და RTC მოდულის დახმარებით. როგორც ვიცით, Arduino– ს არ შეუძლია აჩვენოს რეალური დრო, ამიტომ ჩვენ გამოვიყენებთ RTC მოდულს LCD– ზე სწორი დროის ჩვენების მიზნით. ყურადღებით წაიკითხეთ ყველა ნაბიჯი, ეს ძალიან დაგეხმარებათ საათის მექანიზმის შედგენაში.

DS3231 Arduino კოდი ჰგავს DS1307 კოდს და მუშაობს ორივე RTC ჩიპით.

Arduino კოდი ქვემოთ არ იყენებს ბიბლიოთეკას DS3231 RTC– სთვის, მავთულის ბიბლიოთეკა არის Arduino– სა და DS3231– ს შორის კორესპონდენციისათვის I2C კონვენციის გამოყენებით.

ჰო! ბევრი ელექტრონიკის ინჟინერი დამოკიდებულია მასზე დროზე დაფუძნებული პროექტებისთვის, მაგრამ RTC არ არის მთლიანად საიმედო. ის მუშაობს ბატარეაზე და უნდა შეიცვალოს ადრე თუ გვიან. IoT პროექტებზე მისვლისას იგი იკავებს მნიშვნელოვან SPI (სერიული პერიფერიული ინტერფეისი) ქინძისთავებს და არეულდება მავთულხლართებით. გამოსავალი….აქ მოდის ჩვენი გმირი NTP (ქსელის დროის პროტოკოლი). NTP იმდენად ზუსტია, რომ დრო იღებს ინტერნეტიდან. ჩვენ ვაპირებთ ამ პროტოკოლის მუშაობას კლიენტ-სერვერის რეჟიმის გამოყენებით. პროცესი იმდენად მარტივია, რომ ჩვენი Nodemcu მოქმედებს როგორც კლიენტი და ითხოვს NTP პაკეტს სერვერისგან UDP გამოყენებით. სანაცვლოდ, სერვერი უგზავნის პაკეტს კლიენტს, რომელიც აანალიზებს მონაცემებს. NTP არის დროის სინქრონიზაციის უნივერსალური პროტოკოლი. მოდით, გავანათოთ ჩვენი ლაბორატორიების სამუშაო ადგილი

ნაბიჯი 1: საჭირო კომპონენტები

  • არდუინოს დაფა
  • DS3231 RTC დაფა
  • 16x2 LCD ეკრანი
  • 2 x ღილაკი
  • 10K ohm ცვლადი რეზისტორი (ან პოტენომეტრი)
  • 330 ohm რეზისტორი
  • 3 ვ მონეტის ელემენტის ბატარეა
  • პურის დაფა
  • ჯუმბერის მავთულები

RTC მოკულა DS3231

დრო არის აუცილებელი გრძნობა, რომელიც საჭიროა ადამიანთა ამ სწრაფ სამყაროში. რეალურ დროში განხორციელებულ პროექტში

ჩვენ ვიყენებთ RTC (A. K. A რეალურ დროში საათს)

RTC რეალურ დროში საათი (RTC) არის ინტეგრირებული წრე (IC), რომელიც თვალყურს ადევნებს მიმდინარე დროს. RTC ზრუნავს დროზე რეალურ რეჟიმში. RTC ჩვეულებრივ გვხვდება კომპიუტერის დედაპლატებსა და ჩაშენებულ სისტემებში, რომლებიც საჭიროებენ დროულ წვდომას.

ნაბიჯი 2: Arduino საათის დაკავშირება

Arduino საათის კავშირი
Arduino საათის კავშირი
  • შეაერთეთ SCL პინი RTC მოდულთან Arduino A5
  • შეაერთეთ SDA პინი RTC მოდულთან Arduino A4- თან
  • შეაერთეთ VCC TO 5v და GND TO GND
  • შეაერთეთ ღილაკი პინ 8 -თან
  • შეაერთეთ სხვა ღილაკი პინ 9 -თან
  • შეაერთეთ LCD დისკი Arduino– ს პინ 2 – თან
  • შეაერთეთ LCD ეკრანი Arduino– ს პინ 3 – თან
  • შეაერთეთ LCD– ის D7 Arduino– ს პინ 7 – თან
  • შეაერთეთ LCD D6 არდუინოს პინ 6 -თან
  • შეაერთეთ LCD– ის D5 Arduino– ს პინ 5 – თან
  • შეაერთეთ LCD D4 არდუინოს 4 პინთან
  • შეაერთეთ VSS & K GND– თან
  • შეაერთეთ VDD & A 5 ვ
  • შეაერთეთ vo პოტენციომეტრის გამომავალ პინთან

ნაბიჯი 3: კოდი Arduino საათისათვის RTC– ით

კოდი Arduino საათისათვის RTC– ით
კოდი Arduino საათისათვის RTC– ით

DS3231 მუშაობს მხოლოდ BCD ფორმატით და BCD- ის ათწილადზე გადასაყვანად და პირიქით მე გამოვიყენე ქვემოთ მოცემული 2 სტრიქონი (მაგალითი წუთისთვის): // გადააქციე BCD ათწუთიან = (წუთი >> 4) * 10 + (წუთი და 0x0F);

// ათწილადის გადაყვანა BCDminute = ((წუთი / 10) << 4) + (წუთი % 10); void DS3231_display (): აჩვენებს დროს და კალენდარს, სანამ დრო და კალენდარული მონაცემები გამოისახება BCD– დან ათობით ფორმატში. მოხსნას blink_parameter ():

// რეალური დრო და საათი, D6, D7) LiquidCrystal LCD (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // button1 დაკავშირებულია pin 8 pinMode- თან (9, INPUT_PULLUP); // ღილაკი 2 დაკავშირებულია პინ 9 -თან // დააყენეთ LCD- ის სვეტებისა და რიგების რაოდენობა lcd.begin (16, 2); Wire.begin (); // შეუერთდით i2c bus} char დრო = "TIME:::"; char კალენდარი = "DATE: / / 20"; ბაიტი i, მეორე, წუთი, საათი, თარიღი, თვე, წელი; ბათილია DS3231_display () {// გადააქციეთ BCD ათწილად წამში = (მეორე >> 4) * 10 + (მეორე & 0x0F); წუთი = (წუთი >> 4) * 10 + (წუთი & 0x0F); საათი = (საათი >> 4) * 10 + (საათი & 0x0F); თარიღი = (თარიღი >> 4) * 10 + (თარიღი და 0x0F); თვე = (თვე >> 4) * 10 + (თვე & 0x0F); წელი = (წელი >> 4) * 10 + (წელი & 0x0F); // კონვერტაციის დასრულების დრო [12] = მეორე % 10 + 48; დრო [11] = მეორე / 10 + 48; დრო [9] = წუთი % 10 + 48; დრო [8] = წუთი / 10 + 48; დრო [6] = საათი % 10 + 48; დრო [5] = საათი / 10 + 48; კალენდარი [14] = წელი % 10 + 48; კალენდარი [13] = წელი / 10 + 48; კალენდარი [9] = თვე % 10 + 48; კალენდარი [8] = თვე / 10 + 48; კალენდარი [6] = თარიღი % 10 + 48; კალენდარი [5] = თარიღი / 10 + 48; lcd.setCursor (0, 0); lcd.print (დრო); // ჩვენების დრო lcd.setCursor (0, 1); lcd.print (კალენდარი); // კალენდრის ჩვენება} void blink_parameter () {byte j = 0; ხოლო (j 23) // თუ საათი> 23 ==> საათი = 0 პარამეტრი = 0; თუ (i == 1 && პარამეტრი> 59) // თუ წუთი> 59 ==> წუთი = 0 პარამეტრი = 0; თუ (i == 2 && პარამეტრი> 31) // თუ თარიღი> 31 ==> თარიღი = 1 პარამეტრი = 1; თუ (i == 3 && პარამეტრი> 12) // თუ თვე> 12 ==> თვე = 1 პარამეტრი = 1; თუ (i == 4 && პარამეტრი> 99) // თუ წელი> 99 ==> წელი = 0 პარამეტრი = 0; sprintf (ტექსტი, "%02u", პარამეტრი); lcd.setCursor (x, y); lcd.print (ტექსტი); დაგვიანება (200); // დაელოდეთ 200ms} lcd.setCursor (x, y); lcd.print (""); // ორი სივრცის ჩვენება blink_parameter (); sprintf (ტექსტი, "%02u", პარამეტრი); lcd.setCursor (x, y); lcd.print (ტექსტი); blink_parameter (); თუ (! digitalRead (8)) {// თუ ღილაკი (პინი #8) დაჭერილია i ++; // მომდევნო პარამეტრის დაბრუნების პარამეტრი 'i'; // პარამეტრების მნიშვნელობის დაბრუნება და გასვლა}}} void loop () {if (! DigitalRead (8)) {// თუ ღილაკზე (პინ #8) დაჭერილია i = 0; საათი = რედაქტირება (5, 0, საათი); წუთი = რედაქტირება (8, 0, წუთი); თარიღი = რედაქტირება (5, 1, თარიღი); თვე = რედაქტირება (8, 1, თვე); წელი = რედაქტირება (13, 1, წელი); // ათწილადის გარდაქმნა BCD წუთში = ((წუთი / 10) << 4) + (წუთი % 10); საათი = ((საათი / 10) << 4) + (საათი % 10); თარიღი = ((თარიღი / 10) << 4) + (თარიღი % 10); თვე = ((თვე / 10) << 4) + (თვე % 10); წელი = ((წელი / 10) << 4) + (წელი % 10); // კონვერტაციის დასრულება // მონაცემების ჩაწერა DS3231 RTC Wire.beginTransmission (0x68); // დაიწყეთ I2C პროტოკოლი DS3231 მისამართით Wire.write (0); // რეგისტრაციის მისამართის გაგზავნა Wire.write (0); // sesonds- ის გადატვირთვა და დაიწყოს oscillator Wire.write (წუთი); // ჩაწერეთ წუთი Wire.write (საათი); // ჩაწერეთ საათი Wire.write (1); // ჩაწერეთ დღე (არ გამოიყენება) Wire.write (თარიღი); // ჩაწერეთ თარიღი Wire.write (თვე); // ჩაწერეთ თვის Wire.write (წელი); // ჩაწერეთ წელი Wire.endTransmission (); // გადაცემის შეჩერება და გათავისუფლება I2C ავტობუსის დაგვიანებით (200); // დაელოდეთ 200ms} Wire.beginTransmission (0x68); // დაიწყეთ I2C პროტოკოლი DS3231 მისამართით Wire.write (0); // რეგისტრაციის მისამართის გაგზავნა Wire.endTransmission (ყალბი); // I2C გადატვირთეთ Wire.requestFrom (0x68, 7); // მოითხოვეთ 7 ბაიტი DS3231– დან და გაუშვით I2C ავტობუსი მეორე კითხვის ბოლოს = Wire.read (); // რეგისტრაცია წამებიდან 0 წუთი = Wire.read (); // რეგისტრაციის წაკითხვა წუთებიდან 1 საათი = Wire.read (); // კითხვის საათი რეგისტრიდან 2 Wire.read (); // დღის წაკითხვა რეგისტრიდან 3 (არ გამოიყენება) თარიღი = Wire.read (); // წაკითხვის თარიღი რეგისტრაციიდან 4 თვე = Wire.read (); // წაკითხვის თვე რეგისტრაციიდან 5 წელი = Wire.read (); // წაიკითხეთ წელი რეგისტრიდან 6 DS3231_display (); // დიაგრამის დრო და კალენდარული შეფერხება (50); // დაელოდეთ 50 წმ}

გირჩევთ: