Სარჩევი:

DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება Arduino– ით: 3 ნაბიჯი
DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება Arduino– ით: 3 ნაბიჯი

ვიდეო: DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება Arduino– ით: 3 ნაბიჯი

ვიდეო: DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება Arduino– ით: 3 ნაბიჯი
ვიდეო: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 2024, ნოემბერი
Anonim
DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება არდუინოსთან ერთად
DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება არდუინოსთან ერთად
DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება არდუინოსთან ერთად
DS1307 და DS3231 რეალურ დროში საათის მოდულების გამოყენება არდუინოსთან ერთად

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

რეალურ დროში საათის მოდულებზე IC– ებს შორის ორი ძირითადი განსხვავებაა, რაც არის დროის შენახვის სიზუსტე. პირველ მოდულში გამოყენებული DS1307 ძალიან კარგად მუშაობს, თუმცა გარე ტემპერატურას შეუძლია გავლენა მოახდინოს ოსცილატორის წრედის სიხშირეზე, რომელიც მართავს DS1307- ის შიდა მრიცხველს.

ეს შეიძლება პრობლემად ჟღერდეს, მაგრამ ჩვეულებრივ გამოიწვევს საათის გამორთვას თვეში დაახლოებით ხუთი წუთის განმავლობაში. DS3231 ბევრად უფრო ზუსტია, რადგან მას აქვს შიდა ოსცილატორი, რომელსაც გარე ფაქტორები არ იმოქმედებენ - და ამდენად ზუსტია წელიწადში რამდენიმე წუთამდე. თუ თქვენ გაქვთ DS1307 მოდული- ნუ იგრძნობთ თავს ცუდად, ის მაინც დიდი ღირებულების დაფაა და კარგად მოგემსახურებათ. ორივე მოდულთან ერთად საჭიროა სარეზერვო ბატარეა.

კარგი იდეაა შეიძინოთ ახალი CR2032 ბატარეა და მოათავსოთ იგი მოდულში. დროის და თარიღის თვალყურის დევნებასთან ერთად, ამ მოდულებს აქვთ მცირე EEPROM, განგაშის ფუნქცია (მხოლოდ DS3231) და სხვადასხვა სიხშირის კვადრატული ტალღის გენერირების უნარი-ყოველივე ეს იქნება მეორე გაკვეთილის საგანი.

ნაბიჯი 1: თქვენი მოდულის დაკავშირება არდუინოსთან

ორივე მოდული იყენებს I2C ავტობუსს, რაც აადვილებს კავშირს.

პირველ რიგში თქვენ უნდა დაადგინოთ რომელი ქინძისთავები თქვენს Arduino- ში ან თავსებადი დაფები გამოიყენება I2C ავტობუსისთვის - ეს იქნება ცნობილი როგორც SDA (ან მონაცემები) და SCL (ან საათი). Arduino Uno– ს ან თავსებადი დაფებზე, ეს ქინძისთავები არის A4 და A5 მონაცემთა და საათისათვის; Arduino Mega– ზე არის D20 და D21 მონაცემთა და საათისათვის; და თუ თქვენ იყენებთ Pro Mini თავსებადი ქინძისთავებს, არის A4 და A5 მონაცემებისა და საათისათვის, რომლებიც პარალელურია ძირითადი ქინძისთავებისთვის.

DS1307 მოდული

თუ თქვენ გაქვთ DS1307 მოდული, თქვენ უნდა შეაერთოთ მავთულები დაფაზე, ან შეაერთოთ სათაურის საყრდენებზე, რათა გამოიყენოთ ჯუმბერის მავთულები. შემდეგ დააკავშირეთ SCL და SDA ქინძისთავები თქვენს Arduino– სთან, ხოლო Vcc პინი 5V პინთან და GND GND– თან.

DS3231 მოდული

ამ მოდულის დაკავშირება ადვილია, რადგან სათაურის ქინძისთავები დამონტაჟებულია დაფაზე ქარხანაში. თქვენ უბრალოდ შეგიძლიათ გაუშვათ ჯამპერის მავთულები ისევ SCL და SDA– დან Arduino– მდე და ისევ მოდულის Vcc და GND ქინძისთავებიდან თქვენი დაფის 5V ან 3.3. V და GND. თუმცა ეს დუბლირებულია მეორე მხარეს საკუთარი მავთულის შესადუღებლად. ორივე ამ მოდულს აქვს საჭირო გამწევი რეზისტორები, ასე რომ თქვენ არ გჭირდებათ საკუთარი დამატება. I2C ავტობუსთან დაკავშირებული ყველა მოწყობილობის მსგავსად, შეეცადეთ SDA და SCL ხაზების სიგრძე მინიმუმამდე დაიყვანოთ.

