Mục lục:
Video: Đồng hồ văn bản cuộn Arduino: 3 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:33
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
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:
Động cơ bước Điều khiển động cơ bước Động cơ bước - Động cơ bước như một bộ mã hóa quay: 11 bước (có hình ảnh)
Động cơ bước Điều khiển động cơ bước Động cơ bước | Động cơ bước như một bộ mã hóa quay: Có một vài động cơ bước nằm xung quanh và muốn làm điều gì đó? Trong Có thể hướng dẫn này, hãy sử dụng động cơ bước làm bộ mã hóa quay để điều khiển vị trí của động cơ bước khác bằng vi điều khiển Arduino. Vì vậy, không cần phải quảng cáo thêm, chúng ta hãy
Tự làm mạch sưởi cảm ứng với cuộn xoắn ốc phẳng (cuộn bánh kếp): 3 bước
Mạch làm nóng cảm ứng tự làm với cuộn xoắn ốc phẳng (pancake Coil): Gia nhiệt cảm ứng là quá trình đốt nóng một vật dẫn điện (thường là kim loại) bằng cảm ứng điện từ, thông qua nhiệt sinh ra trong vật bằng dòng điện xoáy. Trong video này, tôi sẽ chỉ cho bạn cách tạo ra sức mạnh trong
Chuyển đổi phim cuộn 120 sang phim cuộn 620: 6 bước
Chuyển đổi phim 120 cuộn thành phim 620 cuộn: Vì vậy, bạn đã tìm thấy một máy ảnh định dạng trung bình cũ và trong khi nó có vẻ hoạt động, phim cuộn 120 cuộn định dạng trung bình hiện có sẵn sẽ không vừa vì ống đệm hơi quá béo và răng ổ đĩa quá nhỏ để phù hợp với ống chỉ 120, Nó có thể cần 620 f
Làm thế nào để chuyển đổi một cuốn sách vật lý thành một cuốn sách điện tử ?: 7 bước (có hình ảnh)
Làm thế nào để chuyển đổi sách vật lý thành sách điện tử ?: Là sinh viên chuyên ngành Kỹ thuật hóa học, tôi thường có sách khổ lớn, sách kỹ thuật và ghi chú để quét (đôi khi in) Tôi đã tìm kiếm một máy quét sách hiệu quả trong một thời gian, nhưng hầu hết chúng đều đắt, cực kỳ lớn. Trước kia,
Cách biến điện thoại di động LG EnV 2 của bạn thành một Modem quay số di động cho máy tính xách tay (hoặc máy tính để bàn) của bạn: 7 bước
Cách biến điện thoại di động LG EnV 2 của bạn thành một Modem quay số di động cho máy tính xách tay (hoặc máy tính để bàn) của bạn: Tất cả chúng ta đều có nhu cầu sử dụng Internet ở những nơi không thể, chẳng hạn như trong ô tô hoặc trong kỳ nghỉ, nơi họ tính một khoản tiền đắt đỏ mỗi giờ để sử dụng wifi của họ. cuối cùng, tôi đã nghĩ ra một cách đơn giản để