Trong thế giới nhà thông minh ngày càng phát triển, có vô số thiết bị tuyệt vời có thể tích hợp hoàn hảo với các nền tảng như Home Assistant và các công cụ khác của bạn. Mặc dù các cảm biến chuyên dụng rất tiện lợi với sự đơn giản và dễ sử dụng, như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 mình thường tiết kiệm hơn đáng kể, đặc biệt đối với các phần cứng phức tạp. Đó chính là lý do ra đời của dự án màn hình LED ma trận tuyệt đẹp này.
Có rất nhiều loại màn hình LED tương tự trên thị trường, nhưng vấn đề là đa số chúng thườ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 giới hạn bạn ở các hình ảnh hoặc văn bản được cài đặt sẵn. Với một chiếc ESP32 hoặc Raspberry Pi, 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 chỉnh cao hơn – đó chính xác là điều tôi đã làm. Nó không chỉ đẹp mắt, dễ thực hiện mà còn cực kỳ linh hoạt.
Nếu bạn muốn bắt đầu, tôi sẽ cung cấp liên kết đến kho lưu trữ GitHub của mình ở cuối bài viết này, bao gồm cả mã nguồn cho ESP32 và Raspberry Pi 1 Model B+ mà tôi đã sử dụng.
Lựa chọn linh kiện và Xây dựng Màn hình LED Ma Trận của riêng bạn
Raspberry Pi hay ESP32: Lựa chọn bộ vi điều khiển phù hợp
Đầu tiên và quan trọng nhất, việc lựa chọn bộ vi điều khiển là cực kỳ quan trọng. Tôi chủ yếu sử dụng ESP32, và mặc dù có các thư viện ESPHome mà bạn có thể dùng, nhưng sẽ tốt hơn nếu bạ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ớ. Vì ESP32 có chế độ “truy cập bộ nhớ trực tiếp” (DMA), dữ liệu điểm ảnh được gửi đi mà không cần sự can thiệp của CPU. Do đó, mặc dù ESP32 có vẻ yếu hơn trên bề mặt, nhưng trong nhiều trường hợp, nó sẽ hoạt động tốt hơn một chiếc Raspberry Pi đời cũ. Điều này đổi lại là tiêu hao RAM, và chúng ta cần mọi bit RAM có thể, đó là lý do tại sao trong trường hợp này, việc tránh ESPHome nếu có thể là một ý tưởng hay.
Tuy nhiên, Raspberry Pi có một ưu điểm nổi bật: sự hỗ trợ từ cộng đồng. Trong quá trình nghiên cứu và xây dựng phần mềm cho bảng điều khiển này, tôi đã tìm thấy rất nhiều ví dụ mã nguồn điều khiển HUB75 từ Raspberry Pi, kèm theo mã mẫu và thậm chí là một API đầy đủ bạn có thể tích hợp vào Python. Chiếc Raspberry Pi của tôi là Model B+ đầu tiên, với CPU 700 MHz và chỉ 512 MB RAM. Thật không may, chi phí hoạt động liên quan đến Python khiến tôi không thể sử dụng nó 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 về mức độ hạn chế của thiết lập này, khi chạy mã tôi tự viết và mã ví dụ được cung cấp trong C++ (ngôn ngữ thân thiện với bộ nhớ hơn nhiều), nó vẫn gặp khó khăn. Tôi không thể mở một phiên SSH mới, và SFTP sẽ hết thời gian chờ… và đó là sau khi tôi đã ép xung CPU lên 800 MHz. Như tôi sẽ chứng minh sau, tôi đã sử dụng MQTT và Home Assistant để truyền dữ liệu qua mạng, vì bất kỳ điều gì nhiều hơn thế cũng đủ để làm quá tải CPU của Pi.
Raspberry Pi điều khiển màn hình LED ma trận RGB WaveShare HUB75
Do đó, nếu bạn có một chiếc Raspberry Pi hiện đại, API rpi-rgb-led-matrix là lựa chọn hoàn hảo cho dự án này. Tuy nhiên, nếu bạn có một chiếc Pi yếu hơn như của tôi, bạn có thể gặp phải các trở ngại do CPU yếu và 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ợ. Nếu bạn có một chiếc ESP32, bạn cũng có thể điều khiển bảng điều khiển này với một chút công sức.
Chọn Màn hình LED Ma Trận và Hiểu về Giao tiếp HUB75
Khi lựa chọn màn hình LED ma trận, có vô số tùy chọn. Chúng khác nhau về kích thước, số lượng điểm ảnh, khoảng cách giữa các điểm ảnh (pitch) và nhà sản xuất thiết bị. Để đơn giản, tôi chọn màn hình LED ma trận Waveshare RGB P2.5 64×32. Mặc dù giá có thể cao hơn một chút so với các lựa chọn khác, nhưng những lựa chọn thay thế đó thườ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à sử dụng một chipset panel 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à tôi đã thử nghiệm đều có thể nhận diện nó ngay lập tức.
Bảng điều khiển này, giống như nhiều loại khác, sử dụng giao diện HUB75. May mắn thay, đã có rất nhiều tài liệu về cách đấu 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 là dạng ghép kênh (multiplexed), nghĩa là chỉ một số lượng pixel nhất định có thể bật cùng lúc, và yêu cầu phần cứng đủ nhanh để lặp qua từng hàng. Giải pháp thay thế là có các chân cho mỗi hàng, điều này sẽ đòi hỏi nhiều dây 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 điểm ảnh, và sau đó chuyển sang hàng tiếp theo, có thể hàng trăm lần mỗi giây. Hơn nữa, 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, và các thanh ghi dịch này được nối chuỗi trong một hàng. Tính chất này rất tốt để nối chuỗi các màn hình lại với nhau, và đầu cắm 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ày.
Cận cảnh mặt sau màn hình LED ma trận Waveshare P2.5 64×32 với cổng HUB75
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 tôi và đã được ghi nhận là ảnh hưởng đến những bảng khác. Trong một số trường hợp, các ánh xạ R1/R2, G1/G2, B1/B2 có thể bị thực hiện sai. Đây là trường hợp với bảng điều khiển của tôi, và 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 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. Điều này về cơ bản là lượng của mỗi màu được “trộn” với nhau, và đặt cả ba giá trị thành “255” sẽ cho 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ự lại gán nó cho B.
Tuy nhiên, có một giải pháp đơn giản cho vấn đề 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. Tôi chọn làm điều đó trong phần mềm, nhưng điều đó không thực sự 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 xanh lam của bạn bị hoán đổi với xanh lục, 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à 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 bị hoán đổi. Nói cách khác, nếu bạn đang tìm mua một trong những loại này, hãy chuẩn bị tinh thần để thực hiện một số việc hoán đổi chân hoặc điều chỉnh phần mềm để có màu sắc chính xác.
Một khía cạnh khác cần chú ý là tốc độ quét (scan rate), mà Waveshare P2.5 cung cấp với tốc độ 1/16, hay 16 nhóm pixel cùng lúc. 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 (64*32) cùng một 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 một 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 chiếu sáng đồng thời. Đây là nơi CPU có thể là một yếu tố quan trọng cần xem xét nếu bạn đang sử dụng Raspberry Pi, và 60Hz là một mức cơ bản tốt để tránh bất kỳ hiện tượng nhấp nháy đáng chú ý nào.
Nguồn điện và Phụ kiện cần thiết
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ù 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 (tôi đang sử dụng giắc DC 5V 4A của Waveshare để cấp nguồn), 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 hỏng ESP32 với dòng điện quá cao.
Hệ thống dây kết nối màn hình LED ma trận HUB75 với bộ nguồn DC riêng
Bảng điều khiển đặc biệt này đi kèm với mọi thứ tôi cần, mặc dù tôi đã thay thế đầu nối HUB75 bằng dây jumper 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 bộ chuyển đổi giắc cắm 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, cùng với 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.
Thiết lập trên ESP32: Tối ưu bộ nhớ và Chức năng đa dạng
Hạn chế về RAM nhưng khả năng hoạt động cao
ESP32 có vẻ yếu trên bề mặt, đặ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 vẫn được hưởng lợi từ khả năng DMA (truy cập bộ nhớ trực tiếp) do trình điều khiển SPI master cung cấp, 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ị hạn chế bởi việc sử dụng bộ nhớ. Theo công cụ tính toán trên GitHub của thư viện ESP32-HUB75-MatrixPanel-DMA, ESP32 tôi đang sử dụng ở đây hầu như có thể quản lý độ sâu màu 24-bit đầy đủ với mô-đun 64×32. Nếu sử dụng màu 8-bit, nó sẽ mở rộng ra một panel 128×64 duy nhất. Nó cũng có thể điều khiển tối đa bốn panel 64×32 được nối chuỗi, giả sử chúng cũng sử dụng màu 8-bit.
ESP32 được đấu nối với màn hình LED ma trận Waveshare 64×32 qua giao tiếp HUB75
Đố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 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, 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.
Vấn đề đầu tiên tôi gặp phải khi cấu hình là độ nhạy Wi-Fi đột ngột giảm mạnh. Mặc dù điều này được ghi chú trong kho lưu trữ GitHub là ảnh hưởng đến ESP32-S3, 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 của mình từ bàn làm việc, vì tôi ở ngay cạnh bộ định tuyến. Tuy nhiên, với bảng điều khiển được kết nối, tôi phải di chuyển nó gần hơn nữa đến nguồn Wi-Fi để nó hoạt động. Rút phích cắm ngay lập tức đã khôi phục kết nối của tô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.
Trải nghiệm với các thư viện và dự án mã nguồn mở
Ban đầu, tôi thử nghiệm với ESPHome và khám phá một trình bao bọc thành phần bên ngoài cho thư viện HUB75 DMA cho phép tôi viết mã cơ bản trên màn hình để hiển thị thông tin, như tôi thường làm trong ESPHome. Điều này hoạt động, và đối với những việc cơ bản, đó là một cách dễ dàng hơn đáng kể để mọi thứ chạy so với những gì tôi đã làm cuối cùng. Cuối cùng, tôi chuyển sang PlatformIO để triển khai. Mặc dù đó là một quá trình “thủ công” hơn nhiều, nhưng có rất nhiều ví dụ ngoài kia để mọi thứ hoạt động. Vẫn còn 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.
Màn hình LED ma trận hiển thị thông tin thời gian và nhiệt độ qua MQTT từ ESP32
Thông qua PlatformIO, 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. Tôi đã viết tất cả mã của riêng mình, giống như tôi đã làm với Raspberry Pi, và nó hầu như chỉ hoạt động. Tôi đã tạo một hệ thống dựa trên trang, nơi tôi có thể điều khiển nó qua MQTT, và các trang sẽ được chuyển qua với các thông tin khác nhau trên đó. Tôi đã thử nghiệm với một đồng hồ trên một trang và một trang nhiệt độ lấy dữ liệu từ Zigbee2MQTT trong broker MQTT của tôi.
Điều này hoạt động đáng ngạc nhiên, và thành thật mà nói, 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 vỏ hoặc một hộp gỗ với giắc 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, không tốn nhiều không gian và có thể đặt trên bàn làm việc của bạn. Tuy nhiên, tôi muốn nhiều hơn, và ESP32 có thể lưu trữ các máy chủ web. Tôi nghĩ rằng chắc chắn ai đó đã triển khai chức năng này trước đây, vì vậy tôi đã nghiên cứu những gì có sẵn.
Trong quá trình tìm kiếm, tôi đã tìm thấy một vài ví dụ về chính xác những gì tôi đang tìm kiếm, bao gồm kho lưu trữ 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, nhưng thật không may, 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 dựa trên web của Espressif đã xác định các tệp khác có khả năng không khởi động được.
Thay vào đó, tôi đã biên dịch trực tiếp từ mã nguồn, và điều đó đã hoạt động, nhưng tôi đã gặp một lỗi liên quan đến DMA ngay 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 tôi có dấu cách, nghĩa là việc nhập SSID của 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 tôi có thể vượt qua vấn đề SSID, điều mà tôi đã làm thông qua điểm phát sóng dự phòng của nó, màn hình là điểm mấu chốt của toàn bộ dự án này.
Giao diện web server của dự án Pixel Art Display trên ESP32 để quản lý màn hình HUB75
Sau khi bỏ cuộc ở điểm đó, tôi tình cờ tìm thấy kho lưu trữ Pixel Art Display trên GitHub. Đây là một dự án tương tự như 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 bộ nhớ 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à 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ì phải 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, 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 vào tọa độ X và Y phù hợp với bảng điều khiển 64×64. 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 tôi đã quên và gặp phải các vấn đề màu sắc kỳ lạ tương tự như tôi đã đề cập trước đây. 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 ma trận HUB75 hiển thị GIF và văn bản cuộn sau khi tùy chỉnh với ESP32
Tuy nhiên, sau khi 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. Tôi có thể tải lên các 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 đó thủ công để phù hợp với kích thước màn hình của mình trước khi tải lên.
Đ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ú ý, máy ảnh của tôi thực sự gặp khó khăn trong việc chụp một bức ảnh đẹp. Bạn có nhớ 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ể nhận ra khi các pixel thực sự tắt không? Một máy ảnh 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 lại 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 Raspberry Pi. Nhìn vào mã DMA của ESP32, có vẻ như tốc độ làm tươi tối thiểu được yêu cầu mặc định là 60Hz; không đủ để con người nhận thấy, nhưng đủ để máy ảnh gặp khó khăn.
Thiết lập trên Raspberry Pi: Dễ dàng đáng ngạc nhiên, ngay cả với mẫu cũ
Cài đặt đơn giản với rpi-rgb-led-matrix API
Trên chiếc Raspberry Pi của tôi, việc thiết lập với API rpi-rgb-led-matrix đơn giản đến bất ngờ. Chỉ cần tải kho lưu trữ Git và xây dựng nó, 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 các 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. Sau khi bạn đã xây dựng cơ sở mã, 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ỏ khó khăn trong việc giao tiếp trực tiếp với nó qua GPIO.
Việc phát triển cho Raspberry Pi có một số vấn đề ở đây, và tôi đã gặp chúng chủ yếu do không muốn biên dịch trực tiếp trên chiếc 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 trải qua rất nhiều rắc rối, và cuối cùng chỉ mang lại đau khổ. Thay vào đó, 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 tôi có thể đảm bảo rằng phần còn lại trông ổn.
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, tôi đã sử dụng MQTT cho việc này. Tôi đã sử dụng MQTT cho Home Assistant, vì vậy việc điều chỉnh thiết lập để điều khiển màn hình là điều dễ dàng. Tôi có một chủ đề MQTT tên là “matrix”, và dưới đó, 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 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 màn hình LED ma trận Waveshare P2.5 64×32 hiển thị thông tin Spotify
Đáng ngạc nhiên, điều này không quá khó khăn, và tôi đã nghĩ rằng mình sẽ gặp nhiều vấn đề hơn. Các thư viện API đã làm mọi thứ đơn giản hơn rất nhiều, mặc dù tôi vẫn buồn vì không thể sử dụng Python cho việc này. Tôi đã viết một máy 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 ra màn hình. Khi văn bản dài hơn 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, 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 thứ này cần rất nhiều công sức. 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ể 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ì tôi không cần bao gồm hình ảnh để giải mã, xử lý và chuyển đổi. Kết quả là, mỗi hình ảnh có kích thước 16×16, 24-bit pixel, tổng cộng 768 byte bộ nhớ mỗi hình ảnh. 16×16 hơi quá lớn và đôi khi có thể khiến 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 sẽ rất dễ dàng.
Có rất nhiều điều bạn có thể làm với điều này, và nó không chỉ 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 là như vậ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ư 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 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 chiếc Raspberry Pi mạnh hơn, 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ã tôi đã cung cấp cho thấy cần phải cẩn thận hơn bao nhiêu để cung cấp một môi trường an toàn bộ nhớ (một phần nào đó, 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à tôi đã phát hiện khi viết bài này), và vẫn còn nhiều điều nữa cần được thực hiện lý tưởng để biến nó thành một phầ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ư tôi đang sử dụng ở đây.
Kết luận: Một dự án chuyên sâu nhưng vô cùng giá trị
Tôi yêu phát triển, và việc tự xây dựng các cảm biến cũng như thiết bị nhà thông minh của riêng mình là một sở thích thú vị mà tôi vô cùng yêu thích. Tuy nhiên, dự án này chắc chắn là một quá trình gian nan vào nhiều thời điểm. Đối với ESP32, thư viện DMA rất tuyệt vời, và việc đưa nó vào hoạt động với mã của riêng tôi đơn giản đến bất ngờ nhờ mã mẫu được cung cấp trên GitHub của thư viện. Tuy nhiên, khi cần làm nhiều hơn, như lưu trữ một máy chủ web, những hạn chế về RAM thực sự phát huy tác dụng.
Màn hình LED ma trận HUB75 tự làm hiển thị màu sắc rực rỡ trong dự án DIY nhà thông minh
Đối với Raspberry Pi, với một mẫu hiện đại hơn, mọi thứ có lẽ sẽ đơn giản hơn đáng kể. Ngay cả như vậy, điều đáng kinh ngạc là 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ã nguồn cho tất cả các dự án này có trên GitHub của tôi, bao gồm cả YAML mà tôi đã viết để thử nghiệm với ESPHome.
Màn hình Waveshare 64×32 là một panel đẹp mắt, trông tuyệt vời ở mọi nơi, và tôi có thể sẽ biến nó thành một dự án nghệ thuật để tạo ra một loại vỏ cố định nào đó, sẵn sàng đặ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à tôi thực sự yêu cách nó trông. Đó là một công việc vất vả, nhưng thành thật mà nói, tôi nghĩ đó cũng là một phần sức hấp dẫn của nó. Tôi thích học hỏi 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 đó. Tôi có thể sẽ thử ESPHome một lần nữa, hoặc tiếp tục phát triển 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 tôi thực hiện từ đây, 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à tôi thực sự hạnh phúc với màn hình mới, sáng bóng và đẹp mắt của mình mà tôi có thể tự hào chỉ vào và nói: “Vâng, tôi đã phát triển nó.”