ნაბიჯი 2: წაიკითხეთ და ჩაწერეთ დრო თქვენი RTC მოდულიდან

მას შემდეგ რაც შეაერთეთ თქვენი RTC მოდული. შეიყვანეთ და ატვირთეთ შემდეგი ესკიზი. მიუხედავად იმისა, რომ ესკიზში შენიშვნები და ფუნქციები ეხება მხოლოდ DS3231- ს, კოდი ასევე მუშაობს DS1307- თან.

#ჩართეთ "Wire.h"#განსაზღვრეთ DS3231_I2C_ADDRESS 0x68 // ნორმალური ათობითი რიცხვების გადაყვანა ორობითი კოდირებული ათობითი ბაიტი decToBcd (ბაიტი val) {დაბრუნება ((val/10*16) + (val%10)); } // ორობითი კოდირებული ათწილადის ნორმალურ ათეულ ციფრებად გადაყვანა byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); სერიული.დაწყება (9600); // დააყენეთ საწყისი დრო აქ: // DS3231 წამი, წუთი, საათი, დღე, თარიღი, თვე, წელი // setDS3231 დრო (30, 42, 21, 4, 26, 11, 14); } void setDS3231 დრო (ბაიტი წამი, ბაიტი წუთი, ბაიტი საათი, ბაიტი dayOfWeek, byte dayOfMonth, ბაიტი თვე, ბაიტი წელი) {// ადგენს დროისა და თარიღის მონაცემებს DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // მომდევნო შეყვანის დაყენება წამებში რეგისტრაციისთვის Wire.write (decToBcd (მეორე)); // წამების დაყენება Wire.write (decToBcd (წუთი)); // წუთების დაყენება Wire.write (decToBcd (საათი)); // საათების დაყენება Wire.write (decToBcd (dayOfWeek)); // კვირის დღის დადგენა (1 = კვირა, 7 = შაბათი) Wire.write (decToBcd (dayOfMonth)); // თარიღის დაყენება (1 -დან 31 -მდე) Wire.write (decToBcd (თვე)); // მითითებული თვე Wire.write (decToBcd (წელი)); // დადგენილი წელი (0 -დან 99 წლამდე) Wire.endTransmission (); } void readDS3231 დრო (ბაიტი *მეორე, ბაიტი *წუთი, ბაიტი *საათი, ბაიტი *dayOfWeek, ბაიტი *dayOfMonth, ბაიტი *თვე, ბაიტი *წელი) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // დააყენეთ DS3231 რეგისტრაციის მაჩვენებელი 00h Wire.endTransmission (); მავთული. მოთხოვნა (DS3231_I2C_ADDRESS, 7); // მოითხოვეთ მონაცემთა შვიდი ბაიტი DS3231– დან რეგისტრიდან 00h *მეორე = bcdToDec (Wire.read () & 0x7f); *წუთი = bcdToDec (Wire.read ()); *საათი = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *თვე = bcdToDec (Wire.read ()); *წელი = bcdToDec (Wire.read ()); } void displayTime () {ბაიტი წამი, წუთი, საათი, dayOfWeek, dayOfMonth, თვე, წელი; // მონაცემების მიღება DS3231 წაკითხულიდან DS3231 დრო (& მეორე, & წუთი, & საათი, & dayOfWeek, & dayOfMonth, & month, & year); // გააგზავნეთ სერიულ მონიტორზე Serial.print (საათი, საოლქო საარჩევნო კომისია); // გადააკეთეთ ბაიტის ცვლადი ათობითი რიცხვში, როდესაც ნაჩვენებია Serial.print (":"); if (წუთი <10) {Serial.print ("0"); } Serial.print (წუთი, DEC); Serial.print (":"); if (მეორე <10) {Serial.print ("0"); } Serial.print (მეორე, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (თვე, DEC); Serial.print ("/"); Serial.print (წელი, DEC); Serial.print ("კვირის დღე:"); გადართვა (dayOfWeek) {შემთხვევა 1: Serial.println ("კვირა"); შესვენება; საქმე 2: Serial.println ("ორშაბათი"); შესვენება; საქმე 3: Serial.println ("სამშაბათი"); შესვენება; საქმე 4: Serial.println ("ოთხშაბათი"); შესვენება; საქმე 5: Serial.println ("ხუთშაბათი"); შესვენება; საქმე 6: Serial.println ("პარასკევი"); შესვენება; საქმე 7: Serial.println ("შაბათი"); შესვენება; }} void loop () {displayTime (); // სერიულ მონიტორზე რეალურ დროში საათის მონაცემების ჩვენება, დაყოვნება (1000); // ყოველ წამს }

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

