Mục lục:

Đồng hồ văn bản cuộn Arduino: 3 bước
Đồng hồ văn bản cuộn Arduino: 3 bước

Video: Đồng hồ văn bản cuộn Arduino: 3 bước

Video: Đồng hồ văn bản cuộn Arduino: 3 bước
Video: Làm đồng hồ Decor Vô Cực siêu ảo diệu | Hollow Clock 2024, Tháng mười một
Anonim
Đồng hồ văn bản cuộn Arduino
Đồng hồ văn bản cuộn Arduino

Mục đích của dự án này là xây dựng một đồng hồ văn bản cuộn hiển thị thời gian khi nó được nói (ví dụ: “bây giờ là nửa đêm”).

Đây là một dự án nhanh - chúng tôi cung cấp cho bạn đủ để bắt đầu với phần cứng và bản phác thảo, sau đó bạn có thể thực hiện thêm cho phù hợp với nhu cầu của mình.

Bước 1: Phần cứng

Phần cứng
Phần cứng

Bạn sẽ cần ba mục chính -

  • một bảng tương thích Arduino Uno
  • mạch đồng hồ thời gian thực hoặc mô-đun sử dụng IC DS1307 hoặc DS3231
  • và màn hình LED đơn sắc kiểu P10

Bạn có thể muốn một nguồn điện bên ngoài, nhưng chúng ta sẽ giải quyết vấn đề đó sau.

Giai đoạn đầu tiên là lắp đồng hồ thời gian thực của bạn. Bấm vào đây để xem hướng dẫn nếu bạn cần trợ giúp về điều đó.

Bây giờ, tôi hy vọng bạn đang nghĩ "làm cách nào để thiết lập thời gian?".

Có hai câu trả lời cho câu hỏi đó. Nếu bạn đang sử dụng DS3231 chỉ cần đặt nó trong bản phác thảo (xem bên dưới) vì độ chính xác rất tốt, bạn chỉ cần tải bản phác thảo lên với thời gian mới hai lần một năm để tiết kiệm ánh sáng ban ngày.

Nếu không, hãy thêm một giao diện người dùng đơn giản - một vài nút có thể làm được. Cuối cùng, bạn chỉ cần đặt phần cứng ở mặt sau của DMD. Có rất nhiều phạm vi để đáp ứng nhu cầu của riêng bạn, một giải pháp đơn giản có thể là căn chỉnh bảng điều khiển để bạn có thể truy cập ổ cắm USB một cách dễ dàng - và sau đó gắn nó với một số Sugru.

Liên quan đến việc cấp nguồn cho đồng hồ - bạn có thể chạy MỘT màn hình LED từ Arduino và nó chạy ở độ sáng tốt để sử dụng trong nhà. Nếu bạn muốn DMD hoạt động ở độ sáng tối đa, gây cháy võng mạc, bạn cần sử dụng nguồn điện 5V 4A DC riêng biệt. Nếu bạn đang sử dụng hai DMD - chuyển đến 8A, v.v. Chỉ cần kết nối nguồn điện bên ngoài với một thiết bị đầu cuối của DMD (kết nối DMD thứ hai trở lên với các thiết bị đầu cuối này).

Nếu bạn không thích cắt đầu cáp cấp nguồn của mình, hãy sử dụng thiết bị ngắt ổ cắm DC.

Bước 2: Phác thảo Arduino

Bạn sẽ cần cài đặt hai thư viện Arduino sau - TimerOne và DMD. Sau đó tải lên bản phác thảo:

// đối với RTC # bao gồm "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC là 0x68

// cho màn hình LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // bạn có thể có nhiều DMD trong một row #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

Chuỗi cuối cùng; // được sử dụng để giữ câu cuối cùng để hiển thị trên DMD

void ScanDMD () // bắt buộc đối với DMD

{dmd.scanDisplayBySPI (); }

void setup ()

{// cho DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (true);

// cho RTC

Wire.begin (); // kích hoạt byte bus I2C giây, phút, giờ, dayOfWeek, dayOfMonth, tháng, năm; // thay đổi các biến và bỏ ghi chú setDateDs1307 để đặt thời gian // sau đó nhận xét lại hàm và tải lên bản phác thảo lần nữa second = 0; phút = 13; giờ = 23; dayOfWeek = 4; dayOfMonth = 19; tháng = 5; năm = 13; // setDateDs1307 (giây, phút, giờ, ngàyOfWeek, dayOfMonth, tháng, năm); }

// các hàm RTC thông thường

// Chuyển số thập phân bình thường thành byte thập phân được mã hóa nhị phân decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); }

// Chuyển đổi số thập phân được mã hóa nhị phân thành số thập phân bình thường

byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); }

