- Vì vậy, mã QR này là gì?
- Tạo mã QR của riêng bạn
- Chuyển đổi định dạng PNG sang BMP
- Chuyển đổi hình ảnh BMP thành một mảng mã HEX
- Sơ đồ mạch
- Giải thích mã
Mã "Phản hồi nhanh" hay được viết tắt là mã QR đã trở thành một phần thiết yếu trong cuộc sống kỹ thuật số của chúng ta, rất có thể bạn đã quen thuộc với chúng trong tiềm thức vì bây giờ bạn có thể đã đi lang thang quanh cửa hàng tạp hóa địa phương của mình hoặc có thể bạn đọc qua cuốn sách yêu thích của bạn, hoặc thậm chí có thể bạn đang thanh toán trực tuyến bằng Google Pay, PhonePe hoặc Paytm, hoặc lướt web, v.v. (Tôi cho rằng tôi có thể tiếp tục với các ví dụ nhỉ?) và bạn tình cờ đến ngang qua thứ hình vuông trông kỳ lạ này và nghĩ, dù sao thì thứ hình vuông này là gì và nếu bạn chưa… thì, đừng lo lắng nó sớm muộn gì cũng xảy ra, vì vậy để hiểu rõ hơn về chủ đề, chúng ta sẽ làm một dự án nhỏ thú vị với Arduino và OLED và làm sáng tỏ những điều sau:
- Khái niệm cơ bản về mã QR.
- Làm thế nào nó hoạt động.
- Cách tạo mã QR của riêng bạn bằng Arduino.
- Và cuối cùng, hiển thị nó trên màn hình OLED (SSD1306).
Vì vậy, mã QR này là gì?
Mã QR (Mã phản hồi nhanh) là mã 2D ma trận để đọc dữ liệu ở tốc độ cao, được phát triển bởi DENSO WAVE vào năm 1994 cho ngành công nghiệp ô tô của Nhật Bản. Mã QR nén dữ liệu rất hiệu quả so với mã vạch tiêu chuẩn, để đạt được điều này, nó sử dụng bốn chế độ mã hóa tiêu chuẩn hóa (số, chữ và số, byte / nhị phân và kanji), công nghệ này được tạo thành "mã nguồn mở" tức là có sẵn cho tất cả mọi người. đã trở nên phổ biến rất nhanh chóng. Ưu điểm đáng kể của Mã QR so với mã vạch thông thường là dung lượng dữ liệu lớn hơn và khả năng chịu lỗi cao.
Mã QR hoạt động như thế nào?
Mã QR (và các mã ma trận dữ liệu khác) được thiết kế để đọc bởi các công cụ đặc biệt, không phải bởi con người, vì vậy chỉ có một số lượng cụ thể mà chúng ta có thể hiểu được bằng cách nghiên cứu trực quan, mặc dù mỗi mã đều khác nhau theo nhiều cách khác nhau mặc dù chúng chứa một số điểm chung thú vị các tính năng bằng cách quan sát mã QR của circuitdigest.com, chúng tôi sẽ nghiên cứu một số trong số chúng
- Mẫu tìm kiếm: Các hộp vuông lớn với một hộp đặc bên trong ở ba góc của mã giúp dễ dàng xác nhận rằng đó là mã QR vì chỉ có ba trong số chúng, vì vậy, khá rõ ràng là mã được định hướng theo cách nào.
- Alignment Pattern: Điều này đảm bảo rằng bất kỳ hướng nào mã đều có thể đọc được.
- Mẫu thời gian: Dòng này chạy ngang và dọc giữa ba mẫu công cụ tìm kiếm , sử dụng những dòng này, người đọc có thể xác định kích thước của mã.
- Thông tin về phiên bản: Hiện có 40 phiên bản khác nhau của tiêu chuẩn mã QR, phần mã này xác định phiên bản mã QR đang được sử dụng, dành cho tiếp thị phiên bản 1-7 được sử dụng bình thường.
- Thông tin định dạng: Các đối tác định dạng có thông tin về khả năng chịu lỗi và che dữ liệu.
- Vùng dữ liệu: Phần này của mã chứa tất cả các phần tử dữ liệu và mã sửa lỗi.
- Vùng thoát: Khoảng cách trong mỗi mã QR là bắt buộc để phân biệt mã với môi trường xung quanh.
Hình ảnh dưới đây sẽ cung cấp cho bạn một ý tưởng rõ ràng về mã
Các phần khác của mã là dữ liệu và mã dự phòng.
Có một số tính năng và chủ đề phức tạp khác mà tôi sẽ không thảo luận trong hướng dẫn này, nếu bạn muốn đọc chi tiết hơn về mã QR, vui lòng làm theo hướng dẫn Mã QR này của Tan Jin Soon, EPCglobal Singapore Council. Tạp chí Tổng hợp, 2008.
Đặc điểm kỹ thuật của mã QR
Kích thước ký hiệu |
Min. 21x21 ô - Tối đa. 177x177 ô (với khoảng cách 4 ô) |
|
Loại thông tin và khối lượng |
Các ký tự số |
Tối đa 7.089 ký tự |
Bảng chữ cái, Dấu hiệu |
4.296 ký tự tối đa |
|
Nhị phân (8 bit) |
Tối đa 2.953 ký tự |
|
Ký tự Kanji |
Tối đa 1.817 ký tự |
|
Hiệu suất chuyển đổi |
Chế độ ký tự số |
3,3 ô / ký tự |
Chế độ chữ và số / Dấu hiệu |
5,5 ô / ký tự |
|
Chế độ nhị phân (8 bit) |
8 ô / ký tự |
|
Chế độ ký tự Kanji (13 bit) |
13 ô / ký tự |
|
Sửa lỗi chức năng |
Cấp độ L |
Khoảng 7% diện tích biểu tượng được khôi phục tối đa |
Cấp độ M |
Khoảng 15% diện tích biểu tượng được khôi phục tối đa |
|
Cấp Q |
Khoảng 25% diện tích biểu tượng được khôi phục tối đa |
|
Cấp độ H |
Khoảng 30% diện tích biểu tượng được khôi phục tối đa |
|
Chức năng liên kết |
Có thể chia tối đa thành 16 biểu tượng |
Tạo mã QR của riêng bạn
Thực hiện theo các bước được đề cập bên dưới để tạo mã QR của riêng bạn, trong ví dụ này, chúng tôi sẽ tạo mã QR cho trang web Circuit Digest yêu quý của chúng tôi
Để tạo mã QR, hãy truy cập trang web này và nếu bạn nhìn vào phía trên cùng của trang web, bạn có thể thấy danh sách các tùy chọn, trong hướng dẫn này, chúng tôi đang tạo mã QR cho một URL, vì vậy chúng tôi sẽ
- Nhấp vào tab URL và dán URL cho Thông báo mạch vào phần Nhập URL.
- Bấm vào lưu.
- Đặt tên tệp cho tệp đầu ra.
- Chọn PNG làm định dạng tệp ưa thích của chúng tôi.
- và nhấp vào lưu.
Hình ảnh dưới đây sẽ cung cấp cho bạn một ý tưởng rõ ràng về quy trình
Bộ vi điều khiển thân yêu nhất của chúng tôi “Arduino” không đủ thông minh để có thể biên dịch hình ảnh PNG thô và hiển thị nó trong màn hình OLED. Vì vậy, để hiển thị mã QR lên OLED, chúng ta cần làm theo một số bước đơn giản và chuyển đổi hình ảnh PNG thành một mảng bitmap có thể đọc được bằng Arduino. Việc chuyển đổi này trước đây chúng tôi đã thực hiện trong khi giao tiếp SSD1306 OLED với Arduino và giao tiếp LCD đồ họa với Arduino. Chúng tôi cũng đã giao tiếp SSD1306 OLED với Raspberry Pi, ESP32, NodeMCU và nhiều bộ vi điều khiển khác. Chuyển đổi mảng bitmap có thể được thực hiện theo hai bước dưới đây:
- Chuyển đổi định dạng PNG sang BMP.
- Chuyển đổi hình ảnh BMP thành một mảng mã HEX.
Chuyển đổi định dạng PNG sang BMP
Để chuyển đổi hình ảnh PNG đã tải xuống thành hình ảnh BMP, hãy truy cập trang web này và trong phần trình chuyển đổi hình ảnh và
- Nhấp vào menu thả xuống và chọn
- Chuyển đổi sang BMP
- Nhấp vào Go
Hình ảnh dưới đây sẽ cung cấp cho bạn một ý tưởng rõ ràng về quy trình:
Bạn sẽ thấy một trang mới giống như hình dưới đây:
- Nhấp vào tab Chọn tệp và chọn hình ảnh đã tải xuống
- Trong cài đặt Tùy chọn, nhập kích thước mong muốn của bảng điều khiển (chúng tôi đang sử dụng màn hình OLED 128x64)
- Nhấp vào nút Bắt đầu chuyển đổi
Bạn sẽ thấy trang sau và sau vài giây, hình ảnh đã chuyển đổi của bạn sẽ được tải xuống nếu quá trình tải xuống không bắt đầu tự động nhấp vào tùy chọn tải xuống tệp của bạn:
Tuyệt quá! Bây giờ, chúng tôi đã có tệp BMP của mình, đã đến lúc chuyển đổi nó thành một mảng mã HEX có thể đọc được bởi Arduino.
Chuyển đổi hình ảnh BMP thành một mảng mã HEX
Để chuyển đổi hình ảnh BMP đã tải xuống thành mảng HEX, hãy truy cập trang web này và nhấp vào Công cụ -> image2cpp
Hình ảnh dưới đây sẽ cung cấp cho bạn một ý tưởng rõ ràng về quy trình
Bạn sẽ thấy một màn hình có bốn tùy chọn và chúng ta sẽ thảo luận chi tiết về chúng
- Chọn ảnh
- Cài đặt Hình ảnh
- Xem trước
- Đầu ra
Chọn phần hình ảnh
Trong phần này, chúng tôi sẽ chọn hình ảnh mà chúng tôi vừa chuyển đổi thành BMP:
Phần Cài đặt Hình ảnh
Trong phần này, chúng tôi sẽ đặt các tùy chọn kích thước canvas, màu nền, tỷ lệ và trung tâm theo giá trị yêu cầu của chúng tôi.
- Kích thước canvas (chúng tôi đặt thành 128x64 vì chúng tôi đang sử dụng OLED với mật độ điểm ảnh 128x64).
- Trong phần này, chúng ta có thể thiết lập màu nền của OLED (chúng ta chọn nó là màu trắng).
- Tỷ lệ được đặt thành kích thước ban đầu.
- Cuối cùng, trong tùy chọn trung tâm, nhấp vào hộp kiểm ngang và dọc, điều này sẽ làm cho hình ảnh xuất hiện ở trung tâm.
Hình ảnh dưới đây sẽ cho bạn một ý tưởng rõ ràng
Xem trước phần
Trong phần xem trước, chúng ta có thể thấy bản xem trước rõ ràng của hình ảnh sẽ được hiển thị trong OLED như hình dưới đây:
Phần đầu ra
Trong phần đầu ra, chúng tôi sẽ tạo và sao chép mã đã tạo, để làm như vậy, hãy làm theo các bước sau:
- Định dạng đầu ra mã (chúng tôi đặt nó là mã Arduino vì chúng tôi đang sử dụng một).
- Định danh (tùy chọn này đặt tên cho mảng được tạo, chúng tôi để mặc định như vậy).
- Chế độ vẽ (Chúng tôi đặt tùy chọn chế độ vẽ thành ngang).
- Và cuối cùng, chúng ta nhấp vào nút tạo mã, nút này sẽ tạo ra mã đầu ra cuối cùng.
Hình ảnh dưới đây sẽ cho bạn một ý tưởng rõ ràng
Sơ đồ mạch
Hình ảnh dưới đây cho thấy các kết nối giao diện giữa Arduino Nano và SSD1306:
Pin Arduino Nano |
PIN OLED |
GND |
GND |
3,3V |
VCC |
D13 |
CLK |
D11 |
MOSI |
D8 |
RES |
D9 |
SDC |
D10 |
CCS |
Giải thích mã
Để hiển thị hình ảnh trên OLED, chúng ta cần sự trợ giúp của thư viện Arduino, có thể tải xuống từ kho lưu trữ GitHub này. Tải xuống phiên bản U8glib-1.19.1.zip của thư viện và nhập nó vào Arduino IDE. Nếu bạn chưa quen với Arduino, hãy sử dụng liên kết này mô tả cách nhập thư viện. Trong phần dưới đây, chúng tôi sẽ sửa đổi mã để hiển thị mảng HEX đã tạo trước đó sang OLED. Mã hoàn chỉnh với một video hoạt động được đưa ra ở cuối bài viết này. Giải thích chi tiết về mã được đưa ra bên dưới.
Đầu tiên, hãy bao gồm thư viện đã tải xuống.
#include "U8glib.h" // bao gồm thư viện U8glib
Sau đó, xác định tất cả các chân cần thiết cho OLED.
#define OLED_CLK_PIN 13 // Arduino Digital Pin D13: SCK #define OLED_MOSI_PIN 11 // Arduino Digital Pin D11: MOSI #define OLED_RES_PIN 10 // Arduino Digital Pin D10: SS #define OLED_SDC_PIN 9 // Arduino Digital Pin D9: OC1A #define OLED_CSS_PIN 8 // Chân kỹ thuật số Arduino D13: ICP1
Khởi tạo Thư viện u8glib.
U8GLIB_SH1106_128X64 u8g (OLED_CLK_PIN, OLED_MOSI_PIN, OLED_RES_PIN, OLED_SDC_PIN, OLED_CSS_PIN);
Sau đó, Bao gồm mảng hình ảnh đã tạo.
const uint8_t circuitdigest PROGMEM = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1c 0x87, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x0c, 0x01, 0x87, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 0xff, 0xff, 0xff, 0xf3, 0xff, 0x8f, 0xf0, 0x7f, 0x31, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xffxf, 0x8f, 0xffxf, 0x33, 0xffxf, 0x33 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x81, 0x8f, 0x31,0x80, 0x33, 0x81, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x8f, 0x31, 0x80, 0x33, 0x81, 0xcf, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff 0xff, 0xff, 0xff, 0xf3, 0x01, 0x8f, 0xb1, 0x80, 0x33, 0x81, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x833f, 0x98c1 0x81, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x01, 0x8f, 0xc1, 0x98, 0x33, 0x81, 0xcf, 0xff, 0xff, 0xff, 0xff, …….. …… …..0xff, 0xff, …….. ………..0xff, 0xff, …….. ………..
Chức năng Draw được sử dụng để vẽ hình ảnh bitmap (mã QR) trên OLED với sự trợ giúp của chức năng u8g.drawBitmapP.
void draw (void) {// lệnh đồ họa để vẽ lại toàn bộ màn hình nên được đặt ở đây u8g.drawBitmapP (0, 0, 16, 64, circuitdigest); ….. ……
Cuối cùng, trong hàm loop () , gọi tất cả các thủ tục cần thiết để xây dựng hình ảnh trên OLED
void loop () {u8g.firstPage (); // Một lệnh gọi đến thủ tục này, đánh dấu sự bắt đầu của vòng lặp ảnh. làm {draw (); } while (u8g.nextPage ()); // Một lệnh gọi đến thủ tục này, đánh dấu phần cuối của phần nội dung của vòng lặp hình ảnh. // xây dựng lại hình ảnh sau một thời gian trễ delay (1000); }
Sau khi hoàn thành mã, hãy cắm Arduino vào cổng USB của máy tính, chọn cổng COM và tải mã lên. Nếu bạn đã làm mọi thứ chính xác, bạn sẽ có một màn hình hoạt động với mã QR trên OLED.
Tôi hy vọng bạn thích dự án này và thích học một cái gì đó mới, hãy tiếp tục đọc và tiếp tục học hỏi và tôi sẽ gặp bạn lần sau.