ის პირველ რიგში მოიცავს Wire ბიბლიოთეკას, რომელიც გამოიყენება I2C ავტობუსის კომუნიკაციისთვის, რასაც მოყვება RTC– ის ავტობუსის მისამართის განსაზღვრა 0x68. მათ მოყვება ორი ფუნქცია, რომლებიც ათწილად რიცხვებს გადააქცევს BCD- ში (ორობითი კოდირებული ათწილადი) და პირიქით. ეს აუცილებელია, რადგან RTC IC– ები მუშაობენ BCD– ში და არა ათობითი.

საათის დაყენებისათვის გამოიყენება ფუნქცია setDS3231time (). მისი გამოყენება ძალიან მარტივია, მარტივი მნიშვნელობების ჩასმა წლიდან მეორეზე და RTC დაიწყება იმ დროიდან. მაგალითად, თუ გსურთ დააყენოთ შემდეგი თარიღი და დრო - ოთხშაბათი, 2014 წლის 26 ნოემბერი და საღამოს 9:42 საათი და 30 წამი - თქვენ გამოიყენებთ:

setDS3231 დრო (30, 42, 21, 4, 26, 11, 14);

ნაბიჯი 3:

გაითვალისწინეთ, რომ დრო დადგენილია 24-საათიანი დროის გამოყენებით, ხოლო მეოთხე პარამეტრი არის "კვირის დღე". ეს მოდის 1 -დან 7 -მდე, შესაბამისად კვირადან შაბათამდე. ეს პარამეტრები არის ბაიტის მნიშვნელობები, თუ თქვენ იყენებთ საკუთარ ცვლადებს.

ერთხელ თქვენ გაუშვით ფუნქცია გონივრული იქნება მისი წინსვლა // და ატვირთოთ თქვენი კოდი ისევ, ასე რომ ის არ გადატვირთავს ენერგიის ციკლით მუშაობის ან მიკროკონტროლის გადატვირთვის დროს. თქვენი RTC– ის დროის წაკითხვა ისეთივე მარტივია, ფაქტობრივად, პროცესს შეიძლება მოყვეს ფუნქცია displayTime () ფუნქციის შიგნით. თქვენ უნდა განსაზღვროთ შვიდი ბაიტი ცვლადი მონაცემების შესანახად RTC– დან და ისინი შემდეგ ჩასმულია ფუნქციაში readDS3231time (). მაგალითად, თუ თქვენი ცვლადებია:

ბაიტი წამი, წუთი, საათი, დღე კვირაში, დღე თვეში, თვეში, წელს;

… თქვენ განაახლეთ ისინი RTC– ს ამჟამინდელი მონაცემებით, გამოყენებით:

წაკითხული DS3232 დრო (& მეორე, & წუთი, & საათი, & dayOfWeek, & dayOfMthth, & month, & year);

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

მხოლოდ იმის შესამოწმებლად, რომ ყველაფერი მუშაობს, ჩაწერეთ სადემონსტრაციო ესკიზში შესაბამისი დრო და თარიღი, ატვირთეთ იგი, დატოვეთ კომენტარი setDS3231time () ფუნქციის შესახებ და კვლავ ატვირთეთ. შემდეგ გახსენით სერიული მონიტორი და თქვენ უნდა მოგაწოდოთ მიმდინარე დროისა და თარიღის გაშვებული ჩვენება.

ამ მომენტიდან თქვენ გაქვთ პროგრამული ინსტრუმენტები მონაცემების დასაყენებლად და ამოღებისთვის თქვენი რეალურ დროში საათის მოდულიდან და ჩვენ ვიმედოვნებთ, რომ თქვენ გექნებათ გაგება, თუ როგორ გამოიყენოთ ეს იაფი მოდულები.

თქვენ შეგიძლიათ გაიგოთ მეტი რეალურ დროში საათის IC– ების შესახებ მწარმოებლის ვებ – გვერდიდან-DS1307 და DS3231.

ეს პოსტი მოაქვს pmdway.com– ით - ყველაფერი მწარმოებლებისთვის და ელექტრონიკის მოყვარულთათვის, უფასო მიწოდებით მთელს მსოფლიოში.

გირჩევთ: