Analog Clock with LED Matrix and Arduino
Giới thiệu
Ma trận LED với MAX7219 rất linh hoạt và có thể được sử dụng trong một số dự án với Arduino.
Trong trường hợp này, tôi đã sử dụng nó để mô phỏng đồng hồ kim không có kim, với kết quả rất thú vị. Giờ và phút được đặt xung quanh trung tâm của ma trận tạo ra một cái nhìn quen thuộc của đồng hồ kim. Mã tôi đã phát triển áp dụng một chút lượng giác (sin và cosine) để tính toán tọa độ của giờ và phút được hiển thị thành ma trận LED. Với điều đó, tôi đã lưu nhiều dòng mã hóa.
Việc lắp ráp rất đơn giản, sử dụng ít thành phần và bạn sẽ không gặp khó khăn gì khi làm việc trên đó.
Hãy làm nó!
Danh sách vật liệu
Vật liệu bạn cần được hiển thị trong danh sách sau:
-Arduino UNO R3
-Mô-đun của Ma trận LED với MAX7219 (Tích hợp tối đa)
- Các nút nhấn (02 x)
-Breadboard (kích thước nhỏ)
-Dây nhảy
Mẫu giấy để bao phủ Ma trận LED (xem tệp đính kèm để in)
Lưu ý: Dự án này sử dụng đồng hồ bên trong Arduino. Nó không quá chính xác như một RTC (Đồng hồ thời gian thực) bên ngoài, nhưng đối với mục đích của dự án này, nó hoạt động rất tốt.
/* Project: Analog Clock with LED Matrix Author: LAGSILVA Hardware: Arduino UNO R3 / LED Matrix with MAX72XX Date: 26.Jul.2017 Revision: 1.1 License: CC BY-NC-ND 4.0 (Attribution-NonCommercial-NoDerivatives 4.0 International) */ #include <LedControl.h> #include <Time.h> #include <TimeLib.h> /* ***** Pin numbers for LedControl ***** pin 10 is connected to the DataIn pin 08 is connected to the CLK pin 09 is connected to LOAD / CS We have only a single MAX72XX. */ LedControl lc = LedControl(10, 8, 9, 1); byte xRef = 4; // Reference Row byte yRef = 3; // Reference Collunm byte mm1, mm5, hora, minuto; byte ultMinuto = 10, ultHora = 10; byte horaPin = 7, minutoPin = 6; boolean ajustaHora = true, ajustaMinuto = true; float pi = 3.1415927, xHH, yHH, xMM1, yMM1, xMM5, yMM5; void setup() { pinMode(horaPin, INPUT_PULLUP); pinMode(minutoPin, INPUT_PULLUP); /* Wakeup call for MAX72XX */ lc.shutdown(0, false); /* Set the brightness to a medium values */ lc.setIntensity(0, 2); } void loop() { // Setup of Hours & Minutes ajustaHora = digitalRead(horaPin); ajustaMinuto = digitalRead(minutoPin); if (!ajustaHora) { adjustTime(3600); } if (!ajustaMinuto) { adjustTime(60); } hora = hour(); minuto = minute(); if (minuto != ultMinuto || hora != ultHora) { ultMinuto = minuto; ultHora = hora; lc.clearDisplay(0); // Minutes in steps of 5 (range of 0 to 55) mm5 = minuto / 5 * 5; //Minutes (1 to 4) mm1 = minuto % 5; // AM period if (hora >= 0 && hora <= 11) lc.setLed(0, xRef + 1, yRef, true); // PM period if (hora >= 12 && hora <= 23)lc.setLed(0, xRef - 1, yRef, true); // Coordinates for Hours & Minutes (steps of 5) xHH = round(-cos(hora * pi / 6) * 2) + xRef; yHH = round(sin(hora * pi / 6) * 2) + yRef; lc.setLed(0, xHH, yHH, true); xMM5 = round(-cos(mm5 * pi / 30) * 3.1) + xRef; yMM5 = round(sin(mm5 * pi / 30) * 3.1) + yRef; lc.setLed(0, xMM5, yMM5, true); //Coordinates for Minutes (1 to 4) yMM1 = yRef + 4; xMM1 = (mm1 - 1) * 2 + xRef - 3; if (mm1 > 0) lc.setLed(0, xMM1, yMM1, true); } // Center LED Blinking if (ajustaHora && ajustaMinuto) { lc.setLed(0, xRef, yRef, true); delay(200); lc.setLed(0, xRef, yRef, false); delay(800); } else delay(250); }