Kết nối đồng hồ thời gian thực ds1302 với Arduino. Đồng hồ trên Arduino mà không cần sử dụng mô-đun RTC

Đồng hồ thời gian thực - module lưu trữ ngay hiện tại và không khởi động lại khi tắt nguồn nhờ có pin tích hợp. Bạn có thể đã nghe nói về đồng hồ dựa trên chip DS1307. Con chip này có độ chính xác xung nhịp cực thấp. Sự chậm trễ một giờ mỗi ngày là quá nhiều. Tôi khuyên bạn nên sử dụng mô-đun dựa trên chip DS3231 có độ chính xác cao, được trang bị nhiệt kế để điều chỉnh tốc độ xung nhịp tùy theo nhiệt độ. Độ chính xác xung nhịp của con chip này ở mức tốt đồng hồ đeo tay và là 2ppm ở nhiệt độ môi trường 0°-40°. Đồng thời, mô-đun này tương thích với tất cả các thư viện được viết cho mô-đun dựa trên chip DS1307. Bài viết nói về việc kết nối mô-đun với Arduino và tương tác với chúng bằng thư viện Time. Bạn có thể mua mô-đun như vậy từ người bán mà tôi đã xác minh.

Kết nối đồng hồ thời gian thực

Đồng hồ được kết nối bằng giao thức I2C chỉ bằng hai dây. Cần phải siết chặt thêm các đầu nối mà đồng hồ được kết nối với đường ray điện bằng điện trở 2 KΩ. Các đầu ra đồng hồ trông như thế này:

Có thể bỏ qua các chân 32K và SQW. Mục đích của họ không được thảo luận trong bài viết này. SCL và SDA là các chân giao diện I2C. Chúng cần được kết nối với bộ điều khiển. VCC và GND lần lượt là +5V và nối đất.

SCL và SDA bật bảng khác nhau nằm trên các chân khác nhau:

Uno, Nano A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)

Chân SDA của đồng hồ được kết nối với chân SDA của bộ điều khiển. Đồng hồ SDL tương ứng với bộ điều khiển SDL. Sau khi kết nối dây, bạn sẽ nhận được hình ảnh sau:

Cách thuận tiện nhất để làm việc với mô-đun đồng hồ thời gian thực là sử dụng thư viện. Điều thuận tiện nhất trong vấn đề này được gọi là: Thời gian ( Tiếng Anh thời gian).
Thư viện này là một “trình bao bọc” cho một thư viện phổ biến khác để làm việc với mô-đun đồng hồ: DS1307RTC. Mặc dù thực tế là thư viện được phát triển cho chip DS1307 nhưng nó vẫn hoạt động hoàn hảo với DS3231 vì các giao thức truyền thông tương thích.

Tải xuống cả hai thư viện.

Sau khi tải xuống, hãy đặt nội dung của kho lưu trữ vào thư mục thư viện, nằm trong thư mục môi trường phát triển Arduino. Chạy môi trường Arduino IDE và mở ví dụ tiêu chuẩn thư viện: Ví dụ->Thời gian->TimeRTC
Hoặc chỉ cần sao chép mã này:

#bao gồm #bao gồm #bao gồm void setup() ( Serial.begin(9600); while (!Serial) ; // đợi cho đến khi Arduino Serial Monitor mở setSyncProvider(RTC.get); // hàm lấy thời gian từ RTC if(timeStatus()! = timeSet) Serial.println("Không thể đồng bộ hóa với RTC"); else Serial.println("RTC đã đặt thời gian hệ thống"); ) void loop() ( if (timeStatus() == timeSet) ( digitalClockDisplay( ); ) else ( Serial.println("Thời gian chưa được đặt. Vui lòng chạy Thời gian"); Serial.println("Ví dụ về TimeRTCSet hoặc ví dụ về DS1307RTC SetTime."); Serial.println(); delay(4000) ; ) delay(1000); ) void digitalClockDisplay())( // đồng hồ kỹ thuật số hiển thị thời gian Serial.print(hour()); printDigits( Minute()); printDigits(second()); Serial.print(" " ); Serial.print(day()); Serial.print(" "); Serial.print(month()); Serial.print(" "); Serial.print(year()); Serial.println( ) ; ) void printDigits(int signatures)( // hàm tiện ích hiển thị đồng hồ số: in dấu hai chấm trước và đầu 0 Serial.print(://); if(digits< 10) Serial.print("0"); Serial.print(digits); }

#bao gồm

#bao gồm

#bao gồm