void setDateDs1307 (byte thứ hai, // 0-59

byte phút, // 0-59 byte giờ, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28 / 29 / byte tháng, // 1-12 byte năm) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (giây)); // 0 đến bit 7 khởi động đồng hồ Wire.write (decToBcd (phút)); Wire.write (decToBcd (giờ)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (tháng)); Wire.write (decToBcd (năm)); Wire.write (00010000); // gửi 0x10 (hex) 00010000 (nhị phân) đến thanh ghi điều khiển - bật sóng vuông Wire.endTransmission (); }

// Lấy ngày và giờ từ ds1307

void getDateDs1307 (byte * giây, byte * phút, byte * giờ, byte * dayOfWeek, byte * dayOfMonth, byte * tháng, byte * năm) {// Đặt lại con trỏ thanh ghi Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Một vài trong số này cần mặt nạ vì một số bit nhất định là bit điều khiển

* giây = bcdToDec (Wire.read () & 0x7f); * phút = bcdToDec (Wire.read ()); * giờ = bcdToDec (Wire.read () & 0x3f); // Cần thay đổi điều này nếu 12 giờ sáng / chiều * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * tháng = bcdToDec (Wire.read ()); * năm = bcdToDec (Wire.read ()); }

void drawText (Chuỗi oldString)

{dmd.clearScreen (true); 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); bắt đầu dài = millis (); hẹn giờ dài = bắt đầu; long timer2 = start; boolean ret = false; while (! ret) {if ((timer + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); bộ đếm thời gian = mili (); }}}

void createTextTime (int hh, int mm)

// điều này trộn tất cả dữ liệu thời gian thành văn bản dưới dạng một câu {finalString = ""; // xóa sạch câu đối với các trường hợp đặc biệt (bên dưới) finalString = finalString + "Đó là";

// bây giờ thêm giờ

if (hh == 1 || hh == 13) {finalString = finalString + "một"; } if (hh == 2 || hh == 14) {finalString = finalString + "hai"; } if (hh == 3 || hh == 15) {finalString = finalString + "ba"; } if (hh == 4 || hh == 16) {finalString = finalString + "bốn"; } if (hh == 5 || hh == 17) {finalString = finalString + "năm"; } if (hh == 6 || hh == 18) {finalString = finalString + "sáu"; } if (hh == 7 || hh == 19) {finalString = finalString + "bảy"; } if (hh == 8 || hh == 20) {finalString = finalString + "tám"; } if (hh == 9 || hh == 21) {finalString = finalString + "nine"; } if (hh == 10 || hh == 22) {finalString = finalString + "ten"; } if (hh == 11 || hh == 23) {finalString = finalString + "eleven"; }

// bây giờ thêm phút

switch (mm) {case 1: finalString = finalString + "oh một"; nghỉ; trường hợp 2: finalString = finalString + "ồ hai"; nghỉ; trường hợp 3: finalString = finalString + "oh ba"; nghỉ; trường hợp 4: finalString = finalString + "oh bốn"; nghỉ; trường hợp 5: finalString = finalString + "oh năm"; nghỉ; trường hợp 6: finalString = finalString + "oh sáu"; nghỉ; trường hợp 7: finalString = finalString + "oh bảy"; nghỉ; trường hợp 8: finalString = finalString + "oh tám"; nghỉ; trường hợp 9: finalString = finalString + "oh chín"; nghỉ; case 10: finalString = finalString + "ten"; nghỉ; trường hợp 11: finalString = finalString + "eleven"; nghỉ; trường hợp 12: finalString = finalString + "mười hai"; nghỉ; case 13: finalString = finalString + "ba mươi"; nghỉ; case 14: finalString = finalString + "fourteen"; nghỉ; trường hợp 15: finalString = finalString + "mười lăm"; nghỉ; trường hợp 16: finalString = finalString + "sixteen"; nghỉ; case 17: finalString = finalString + "mười bảy"; nghỉ; trường hợp 18: finalString = finalString + "mười tám"; nghỉ; case 19: finalString = finalString + "nineteen"; nghỉ; case 20: finalString = finalString + "hai mươi"; nghỉ; case 21: finalString = finalString + "hai mươi mốt"; nghỉ; case 22: finalString = finalString + "hai mươi hai"; nghỉ; trường hợp 23: finalString = finalString + "hai mươi ba"; nghỉ; trường hợp 24: finalString = finalString + "hai mươi bốn"; nghỉ; trường hợp 25: finalString = finalString + "hai mươi lăm"; nghỉ; trường hợp 26: finalString = finalString + "hai mươi sáu"; nghỉ; case 27: finalString = finalString + "hai mươi bảy"; nghỉ; trường hợp 28: finalString = finalString + "hai mươi tám"; nghỉ; trường hợp 29: finalString = finalString + "hai mươi chín"; nghỉ; trường hợp 30: finalString = finalString + "ba mươi"; nghỉ; case 31: finalString = finalString + "ba mươi mốt"; nghỉ; case 32: finalString = finalString + "ba mươi hai"; nghỉ; trường hợp 33: finalString = finalString + "ba mươi ba"; nghỉ; case 34: finalString = finalString + "ba mươi tư"; nghỉ; trường hợp 35: finalString = finalString + "ba mươi lăm"; nghỉ; case 36: finalString = finalString + "ba mươi sáu"; nghỉ; case 37: finalString = finalString + "ba mươi bảy"; nghỉ; trường hợp 38: finalString = finalString + "ba mươi tám"; nghỉ; case 39: finalString = finalString + "ba mươi chín"; nghỉ; trường hợp 40: finalString = finalString + "bốn mươi"; nghỉ; case 41: finalString = finalString + "bốn mươi mốt"; nghỉ; case 42: finalString = finalString + "bốn mươi hai"; nghỉ; case 43: finalString = finalString + "bốn mươi ba"; nghỉ; case 44: finalString = finalString + "bốn mươi bốn"; nghỉ; case 45: finalString = finalString + "bốn mươi lăm"; nghỉ; case 46: finalString = finalString + "bốn mươi sáu"; nghỉ; case 47: finalString = finalString + "bốn mươi bảy"; nghỉ; case 48: finalString = finalString + "bốn mươi tám"; nghỉ; trường hợp 49: finalString = finalString + "bốn mươi chín"; nghỉ; trường hợp 50: finalString = finalString + "năm mươi"; nghỉ; case 51: finalString = finalString + "năm mươi mốt"; nghỉ; case 52: finalString = finalString + "năm mươi hai"; nghỉ; case 53: finalString = finalString + "năm mươi ba"; nghỉ; case 54: finalString = finalString + "năm mươi tư"; nghỉ; case 55: finalString = finalString + "năm mươi lăm"; nghỉ; case 56: finalString = finalString + "năm mươi sáu"; nghỉ; case 57: finalString = finalString + "năm mươi bảy"; nghỉ; case 58: finalString = finalString + "năm mươi tám"; nghỉ; case 59: finalString = finalString + "năm mươi chín"; nghỉ; }

// giữa trưa?

if (hh == 12 && mm == 0) {finalString = finalString + "midday"; } // nửa đêm? if (hh == 00 && mm == 0) {finalString = finalString + "nửa đêm"; }

}

