Trong thế giới nhà thông minh ngày càng phát triển, việc sở hữu các thiết bị tiên tiến có thể tích hợp mượt mà với Home Assistant và các công cụ khác là điều cần thiết. Mặc dù các cảm biến chuyên dụng mang lại sự đơn giản và dễ sử dụng, chi phí có thể tăng lên nhanh chóng. Việc tự xây dựng các thiết bị của riêng bạn, một khi đã nắm vững, có thể tiết kiệm chi phí đáng kể. Điều này không chỉ đúng với các loại cảm biến đơn giản mà còn mang lại lợi ích vượt trội cho những phần cứng phức tạp hơn… và đó chính là nơi mà màn hình LED matrix đẹp mắt này phát huy giá trị.
Hiện có rất nhiều màn hình hiển thị dựa trên LED tương tự trên thị trường, nhưng vấn đề là nhiều trong số chúng là độc quyền, có thể không hỗ trợ các giải pháp tự lưu trữ của bạn, hoặc thậm chí chỉ đi kèm với một điều khiển từ xa cho phép cài đặt hình ảnh hoặc văn bản đã được xác định trước. Bạn hoàn toàn có thể tự xây dựng một giải pháp rẻ hơn và tùy biến tốt hơn nhiều với ESP32 hoặc Raspberry Pi, và đó chính xác là điều chúng tôi đã thực hiện. Dự án này vừa đẹp mắt, dễ thực hiện lại vô cùng linh hoạt, mang lại giá trị cao cho người dùng Việt yêu công nghệ.
Nếu bạn muốn bắt đầu, chúng tôi sẽ cung cấp liên kết tới kho mã nguồn GitHub của mình ở cuối bài viết này, bao gồm mã cho cả ESP32 và những gì chúng tôi đã sử dụng trên Raspberry Pi 1 Model B+.
1. Lựa chọn Linh Kiện và Xây Dựng Màn Hình LED Matrix của Riêng Bạn
1.1. Bạn có thể sử dụng Raspberry Pi hoặc ESP32
Raspberry Pi điều khiển màn hình LED matrix RGB WaveShare
Trước hết, việc lựa chọn bộ vi điều khiển là vô cùng quan trọng. Chúng tôi đã chủ yếu sử dụng ESP32, và mặc dù có các thư viện ESPHome có sẵn, bạn nên sử dụng Arduino IDE hoặc PlatformIO trong VS Code. Điều này mang lại một số lợi thế, chủ yếu về việc sử dụng bộ nhớ. Do ESP32 có chế độ “truy cập bộ nhớ trực tiếp” (DMA), dữ liệu pixel được gửi đi mà không cần sự can thiệp từ CPU. Vì vậy, mặc dù ESP32 có vẻ yếu hơn trên bề mặt, nó sẽ hoạt động tốt hơn Raspberry Pi đời cũ trong nhiều trường hợp. Tuy nhiên, điều này phải trả giá bằng RAM, và chúng ta cần từng bit RAM có thể có được, do đó việc tránh ESPHome trong trường hợp này là điều nên làm nếu có thể.
Tuy nhiên, có một ưu điểm đối với Raspberry Pi, đó là sự hỗ trợ từ cộng đồng. Trong quá trình nghiên cứu và xây dựng phần mềm riêng cho bảng điều khiển này, chúng tôi đã tìm thấy rất nhiều ví dụ mã nguồn điều khiển HUB75 từ Raspberry Pi, bao gồm cả mã mẫu và một API hoàn chỉnh mà bạn có thể tích hợp trong Python. Raspberry Pi của chúng tôi là mẫu Model B+ đầu tiên, với CPU 700 MHz và chỉ 512 MB RAM. Thật không may, chi phí phần mềm liên quan đến Python có nghĩa là chúng tôi không thể sử dụng nó một cách hiệu quả, mặc dù các mẫu Pi mới hơn chắc chắn có thể. Để bạn hình dung mức độ hạn chế của thiết lập này, khi chạy mã chúng tôi tự viết và mã mẫu được cung cấp bằng C++ (ít tốn bộ nhớ hơn nhiều), nó vẫn gặp khó khăn. Chúng tôi không thể mở phiên SSH mới, và SFTP sẽ hết thời gian chờ… và đó là sau khi chúng tôi đã ép xung CPU lên 800 MHz. Như chúng tôi sẽ chứng minh sau, chúng tôi đã sử dụng MQTT và Home Assistant để truyền dữ liệu qua mạng, vì bất cứ thứ gì nhiều hơn thế đều có thể làm quá tải chức năng của CPU Pi.
Do đó, nếu bạn có một Raspberry Pi hiện đại, API rpi-rgb-led-matrix là lựa chọn hoàn hảo cho loại dự án này. Nếu bạn có một thiết bị thiếu năng lượng như của chúng tôi, bạn có thể gặp phải các rào cản do CPU yếu hơn, và bạn sẽ không thể sử dụng API Python để điều khiển nó. Ngoài ra, hãy lưu ý rằng Raspberry Pi 5 hiện chưa được hỗ trợ. Tuy nhiên, nếu bạn có một ESP32, bạn cũng sẽ có thể điều khiển bảng điều khiển này sau một vài thao tác.
1.2. Chọn Màn hình LED Matrix và Các Vấn đề Cần Lưu ý
Màn hình LED Matrix RGB HUB75
Khi chọn màn hình LED matrix, có vô số lựa chọn. Chúng khác nhau về kích thước, số lượng pixel, pitch (khoảng cách giữa các pixel) và nhà sản xuất thiết bị. Để đơn giản, chúng tôi đã chọn màn hình LED matrix Waveshare RGB P2.5 64×32, có thể đắt hơn một chút so với các lựa chọn thay thế, nhưng những lựa chọn thay thế đó cũng đến từ các công ty ít tên tuổi hơn, có thể thay đổi các đường địa chỉ và có thể sử dụng chipset bảng điều khiển khác. Waveshare là một sản phẩm đã được kiểm chứng, và gần như tất cả các ví dụ ESP32 và Raspberry Pi mà chúng tôi đã thử nghiệm đều có thể nhận diện nó ngay lập tức.
Bảng điều khiển cụ thể này, giống như nhiều bảng khác, sử dụng giao diện HUB75, và may mắn thay, đã có rất nhiều tài liệu về cách kết nối ESP32 hoặc Raspberry Pi để điều khiển nó. Hãy nhớ rằng các bảng điều khiển này được ghép kênh (multiplexed), nghĩa là chỉ một số lượng pixel nhất định có thể được bật cùng một lúc, và yêu cầu sử dụng phần cứng đủ nhanh để lặp qua từng hàng. Giải pháp thay thế sẽ là có các chân riêng cho mỗi hàng, điều này sẽ yêu cầu đi dây phức tạp hơn đáng kể. Trong trường hợp này, bộ điều khiển về cơ bản nhận dữ liệu, cung cấp dữ liệu ánh sáng cho các pixel, và sau đó chuyển sang hàng tiếp theo, có thể hàng trăm lần mỗi giây. Ngoài ra, màu sắc cho mỗi đèn LED được điều khiển bởi một bit của thanh ghi dịch (shift register), và các thanh ghi dịch đó được nối chuỗi với nhau trong một hàng. Đặc tính này rất tốt cho việc nối chuỗi các màn hình với nhau, và cổng HUB75 đầu ra trên hầu hết các bảng điều khiển này tồn tại vì lý do đó.
Nói về màu sắc, có một vấn đề kỳ lạ ảnh hưởng đến bảng điều khiển của chúng tôi và cũng đã được ghi nhận là ảnh hưởng đến các bảng khác. Trong một số trường hợp, các ánh xạ R1/R2, G1/G2, B1/B2 khác nhau có thể được thực hiện không chính xác. Đây là trường hợp với bảng điều khiển của chúng tôi, và chúng tôi đã phát hiện ra điều đó khi cố gắng hiển thị màu vàng nhưng lại thấy màu đỏ tươi trên màn hình. Lý do điều này xảy ra khá đơn giản, đó là lý do tại sao chúng tôi có thể khắc phục nó ngay lập tức.
Khi xử lý màu 8-bit, các giá trị cho R, G và B nằm trong khoảng từ 0 đến 255. Đây về cơ bản là lượng mỗi màu được “trộn” với nhau, và việc đặt cả ba giá trị thành “255” sẽ tạo ra màu trắng. Để tạo màu vàng, giá trị 255 được gán cho cả R và G, và giá trị 0 được gán cho B. Tuy nhiên, để tạo màu đỏ tươi, bạn gán giá trị 255 cho cả R và B, và giá trị 0 được gán cho G. Vì các ánh xạ bị hoán đổi bên trong HUB75, việc gán giá trị 255 cho G thực sự gán nó cho B.
Có một giải pháp đơn giản cho điều này. Tất cả những gì bạn cần làm là hoán đổi các chân bạn kết nối cho các màu bị ảnh hưởng hoặc hoán đổi các chân trong phần mềm. Chúng tôi đã chọn làm điều đó trong phần mềm, nhưng điều đó thực sự không quan trọng. Ít nhất, các vấn đề ánh xạ chân dường như nhất quán ở chỗ nếu các kênh màu xanh lam của bạn bị hoán đổi với màu xanh lá cây, thì không chỉ B1 và G1 bị hoán đổi, mà B2 và G2 cũng bị ảnh hưởng theo cùng một cách. Điều thú vị là, chúng tôi đã tìm thấy những người khác trực tuyến gặp các vấn đề tương tự, ngoại trừ việc họ có các kênh khác nhau bị hoán đổi. Nói cách khác, nếu bạn muốn mua một trong những thiết bị này, hãy chuẩn bị tinh thần để thực hiện một số hoán đổi chân hoặc điều chỉnh phần mềm để có được màu sắc chính xác.
Yếu tố khác cần chú ý là tốc độ quét (scan rate), mà Waveshare P2.5 cung cấp ở mức 1/16, hay 16 nhóm pixel tại một thời điểm. Với tốc độ quét 1/16, chúng ta có thể cập nhật một phần nhỏ của 2048 pixel (6432) cùng lúc, và trong trường hợp này, giá trị đó là 128. Điều này có nghĩa là chúng ta có thể cập nhật hai hàng dữ liệu cùng lúc, và với tốc độ làm tươi đủ nhanh, nó sẽ trông như thể* tất cả các hàng đều được bật đồng thời. Đây là nơi CPU có thể là một yếu tố quan trọng cần cân nhắc nếu bạn đang sử dụng Raspberry Pi, và 60Hz là mức tối thiểu tốt để tránh bất kỳ hiện tượng nhấp nháy đáng chú ý nào.
Tần số quét màn hình LED matrix HUB75
1.3. Nguồn điện và Kết nối
Cuối cùng, hãy nhớ rằng bạn sẽ cần một nguồn điện riêng cho màn hình và bộ điều khiển. Mặc dù chúng tôi đã thấy một số người nói rằng ESP32 có thể được cấp nguồn từ cùng một nguồn điện với màn hình (chúng tôi đang sử dụng jack DC 5V 4A của Waveshare để cấp nguồn), chúng tôi vẫn chưa tìm ra cách để thực hiện điều đó một cách an toàn, mà không có khả năng làm cháy ESP32 với dòng điện quá cao.
Bảng điều khiển cụ thể này đi kèm với mọi thứ chúng tôi cần, mặc dù chúng tôi đã thay thế đầu nối HUB75 bằng dây nhảy của riêng mình, vì đầu nối đi kèm có chất lượng kết nối kém. Nó đi kèm với một bộ chuyển đổi jack DC sang khối đấu dây hai chân, và một cáp nguồn có thể kết nối hai màn hình cùng lúc, bên cạnh một đầu nối HUB75 riêng cho cổng thứ hai để có thể kết nối với một màn hình khác.
2. Thiết lập trên ESP32
2.1. Hạn chế RAM nhưng Nhiều Chức năng
ESP32 kết nối với màn hình Waveshare 64×32
ESP32 thoạt nhìn có vẻ kém mạnh mẽ, đặc biệt khi so sánh với Raspberry Pi, nhưng thực tế không phải vậy. Mặc dù có CPU chậm hơn và RAM ít hơn đáng kể, ESP32 hưởng lợi từ khả năng DMA (Direct Memory Access) được cung cấp bởi trình điều khiển SPI master, có nghĩa là bạn không cần sử dụng CPU để điều khiển trực tiếp màn hình. Các phiên bản ESP32 gốc, ESP32-S2 và ESP32-S3 đều được hỗ trợ ở đây.
Với cấu hình này, bạn chủ yếu bị giới hạn bởi việc sử dụng bộ nhớ. Theo công cụ tính toán được tìm thấy trên GitHub của thư viện ESP32-HUB75-MatrixPanel-DMA, ESP32 mà chúng tôi đang sử dụng ở đây có thể quản lý độ sâu màu 24-bit đầy đủ với mô-đun 64×32. Với màu 8-bit, nó có thể mở rộng tới một bảng điều khiển 128×64 duy nhất. Nó cũng có thể điều khiển tối đa bốn bảng 64×32 nối chuỗi, giả sử chúng cũng đang sử dụng màu 8-bit.
Đối với ESP32-S3, bạn có thể bật hỗ trợ PSRAM, nhưng nó yêu cầu xây dựng thư viện với cờ xây dựng (build flag) thích hợp và không được khuyến nghị, đặc biệt ở chế độ Q-SPI, vì nó quá chậm. Với ESP32 gốc, chúng tôi bị giới hạn ở khoảng 200KB SRAM sau khi mọi thứ được tải và chạy. Đó không phải là nhiều, và nó bị hạn chế hơn đáng kể so với Raspberry Pi, nhưng nó hoạt động được.
2.2. Các Vấn đề và Giải pháp khi Lập trình ESP32
Vấn đề đầu tiên chúng tôi gặp phải khi cấu hình điều này là độ nhạy Wi-Fi đột nhiên giảm mạnh. Mặc dù điều này được ghi chú trong kho GitHub là ảnh hưởng đến ESP32-S3, chúng tôi chưa bao giờ gặp bất kỳ vấn đề nào khi kết nối Wi-Fi trên ESP32 từ bàn làm việc của mình, vì chúng tôi ở ngay bên cạnh bộ định tuyến. Tuy nhiên, khi bảng điều khiển được kết nối, chúng tôi phải di chuyển nó gần hơn nữa với nguồn Wi-Fi để nó hoạt động. Ngắt kết nối ngay lập tức đã khôi phục kết nối, vì vậy nếu bạn đang có kế hoạch xây dựng một trong những thiết bị này với ESP32, hãy lưu ý đến khoảng cách với các điểm truy cập của bạn.
Chúng tôi đã thử nghiệm với ESPHome lần đầu tiên và phát hiện ra một thành phần bao bọc bên ngoài cho thư viện HUB75 DMA cho phép chúng tôi viết mã cơ bản trên màn hình để hiển thị thông tin, như chúng tôi thường làm trong ESPHome. Điều này đã hoạt động, và đối với những thứ cơ bản, đó là một cách dễ dàng hơn đáng kể để mọi thứ hoạt động so với những gì chúng tôi đã thực hiện sau đó. Cuối cùng, chúng tôi đã chuyển sang PlatformIO để triển khai. Mặc dù đó là một quy trình “thủ công” hơn nhiều, nhưng có rất nhiều ví dụ có sẵn để bắt đầu. Vẫn có một số ví dụ ESPHome bạn có thể tìm thấy trực tuyến, nhưng không nhiều bằng những gì bạn sẽ tìm thấy cho thư viện cốt lõi.
Giao diện điều khiển màn hình LED matrix trên ESP32
Thông qua PlatformIO, chúng tôi đã sử dụng cùng thư viện HUB75 DMA, và việc triển khai nó “tự nhiên” hơn rất nhiều. Chúng tôi đã viết tất cả mã của riêng mình, giống như với Raspberry Pi, và nó hầu hết chỉ hoạt động. Chúng tôi đã tạo một hệ thống dựa trên trang, nơi chúng tôi có thể điều khiển nó qua MQTT, và các trang sẽ được luân chuyển với các thông tin khác nhau trên đó. Chúng tôi đã thử nghiệm với một đồng hồ trên một trang và một trang nhiệt độ kéo dữ liệu từ Zigbee2MQTT của chúng tôi trong MQTT broker.
Điều này hoạt động tốt đáng ngạc nhiên, và thành thật mà nói, chúng tôi nghĩ hầu hết mọi người sẽ hài lòng với loại dự án này với một trong những màn hình này. Hàn ESP32 phía sau màn hình, đặt nó vào một hộp hoặc hộp gỗ với jack DC lộ ra (và một nguồn điện cho ESP32), và bạn có một màn hình nhỏ gọn, đẹp mắt, không chiếm nhiều không gian và có thể đặt trên bàn làm việc. Tuy nhiên, chúng tôi muốn nhiều hơn nữa, và ESP32 có thể lưu trữ các máy chủ web. Chúng tôi nghĩ rằng ai đó chắc chắn đã triển khai chức năng này trước đây, vì vậy chúng tôi đã nghiên cứu những gì có sẵn.
2.3. Thử nghiệm với Web Server và Hiển thị Ảnh/GIF
Trong quá trình tìm kiếm, chúng tôi đã tìm thấy một vài ví dụ chính xác về những gì chúng tôi đang tìm kiếm, bao gồm kho GitHub MatrixCOS. Nó sử dụng cùng thư viện HUB75 DMA để giao tiếp với màn hình và cung cấp một cổng web có thể được sử dụng để điều khiển ESP32. Đây là một hệ điều hành hướng lệnh, hoàn chỉnh với một máy chủ web có thể nhận các lệnh đó và biến chúng thành đầu ra thực trên màn hình. Nó có vẻ khá tuyệt vời, nhưng thật không may, chúng tôi không thể làm cho nó hoạt động. Mặc dù được cập nhật gần đây, chỉ một trong các tệp firmware có thể khởi động, và công cụ flash web dựa trên Espressif của riêng nó đã xác định những tệp khác có khả năng không khởi động được.
Thay vào đó, chúng tôi đã biên dịch trực tiếp từ mã nguồn, và điều đó đã hoạt động, nhưng chúng tôi đã gặp sự cố liên quan đến DMA khi ESP32 cố gắng gọi màn hình. Điều này, cùng với các vấn đề khác liên quan đến kết nối Wi-Fi (SSID của chúng tôi có dấu cách, nghĩa là việc nhập SSID của chúng tôi qua đầu vào nối tiếp không hoạt động vì nó phân tách đầu vào người dùng bằng dấu cách), có nghĩa là nó không thể khởi động được. Ngay cả khi chúng tôi có thể giải quyết vấn đề SSID, điều mà chúng tôi đã làm thông qua điểm truy cập dự phòng của nó, thì màn hình mới là điểm mấu chốt.
Giao diện web server của Pixel Art Display trên ESP32
Sau khi bỏ cuộc ở mặt trận đó, chúng tôi đã tìm thấy kho Pixel Art Display trên GitHub. Đây là một dự án tương tự MatrixCOS, mặc dù có ít tùy chọn hơn, nhưng nó cũng có thể chạy trên ESP32. Nó cung cấp lưu trữ tệp cục bộ cho hình ảnh và GIF, và bạn có thể quản lý bộ nhớ này từ bảng điều khiển web sau khi đã kết nối. Máy chủ web là thứ chính mà chúng tôi muốn, vì nó có nghĩa là ai đó có thể xây dựng một trong những thiết bị này và quản lý màn hình của họ từ máy tính thay vì cần kết nối trực tiếp với ESP32 mỗi khi họ muốn thực hiện thay đổi.
Dự án cụ thể đó được xây dựng cho màn hình 64×64, và mặc dù bạn có thể sửa đổi các giá trị khởi tạo màn hình để phù hợp với bảng điều khiển 64×32, chúng tôi vẫn phải thực hiện công việc mở rộng trong mã nguồn để sửa đổi cách phát GIF và hiển thị văn bản, vì những thứ đó được mã hóa cứng theo tọa độ X và Y phù hợp với bảng điều khiển 64×64. Chúng tôi cũng đã hoán đổi các chân G và B để có đầu ra màu sắc chính xác, vì ban đầu chúng tôi đã quên và gặp phải các vấn đề màu sắc kỳ lạ tương tự như đã đề cập trước đó. Việc sửa đổi mã nguồn cũng được yêu cầu nếu bạn muốn nó kết nối với mạng của mình, vì bạn cần biên dịch và flash nó với SSID và mật khẩu của mình.
Màn hình LED matrix hiển thị GIF với ESP32
Tuy nhiên, một khi chúng tôi đã hoán đổi mọi thứ, nó đã hoạt động. GIF được phát, văn bản cuộn trên màn hình và đồng hồ cũng hoạt động. Chúng tôi có thể tải lên phương tiện mới từ trình duyệt web của mình, nhấp vào phát, và nó sẽ ngay lập tức hiển thị trên màn hình. Tuy nhiên, nó không thay đổi kích thước GIF cho bạn, vì vậy bạn sẽ cần thực hiện điều đó theo cách thủ công để khớp với kích thước màn hình của mình trước khi tải lên.
2.4. Lưu ý về Tần số Làm tươi và Chụp ảnh
Một điều thú vị với thiết lập này là, mặc dù không có hiện tượng nhấp nháy đáng chú ý, camera của chúng tôi thực sự gặp khó khăn để có được một bức ảnh đẹp. Bạn có nhớ chúng tôi đã nói rằng các màn hình này làm tươi đủ nhanh để mắt người không thể phân biệt được khi các pixel thực sự bị tắt không? Một chiếc camera với tốc độ màn trập đủ nhanh có thể, và mặc dù đây là một vấn đề nhỏ khi kết nối với Raspberry Pi, việc chụp ảnh khó hơn rất nhiều khi kết nối với ESP32. Điều này cho thấy tốc độ làm tươi thấp hơn nhiều so với những gì Pi tạo ra. Từ việc xem xét mã DMA của ESP32, có vẻ như tốc độ làm tươi tối thiểu được yêu cầu theo mặc định là 60Hz; không đủ để mắt người nhận thấy, nhưng đủ để khiến camera gặp khó khăn.
3. Thiết lập trên Raspberry Pi
3.1. Đơn giản Bất ngờ, Ngay cả với Mẫu Yếu hơn
Trên Raspberry Pi của chúng tôi, việc thiết lập với API rpi-rgb-led-matrix đơn giản đến bất ngờ. Tải xuống kho Git và xây dựng nó, và bạn sẽ có thể chạy hầu hết các ví dụ và tiện ích được xây dựng sẵn để làm quen với khả năng của nó. Các ví dụ này bao gồm từ trình kết xuất hình ảnh, phát lại hoạt ảnh, đồng hồ và nhiều hơn nữa. Khi bạn đã xây dựng mã nguồn, bạn có thể sử dụng các thư viện đã xây dựng trong mã của riêng mình, loại bỏ sự khó khăn trong việc giao tiếp trực tiếp qua GPIO.
Việc phát triển cho Raspberry Pi có một số vấn đề ở đây, và chúng tôi gặp phải chúng chủ yếu do không muốn biên dịch trực tiếp trên Raspberry Pi gốc của mình. Hóa ra, việc biên dịch chéo mã cho Armv6 rất khó khăn, đòi hỏi phải vượt qua rất nhiều rào cản và cuối cùng dẫn đến đau khổ. Thay vào đó, chúng tôi đã chọn viết mã trên máy tính chính của mình và sử dụng tính năng đánh dấu cú pháp cơ bản trong VS Code để đảm bảo mọi thứ khác đều đúng. Bất cứ điều gì liên quan đến thư viện đều không thể kiểm tra và sẽ báo lỗi, nhưng chúng tôi có thể đảm bảo rằng phần còn lại trông tốt.
3.2. Triển khai Hiển thị Thông tin bằng MQTT
Kế hoạch là phát triển một cách đơn giản để hiển thị thông tin trên màn hình, và như đã đề cập, chúng tôi đã sử dụng MQTT cho việc này. Chúng tôi đã sử dụng MQTT cho Home Assistant, vì vậy việc điều chỉnh thiết lập là đơn giản để điều khiển màn hình. Chúng tôi có một chủ đề MQTT tên là “matrix”, và dưới đó, chúng tôi có thể xuất bản dữ liệu Spotify với tên bài hát và nghệ sĩ cùng với điều kiện thời tiết hiện tại. Sau đó, chỉ cần sử dụng Raspberry Pi của chúng tôi để kết nối với máy chủ MQTT, kéo dữ liệu và sau đó xử lý nó để hiển thị trên màn hình.
Raspberry Pi kết nối với Waveshare P2.5
Điều đáng ngạc nhiên là điều này không quá khó khăn, và chúng tôi đã mong đợi gặp nhiều vấn đề hơn. Các thư viện API đã làm cho mọi thứ đơn giản hơn rất nhiều, mặc dù chúng tôi vẫn tiếc là không thể sử dụng Python cho việc này. Chúng tôi đã viết một ứng dụng khách MQTT cơ bản chạy trong một luồng riêng biệt, lưu trữ các phản hồi cục bộ và vẽ chúng lên màn hình. Khi văn bản dài hơn kích thước màn hình cho phép (trong trường hợp bài hát và nghệ sĩ đang phát), nó sẽ cuộn bằng chức năng offscreen của thư viện ma trận RGB.
Ngoài ra, chúng tôi cũng vẽ nghệ thuật ASCII lên màn hình cho các biểu tượng thời tiết, mặc dù những biểu tượng này cần rất nhiều công việc. Chúng tôi đang ánh xạ chúng từ các điều kiện thời tiết kiểu Home Assistant được gửi đến MQTT sang các biểu tượng có thể được vẽ trên màn hình bằng ASCII, và điều này giúp tiết kiệm tài nguyên vì chúng tôi không cần bao gồm hình ảnh để giải mã, xử lý và chuyển đổi. Do đó, mỗi hình ảnh có kích thước 16×16 pixel 24-bit, tổng cộng 768 byte bộ nhớ cho mỗi hình ảnh. Kích thước 16×16 hơi lớn và đôi khi có thể làm cho các biểu tượng chồng lên văn bản, mặc dù việc giảm kích thước này khá đơn giản.
Tuy nhiên, có rất nhiều điều bạn có thể làm với điều này, và nó không giới hạn ở việc hiển thị văn bản trên màn hình, mặc dù ví dụ trên đã cho thấy. Mặc dù nó rất tuyệt vời như một bảng điều khiển thông tin, nó có thể được sử dụng để hiển thị hình ảnh và GIF, như chúng tôi đã trình bày trong các hình ảnh ở đây. Với một chút công sức, bạn thậm chí có thể sử dụng nó như một vòng quay hình ảnh được lấy từ thư viện được lưu trữ cục bộ của bạn, chẳng hạn như Immich.
Với một Raspberry Pi mạnh hơn, chúng tôi sẽ thấy việc sáng tạo với nó dễ dàng hơn đáng kể. Tuy nhiên, mã chúng tôi đã cung cấp cho thấy cần bao nhiêu sự cẩn thận để cung cấp một môi trường an toàn bộ nhớ (phần nào, chúng tôi biết một vài vấn đề liên quan đến kích thước bộ đệm và những thứ tương tự mà chúng tôi đã phát hiện khi viết bài viết này), và vẫn còn nhiều điều nữa cần được thực hiện để làm cho nó trở thành một đoạn mã mạnh mẽ hơn nữa. Tuy nhiên, như một bằng chứng khái niệm, nó hoạt động rất tốt, và hiệu quả của C++ có nghĩa là bạn thực sự có thể làm được nhiều điều hơn với màn hình này so với những gì bạn nghĩ ban đầu với phần cứng yếu như chúng tôi đang sử dụng ở đây.
4. Đây là Một Dự án Đầy Thử Thách
4.1. Và Chắc chắn Không Dành cho Người Mới Bắt đầu
Màn hình LED matrix thành phẩm
Chúng tôi yêu thích phát triển, và việc tự xây dựng cảm biến và thiết bị nhà thông minh của riêng mình là một sở thích thú vị mà chúng tôi đã tận hưởng vô cùng. Tuy nhiên, dự án này đôi khi chắc chắn là một quá trình gian nan. Khi nói đến ESP32, thư viện DMA rất tuyệt vời, và việc cài đặt nó và chạy với mã của riêng chúng tôi đơn giản đáng ngạc nhiên nhờ mã mẫu được cung cấp trên GitHub của thư viện. Tuy nhiên, một khi bạn muốn làm nhiều hơn, như lưu trữ một máy chủ web, các hạn chế về RAM thực sự bắt đầu ảnh hưởng.
Đối với Raspberry Pi, với một mẫu hiện đại hơn, có lẽ mọi thứ sẽ đơn giản hơn đáng kể. Ngay cả như vậy, thật đáng kinh ngạc khi cả hai thiết bị này, dù yếu kém theo cách riêng của chúng, đều có thể điều khiển một màn hình như thế này một cách hoàn hảo khi được cấu hình đúng cách. Nếu bạn muốn tự mình thử, mã cho tất cả các dự án này đều có trên GitHub của chúng tôi, bao gồm cả tệp YAML mà chúng tôi đã viết để thử nghiệm điều này với ESPHome.
Waveshare 64×32 là một bảng điều khiển đẹp mắt, trông tuyệt vời ở bất cứ đâu, và chúng tôi có thể sẽ biến nó thành một dự án thủ công để đặt nó vào một vỏ bọc cố định, sẵn sàng được đặt trên bàn làm việc, giá sách hoặc thậm chí treo tường. Kết quả cuối cùng thật tuyệt vời, và chúng tôi thực sự yêu thích cách nó trông. Đó là một công việc khó khăn, nhưng thành thật mà nói, chúng tôi nghĩ đó cũng là một phần sức hấp dẫn của nó. Chúng tôi yêu thích việc học những điều mới, và những dự án như thế này là một cách tuyệt vời để làm điều đó. Chúng tôi có lẽ sẽ thử lại ESPHome, hoặc phát triển thêm triển khai C++ của riêng mình và triển khai một máy chủ web bên trong nó.
Bất kể phương pháp nào chúng tôi chọn từ đây, chúng tôi chắc chắn rằng những trải nghiệm trong tương lai với phần cứng khác sẽ dễ dàng hơn một chút nhờ dự án này, và chúng tôi thực sự hài lòng với màn hình mới bóng bẩy và đẹp mắt mà chúng tôi có thể tự hào chỉ vào và nói, “Vâng, tôi đã phát triển nó.”