thiết lập void() (

Nối tiếp. bắt đầu (9600);

trong khi (! Nối tiếp ) ; // đợi cho đến khi Arduino Serial Monitor mở

setSyncProvider(RTC.get); // hàm lấy thời gian từ RTC

if (timeStatus() != timeSet)

Nối tiếp. println("Không thể đồng bộ với RTC");

khác

Nối tiếp. println("RTC đã đặt thời gian hệ thống");

vòng lặp trống()

if (timeStatus() == timeSet) (

digitalClockDisplay();

) khác (

Nối tiếp. println( "Thời gian chưa được thiết lập. Hãy chạy thời gian") ;

Nối tiếp. println( "Ví dụ TimeRTCSet hoặc ví dụ DS1307RTC SetTime.") ;

Nối tiếp. println();

độ trễ (4000);

độ trễ (1000);

void digitalClockDisplay() (

// đồng hồ kỹ thuật số hiển thị thời gian

Nối tiếp. in(giờ());

printDigits(phút());

printDigits(thứ hai());

Nối tiếp. in (" " ) ;

Nối tiếp. in(ngày());

Nối tiếp. in (" " ) ;

Nối tiếp. in(tháng());

Nối tiếp. in (" " ) ;

Nối tiếp. in(năm());

Nối tiếp. println();

void printDigits(int chữ số) (

// hàm tiện ích hiển thị đồng hồ số: in dấu hai chấm trước và số 0 đứng đầu

Nối tiếp. in(":");

nếu (chữ số< 10 )

Nối tiếp. in("0");

Nối tiếp. in (chữ số);

Sau khi tải bản phác thảo vào bảng, hãy khởi chạy trình giám sát cổng (Công cụ-> giám sát cổng). Bạn sẽ thấy tin nhắn từ thư viện. Thời gian hiển thị sẽ không chính xác hoặc thư viện sẽ phàn nàn rằng đồng hồ không được cấu hình. Để đặt đồng hồ, hãy tải một ví dụ từ thư viện DS1307RTC “SetTime” vào bảng (Examples->DS1307RTC->SetTime). Tải ví dụ này vào bảng của bạn. Sau khi tải xuống, đồng hồ sẽ được đặt thành thời gian biên soạn bản phác thảo. Độ trễ giữa quá trình biên dịch và nạp đầy đủ sẽ khá nhiều, đủ cho một chiếc đồng hồ được tinh chỉnh. Nhưng nếu bạn ngắt kết nối lại nguồn điện của board thì thậm chí sau vài giờ đồng hồ vẫn sẽ bị reset về thời điểm biên dịch và sẽ không chính xác. Do đó, chỉ sử dụng ví dụ này để thiết lập, sau khi thiết lập, hãy tắt đồng hồ hoặc tải một bản phác thảo khác lên bảng.

Tôi cần phải làm một cái gì đó lớn hơn bằng cách nào đó. Đồng hồ treo tường với độ sáng tự động.

Chiếc đồng hồ này là hoàn hảo cho cơ sở rộng lớn, ví dụ, một hội trường văn phòng hoặc một căn hộ lớn.

Làm một chiếc đồng hồ treo tường lớn như vậy không khó lắm bằng cách sử dụng những hướng dẫn này.


Để ước tính kích thước của đồng hồ, bạn có thể giả sử rằng một đoạn của đồng hồ sẽ có kích thước bằng tờ giấy A4, điều này sẽ giúp bạn dễ dàng sử dụng các khung ảnh có kích thước phù hợp.

Bước 1. Các thành phần của một chiếc đồng hồ treo tường cỡ lớn.

Dây điện, que hàn, mỏ hàn, dải đèn LED Arduino Nano Bộ chuyển đổi DC-DC LM2596
4 mét dải đèn LED WS2811 Cảm biến ánh sáng đồng hồ thời gian thực DS3231
công tắc micro

Những gì tôi đã sử dụng cho dự án này:

Bước 8. Lập trình đồng hồ.

Sau một hồi loay hoay, tôi đã có được một chiếc đồng hồ hoàn toàn đáp ứng được nhu cầu của mình. Tôi chắc chắn bạn có thể làm tốt hơn tôi.

Mã được nhận xét tốt và bạn sẽ không khó hiểu nó, các thông báo gỡ lỗi cũng được nhận xét rất tốt.

Nếu bạn cần thay đổi màu đồng hồ treo tường được sử dụng, bạn cần thay đổi biến ở dòng 22 ( int ledColor = 0x0000FF; // Màu được sử dụng (ở dạng hex)). Bạn có thể tìm thấy danh sách các màu và mã hex của chúng trên trang: https://github.com/FastLED/FastLED/wiki/Pixel-refe…

Nếu bạn gặp vấn đề khi tải xuống, hãy sử dụng máy nhân bản: http://bit.ly/1Qjtgg0

Bản phác thảo cuối cùng của tôi có thể được tải xuống.

Bước 9. Tạo số bằng polystyrene.

Đế cắt Cơ thể làm việc của máy cắt Hình thức chung máy cắt
Kết quả của máy cắt

Cắt từng đoạn thành mẫu đã in ở đầu.
Polystyrene có thể được cắt bằng một con dao sắc, điều này khá khó khăn hoặc bằng một thiết bị đơn giản làm từ dây nichrome hoặc dây đàn guitar và một vài miếng bảng OSB.

Bạn có thể thấy tôi đã làm như thế nào trong những hình ảnh trên.

Để cấp nguồn cho máy cắt, tôi sử dụng nguồn điện 12 v.

Kết quả của việc cắt, bạn sẽ nhận được bốn đoạn cho Đồng hồ lớn, một trong số đó được hiển thị trong ảnh.

Bước 10. Dán các con số và che mọi thứ bằng bộ khuếch tán. Đồng hồ treo tường lớn cuối cùng.

Tỏa sáng vào ban ngày Phát sáng vào ban đêm

Sau khi cắt hết bốn số và kim của đồng hồ treo tường, dán tất cả chúng lên tấm bìa cứng cùng với Dải dẫn(Tôi đã sử dụng băng dính hai mặt để làm cho quá trình này dễ dàng hơn)

Để xua đi sự cứng rắn đèn LED Tôi dùng hai tờ giấy phủ lên trên các số polystyrene. Để thuận tiện và thẩm mỹ, tôi dùng giấy khổ A2 gấp làm đôi.

Sau khi hoàn thành tất cả các bước này, tôi đặt cụm đồng hồ treo tường lớn vừa tạo vào một khung ảnh lớn phù hợp.

Chiếc đồng hồ này hóa ra rất ấn tượng và bắt mắt. Tôi nghĩ rằng một chiếc đồng hồ treo tường lớn như vậy sẽ trang trí hoàn hảo cho nhiều căn phòng.

Liên hệ với

Một trong những dự án đầu tiên mà người mới bắt đầu xây dựng bằng bảng Arduino là đồng hồ đơn giản, đếm ngược thời gian. Về cơ bản, những chiếc đồng hồ như vậy dựa trên mô-đun RTC (Đồng hồ thời gian thực) được kết nối với Arduino. Trên thị trường hiện nay Linh kiện điện tử có sẵn mô hình khác nhau RTC khác nhau về độ chính xác và giá cả. Các mẫu phổ biến bao gồm DS1302, DS1307, DS3231.



Nhưng bạn có thể tạo đồng hồ trên Arduino mà không cần sử dụng RTC, đặc biệt nếu bạn không thể có được các mô-đun như vậy. Tất nhiên, độ chính xác là trong trường hợp này sẽ nhỏ, vì vậy dự án nên được coi là một dự án đào tạo.


Nguyên lý hoạt động của những chiếc đồng hồ như vậy khá đơn giản. Mỗi khi bật đồng hồ Arduino này, bạn sẽ cần đặt nó về thời gian hiện tại, giống như bất kỳ đồng hồ analog. Chắc chắn tốt hơn hết bạn không nên sử dụng những chiếc đồng hồ như vậy trong Cuộc sống hàng ngày nếu chúng hoạt động trong một thời gian dài mà không khởi động lại và cấu hình thêm, do quá trình đồng bộ hóa với thời điểm hiện tại trong quá trình hoạt động lâu dài có thể là đáng kể.


Đồng hồ này có thể được lắp ráp bằng cách sử dụng thông thường bảng mạch, vì nó không yêu cầu nhiều thành phần. Liên kết chính của chúng tôi ở đây sẽ là phí Arduino Uno. Để hiển thị thời gian, bạn có thể sử dụng màn hình LCD 16x2. Để thay đổi cài đặt thời gian, bạn cần kết nối hai nút (đối với giờ và phút). Các nút được kết nối với Aduino thông qua điện trở 10KΩ. Để thay đổi độ sáng của màn hình, bạn sẽ cần một chiết áp 10 kOhm. Sơ đồ kết nối của tất cả các thành phần này với bo mạch Arduino Uno được hiển thị dưới đây.



Bây giờ bạn cần lập trình Arduino. Một mã đơn giản (phác họa) cho phép bạn hiển thị thời gian trên màn hình LCD được đưa ra dưới đây.


#bao gồm LCD LiquidCrystal (12,11,5,4,3,2); int h=12; int m; int s; cờ int; int THỜI GIAN; const int hs=8; const int ms=9; trạng thái int1; trạng thái int2; void setup() ( lcd.begin(16,2); ) void loop() ( lcd.setCursor(0,0); s=s+1; lcd.print("TIME:"); lcd.print(h ); lcd.print(://); lcd.print(m); lcd.print(://); lcd.print(s); if(flag<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(flag==24)flag=0; độ trễ (1000); lcd.clear(); if(s==60)( s=0; m=m+1; ) if(m==60) ( m=0; h=h+1; flag=flag+1; ) if(h==13 ) ( h=1; ) lcd.setCursor(0,1); lcd.print("CHÚC MỘT NGÀY THẬT VUI VẺ"); //-------Thời gian // cài đặt-------// state1=digitRead(hs); if(state1==1) ( h=h+1; flag=flag+1; if(flag<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(flag==24)flag=0; if(h==13)h=1; ) state2=digitRead(ms); if(state2==1)( s=0; m=m+1; ) )

   Cảm ơn bạn đã quan tâm đến dự án thông tin trang mạng.
   Nếu bạn muốn thú vị và vật liệu hữu ích xuất hiện thường xuyên hơn và có ít quảng cáo hơn,
   Bạn có thể hỗ trợ dự án của chúng tôi bằng cách quyên góp bất kỳ số tiền nào cho sự phát triển của nó.

Bài viết này thảo luận về một ví dụ về việc tạo ra một đồng hồ thời gian thực. Chỉ báo sẽ hiển thị thời gian chính xác và dấu hai chấm trên đó sẽ nhấp nháy một lần mỗi giây. Thời gian chính xác sẽ được cài đặt tự động trong quá trình biên dịch firmware.

Mô tả các thành phần

Đồng hồ thời gian thực

Chúng tôi sử dụng mô-đun đồng hồ thời gian thực từ Seeed Studio. Chúng dựa trên chip DS1307 của Maxim Integrated. Trong số các bộ phận đóng đai, nó cần có ba điện trở, thạch anh đồng hồ và pin, đã có sẵn trên mô-đun này. Mô-đun này có các thuộc tính sau:

    Đếm thời gian (giây, phút, giờ), ngày (năm, tháng, ngày), ngày trong tuần

    Giao diện I2C hai dây

Bản chất của đồng hồ thời gian thực là nếu có pin thì nó vẫn có thể chạy ngay cả khi thiết bị chính bị mất điện. Chúng ta liên tục bắt gặp những chiếc đồng hồ như vậy trên laptop hoặc máy ảnh kĩ thuật số. Nếu bạn tháo pin ra khỏi các thiết bị này và lắp lại sau một thời gian, thời gian sẽ không được đặt lại. Điều này có được là nhờ đồng hồ thời gian thực, Real Time Clock (RTC).

Tất cả các thư viện cần thiết có thể được tải xuống từ trang web chính thức.

Chỉ số

Chúng tôi sử dụng chỉ báo gồm bốn chữ số từ Seeed Studio. Thành phần chính trong chỉ báo là chip TM1637, là trình điều khiển cho các bit 7 đoạn riêng lẻ. Mô-đun này sử dụng 4 bit. Mô-đun này có các thuộc tính sau:

    8 mức độ sáng

    Giao diện hoạt động hai dây (CLK, DIO)

Chúng tôi sử dụng mô-đun này để hiển thị thời gian: giờ và phút. Sự tiện lợi của mô-đun là nó được kết nối chỉ qua hai dây và không cần triển khai phần mềm hiển thị động, vì mọi thứ đã được triển khai bên trong mô-đun.

Chỉ báo động là một quá trình trong đó các chỉ báo trong mô-đun của chúng tôi sáng lên tuần tự. Nhưng chúng ta không nhìn thấy hiện tượng nhấp nháy vì mắt người có quán tính rất lớn. Phương pháp này cho phép bạn lưu rất tốt số lượng kết nối giữa các chỉ báo và bộ điều khiển:

    Hiển thị tĩnh: 4 chữ số × 7 đoạn = 28 kết nối.

    Chỉ thị động: 7 đoạn + 4 cực dương hoặc cực âm chung = 11 kết nối.

    Chip TM1637: 2 kết nối.

Lợi ích là rõ ràng.

Sự liên quan

Mô-đun đồng hồ thời gian thực phải được kết nối với các chân SCL/SDA liên quan đến bus I2C. Cũng cần phải kết nối đường dây nguồn (Vcc) và mặt đất (GND).

Các dòng SDA/SCL có các chân riêng biệt trên Arduino, nhưng bên trong chúng được kết nối bằng cách nào đó với các chân mục đích chung. Nếu chúng ta nhìn vào Arduino Uno, dòng SDA tương ứng với chân A4 và dòng SCL tương ứng với A5.

Mô-đun này đi kèm với một dây cáp có tiếp điểm cái, thuận tiện hơn khi kết nối với Troyka Shield. Tuy nhiên, các chân SDA và SCL riêng biệt không được hiển thị trên đó nên chúng tôi kết nối trực tiếp qua chân A5 và A4.

Về mặt kết nối chỉ báo, mọi thứ đơn giản hơn nhiều. Các chân CLK và DIO có thể được kết nối với bất kỳ chân kỹ thuật số nào. Trong trường hợp này, chân thứ 12 và thứ 11 được sử dụng tương ứng.

Viết chương trình cơ sở

Chức năng thiết lập sẽ khởi tạo đồng hồ và chỉ báo thời gian thực, đồng thời ghi lại thời gian biên dịch trong bộ nhớ trongđồng hồ thời gian thực. Toàn bộ hành động, hay đúng hơn là đọc thời gian từ RTC và hiển thị nó trên chỉ báo, sẽ được thực hiện trong chức năng vòng lặp.

Mã cho việc này trông như thế này:

rtc.ino #include #bao gồm // Các lớp TM1637 và DS1307 được khai báo trong đó cái đồng hồ ; void setup() ( clock .begin() ; clock clock .setTime() ; ) void loop() ( int8_t timeDisp[ 4 ] ; //Yêu cầu xem thời gian từ đồng hồ] = đồng hồ .phút % 10 ; display.point (đồng hồ .giây % 2 ? POINT_ON : POINT_OFF) ; ) //Nội dung của hàm được giải thích bên dưới char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0" ) * 10 + int (string[ startIndex+ 1 ] ) - "0" ; )

Bây giờ chúng ta tải mã này vào môi trường phát triển, biên dịch và tải lên. Chúng tôi nhìn vào màn hình - bingo! Thời gian trên màn hình là thời gian biên dịch.

Giải thích hàm getInt

Trước tiên, bạn cần hiểu thời gian đến từ đâu trong mảng biên dịch. Nó xuất hiện trong dòng này:

char không dấu biên dịchTime = __TIME__;

Trình biên dịch thay thế __TIME__ bằng một chuỗi chứa thời gian biên dịch ở dạng __TIME__ = "hh:mm:ss" , trong đó hh là giờ, mm là phút, ss là giây.

Hãy quay lại đoạn mã cần được giải thích:

char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0" ) * 10 + int (string[ startIndex+ 1 ] ) - "0" ; )

Trong mảng chuỗi được truyền dưới dạng tham số cho hàm getInt, chúng ta nhận được ký tự ở chỉ mục startIndex và ký tự theo sau nó kết thúc bằng một số nguyên có hai chữ số. Tuy nhiên, ban đầu đây không phải là một con số mà là một cặp nhân vật. Để lấy một số từ một ký hiệu, chúng ta cần trừ ký hiệu số 0 (“0”) khỏi ký hiệu này: xét cho cùng, trong bảng ASCII tất cả các ký hiệu chữ số lần lượt xuất hiện, bắt đầu bằng ký hiệu số 0. Do đó, mã int(string) - "0"), theo nghĩa đen, thực hiện như sau: “Lấy số ký tự startIndex, trừ ký tự 0 khỏi nó và chuyển nó thành kiểu số nguyên.”

Các vấn đề

Có, mã này đang hoạt động và đồng hồ sẽ chạy. Tuy nhiên, nếu bạn tắt nguồn và bật lại sau vài phút thì sau khi bật lên, thời gian sẽ trở lại như lúc biên dịch.

Điều này xảy ra vì sau khi bật nguồn, mã tìm thấy trong chức năng thiết lập sẽ được thực thi lại. Và anh ta ghi giá trị thời gian cũ vào đồng hồ thời gian thực.

Để tránh điều này, chúng ta cần sửa đổi mã thêm một chút. Mỗi lần trong chức năng thiết lập, một “băm” của thời gian biên dịch sẽ được tính - số giây đã trôi qua từ 00:00:00 đến thời gian biên dịch sẽ được tính. Và hàm băm này sẽ được so sánh với hàm băm trong EEPROM. Hãy để chúng tôi nhắc bạn rằng EEPROM là bộ nhớ không được đặt lại khi tắt nguồn.

Nếu các giá trị của hàm băm được tính toán và lưu trước đó trùng khớp, điều này có nghĩa là không cần phải viết lại thời gian trong mô-đun đồng hồ: việc này đã được thực hiện. Nhưng nếu việc kiểm tra này không thành công thì thời gian sẽ bị ghi đè trong RTC.

Để ghi/đọc một số kiểu unsigned int vào/từ EEPROM, hai chức năng bổ sung EEPROMWriteInt và EEPROMReadInt. Chúng được thêm vào vì các hàm EEPROM.read và EEPROM.write chỉ có thể đọc và ghi dữ liệu char.

rtc-eeprom.ino #include #bao gồm #include "TM1637.h" #include "DS1307.h" // Mảng chứa thời gian biên dịch char biên dịchTime = __TIME__; // Số chân Arduino mà đèn báo được kết nối#xác định DISPLAY_CLK_PIN 12 #xác định DISPLAY_DIO_PIN 13 // Để làm việc với chip đồng hồ và chỉ báo, chúng tôi sử dụng thư viện Màn hình TM1637 (DISPLAY_CLK_PIN, DISPLAY_DIO_PIN); đồng hồ DS1307; thiết lập void() ( //Kích hoạt và cấu hình chỉ báo display.set(); display.init(); // Khởi động đồng hồ thời gian thực clock.begin(); // Lấy một số từ một chuỗi, biết số của ký tự đầu tiên byte giờ = getInt(compileTime, 0 ); byte phút = getInt(compileTime, 3 ); byte giây = getInt(compileTime, 6 ); // Băm thời gian cải tiến //Chứa số giây kể từ đầu ngày hàm băm unsigned int = giờ * 60 * 60 + phút * 60 + giây; // Kiểm tra xem hàm băm mới có khớp với hàm băm trong EEPROM không if (EEPROMReadInt(0 ) != băm) ( // Lưu hàm băm mới EEPROMWriteInt(0, hàm băm); //Chuẩn bị giờ, phút, giây để ghi vào RTCđồng hồ .fillByHMS(giờ, phút, giây); // Ghi dữ liệu này vào bộ nhớ trong của đồng hồ. // Từ lúc này họ bắt đầu đếm thời gian chúng ta cần clock.setTime(); ) ) void vòng lặp() ( //Các giá trị hiển thị trên mỗi 4 chữ số int8_t timeDisp[ 4 ] ; //Yêu cầu xem thời gian từ đồng hồ] = đồng hồ .phút % 10 ; //...rồi hiển thị ra màn hình display.display(timeDisp); // chúng tôi không có chữ số riêng biệt cho giây, vì vậy //chúng tôi sẽ bật và tắt dấu hai chấm mỗi giây display.point (đồng hồ .giây % 2 ? POINT_ON : POINT_OFF) ; ) char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0" ) * 10 + int (chuỗi[ startIndex+ 1 ] ) - "0" ; ) // Ghi một số có hai byte vào bộ nhớ void EEPROMWriteInt(địa chỉ int, giá trị int) ( ​​EEPROM.write (địa chỉ, lowByte(value) ) ; EEPROM.write (địa chỉ + 1 , highByte(value) ) ; ) //Đọc một số từ bộ nhớ unsigned int EEPROMReadInt(int address) ( byte lowByte = EEPROM.read (địa chỉ) ; byte highByte = EEPROM.read (địa chỉ + 1 ) ; return (highByte<< 8 ) | lowByte; }

Phần kết luận

Bài viết này đưa ra một ví dụ về cách làm việc với chip đồng hồ thời gian thực RTC DS1307 và chip điều khiển chỉ báo TM1637; chúng tôi cũng đã học cách lấy ngày và giờ ở giai đoạn biên dịch. Bây giờ, nếu bạn đặt thời gian mong muốn trên đồng hồ, sau đó tắt nguồn trong ít nhất vài giờ thì sau khi bật, thời gian sẽ lại chính xác. Đã kiểm tra!

Mọi chuyện bắt đầu từ việc tình cờ tôi là chủ nhân của chiếc màn hình LCD văn bản BTHQ 22005VSS (2 dòng mỗi dòng 20 ký tự) và một bảng đồng hồ điện tử DS1302. Thành thật mà nói, tôi đang thực hiện những bước đầu tiên trong lĩnh vực Kỹ thuật Arduino, vì vậy giá cả phải chăng và khả năng giao hàng nhanh đóng vai trò quyết định trong việc mua những bộ phận này. Rốt cuộc, thường không có thời gian để chờ đợi “thiết bị” đến từ Trung Quốc, sau khi đã đi gần “một nửa thế giới” và đơn giản là bạn không muốn.

Tại sao lại xem đồng hồ? Vào thời điểm có rất nhiều đồng hồ khác nhau được bày bán, giá của những chiếc đơn giản nhất có thể sánh ngang với một hộp nước trái cây. Nhưng vấn đề là thường không chỉ cần biết chính xác thời gian (và ngày tháng, điều này đôi khi cũng cần thiết) mà còn phải vận hành theo thời gian này. Ví dụ: ghi nhật ký về những thay đổi về nhiệt độ (độ ẩm, áp suất, ánh sáng, v.v.) cho biết thời gian chính xác khi những thay đổi này xảy ra. Đây là nơi ARDUINO, được trang bị đồng hồ, sẽ cung cấp dịch vụ tuyệt vời. Và bên cạnh đó, thật tuyệt khi thiết bị còn hiển thị thời gian. Suy cho cùng, ngay cả khi làm việc trên máy tính cá nhân, chúng ta thỉnh thoảng liếc nhìn góc dưới bên phải, nếu đã đến giờ ăn trưa, hoặc đã hết ngày làm việc, hoặc có thể trời đã sáng thì sao?

Trọng tâm của dự án này là ARDUINO UNO, khá dễ mua - tất nhiên, điều này nếu bạn muốn mua thứ gì đó có chất lượng cao và nhanh chóng. Tất nhiên, bạn có thể thấy nó rẻ hơn, nhưng một lần nữa bạn lại phải đợi và tôi không muốn đợi. Arduinka vui vẻ nháy đèn LED, làm mọi thứ được yêu cầu, đưa ra những thông báo đơn giản qua cổng nối tiếp và nói chung khiến tôi rất vui. Nhưng chúng ta hãy quay trở lại với đồng hồ. Các vấn đề bắt đầu, như mọi khi, bất ngờ. Không thể tìm thấy những bài báo hợp lý và mọi thứ khác trên màn hình hoặc hàng giờ tại cuộc biểu tình. Trên các màn hình khác - có, trên những chiếc đồng hồ khác - bao nhiêu tùy thích, nhưng trên những gì bạn cầm trên tay - hầu như không có gì. Nhưng khi không có gì thì “gần như” cũng là nhiều.

Hãy bắt đầu với màn hình. BTHQ 22005VSS hóa ra là một màn hình LCD 20x2 tầm thường (tức là nó có 2 dòng, mỗi dòng 20 ký tự); thay vào đó, hoàn toàn có thể sử dụng một màn hình - mặc dù nó “chỉ” có 16 ký tự trên mỗi dòng , nhưng đối với hầu hết các dự án thì điều này là quá đủ. Màn hình này có đầu nối 16 chân, tuy không phải hàng đơn mà là hàng đôi (2x8), nếu bạn cầm máy với màn hình hướng ra xa bạn và đầu nối ở bên phải thì chân đầu tiên sẽ là phía dưới bên trái, cái thứ hai phía dưới bên phải, cái thứ ba ở trên cái thứ nhất, cái thứ tư ở trên cái thứ hai, v.v. Phía trên bên trái (15) sẽ là cực dương, phía trên bên phải (16) sẽ là cực âm. Nếu bạn có kiến ​​​​thức về tiếng Anh và tò mò, bạn có thể đọc mô tả kỹ thuật. Nếu có rất ít điều đầu tiên và sự tò mò yếu hơn nhiều so với mong muốn thử nghiệm, thì đây là cách tôi kết nối nó:

Màn hình liên hệ Liên hệ Arduino Ghi chú
1 GND Đây là "trừ" hoặc "mặt đất".
2 +5V
3 GND Nếu bạn cần những dấu hiệu tươi sáng.
4 4
5 GND Nếu chỉ để “viết”.
6 5
7 -- không sử dụng
8 -- không sử dụng
9 -- không sử dụng
10 -- không sử dụng
11 10
12 11
13 12
14 13
A(15) +5V Tôi kết nối qua điện trở 500 Ohm
K(16) GND

Trong một số nguồn, “sơ đồ chân” ở phía Arduino có khác, nhưng đối với tôi theo cách này thì thuận tiện hơn. Việc kết nối đồng hồ cũng không gây ra vấn đề gì:

Đồng hồ DS1302 Arduino Ghi chú
VCC +5V
GND GND Ở đây tôi kết nối nó thông qua điện trở 10 kOhm.
CLK 0 Đừng nhầm lẫn với GND!!! Chân này còn được gọi là SCLK
ĐẠT 1 Liên hệ còn được gọi là IO
RST 3 Liên hệ còn được gọi là CE

Bạn có thể kết nối nó bằng dây hoặc cáp, cá nhân tôi đã lắp ráp nó trên một bảng mạch.

Sự cố bắt đầu xảy ra khi bản demo được tải và đồng hồ bắt đầu hoạt động. Đúng, họ hiển thị năm 2165, tháng 45, tuần 85... Có lẽ đây là theo lịch "Sao Thiên Vương" hoặc "Sao Hải Vương"... Nhưng tôi sẽ không sống trên Trái đất, và tôi sẽ không đi tới sao Thiên Vương và sao Hải Vương. Nói chung là cần phải làm gì đó. Hàn một điện trở 10kOhm vào mạch GND->GND không giúp được gì. Vấn đề hóa ra là một thư viện không chính xác. Tôi sẽ nói ngay rằng có thể lấy đúng thư viện. Cái này dành cho đồng hồ. Màn hình nhỏ sử dụng thành công thư viện từ bộ tiêu chuẩn, được gọi là LiquidCrystal.h.

Vấn đề số 2. Mỗi khi đồng hồ bắt đầu, nó sẽ bắt đầu đếm từ thời điểm được “khâu” trong chương trình. Có một giải pháp phức tạp cho vấn đề này. Tạo một hàm băm, ghi nó vào bộ nhớ đồng hồ, sau đó khi bắt đầu, hãy đọc nó từ đó, so sánh nó... Nói chung, đối với người mới bắt đầu học kỹ thuật Arduino thì hơi phức tạp. Hóa ra, có một giải pháp đơn giản. hay nói đúng hơn là rất đơn giản. Cụ thể là flash nó 2 lần. Lần đầu tiên - flash nó bằng cách cài đặt ngày và giờ, lần thứ hai flash nó, trước đó đã “nhận xét” (đặt dấu // ở đầu dòng) các dòng có cài đặt ngày này.

Trên thực tế bản phác thảo:

// DS1302_LCD(C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
// Bản demo nhanh về cách sử dụng thư viện DS1302 của tôi để thực hiện nhanh chóng
// đồng hồ sử dụng DS1302 và màn hình LCD 20x2.
// Sự tương ứng giữa các chân đồng hồ và màn hình pinpm của Arduino.
// DS1302: Chân CE -> Arduino Digital 3
// Chân I/O -> Arduino Digital 1
// Chân SCLK -> Arduino Digital 0
// LCD: DB7 -> Arduino Digital 13
// DB6 -> Arduino kỹ thuật số 12
// DB5 -> Arduino kỹ thuật số 11
// DB4 -> Arduino kỹ thuật số 10
// E -> Arduino kỹ thuật số 5
// RS -> Arduino kỹ thuật số 4

#bao gồm // Kết nối thư viện màn hình.
#bao gồm // Kết nối thư viện đồng hồ.

// Khởi tạo các chân đồng hồ
DS1302 rtc(3, 1, 0);
// Khởi tạo ghim màn hình
LCD LiquidCrystal(4, 5, 10, 11, 12, 13);

thiết lập trống()
{
// Khởi động đồng hồ
rtc.halt(sai);
rtc.writeProtect(false);

// Khởi chạy màn hình hiển thị số lượng ký tự và dòng
lcd.begin(20, 2);

// Ba dòng dưới cùng không được chú thích lần đầu tiên; chúng tôi chỉ ra ngày và giờ hiện tại trong đó. Lần thứ hai - hãy bình luận.
//rtc.setDOW(THỨ NĂM); // Ngày trong tuần, nếu là thứ Sáu thì đừng viết THỨ SÁU bằng tiếng Nga!
//rtc.setTime(11, 41, 0); // Giờ, phút, giây ở định dạng 24 giờ.
//rtc.setDate(13, 6, 2013); // Ngày của. BẰNG SỐ!!! Bạn không cần phải đặt số 0 trước một chữ số!
}

vòng lặp trống()
{
// Hiển thị thời gian tập trung ở dòng trên
lcd.setCursor(6, 0); // Đặt con trỏ in thời gian ở dòng trên cùng
lcd.print(rtc.getTimeStr()); // In thời gian

// Hiển thị Ngày trong tuần viết tắt ở góc dưới bên trái
lcd.setCursor(0, 1); // Đặt con trỏ ở phía dưới bên trái để in ngày trong tuần
lcd.print(rtc.getDOWStr(FORMAT_LONG)); // In đầy đủ ngày trong tuần vì màn hình cho phép.

// Hiển thị ngày ở góc dưới bên phải
lcd.setCursor(9, 1); // Đặt con trỏ để in ngày
lcd.print(rtc.getDateStr()); // In ngày tháng

// Đợi một giây trước khi lặp lại
độ trễ (1000); // Tạm dừng 1 giây và bắt đầu lại!
}