void loop ()

{// lấy thời gian từ byte RTC giây, phút, giờ, dayOfWeek, dayOfMonth, tháng, năm; getDateDs1307 (& giây, & phút, & giờ, & dayOfWeek, & dayOfMonth, & tháng, & năm);

// chuyển đổi thời gian thành một chuỗi câu

createTextTime (giờ, phút);

// bây giờ gửi văn bản đến DMD

drawText (finalString); }

Bản phác thảo có các chức năng thông thường để đặt và truy xuất thời gian từ các IC đồng hồ thời gian thực DS1307 / 3232 và như thường lệ với tất cả các đồng hồ của chúng tôi, bạn có thể nhập thông tin thời gian vào các biến trong void setup (), sau đó bỏ ghi chú setDateDs1307 (), tải lên bản phác thảo, nhận xét lại setDateDs1307, sau đó tải bản phác thảo lên một lần nữa. Lặp lại quy trình đó để đặt lại thời gian nếu bạn không thêm bất kỳ giao diện người dùng dựa trên phần cứng nào.

Bước 3:

Khi thời gian được truy xuất trong void loop (), nó được chuyển đến hàm createTextTime (). Hàm này tạo chuỗi văn bản để hiển thị bằng cách bắt đầu bằng “It’s”, sau đó xác định những từ cần tuân theo tùy thuộc vào thời điểm hiện tại. Cuối cùng, hàm drawText () chuyển đổi chuỗi giữ văn bản để hiển thị thành một biến ký tự có thể được chuyển tới DMD.

Đề xuất: