สวัสดีครับ นานแล้วที่ไม่ได้อัพบทความเนื่องจากติดงานแต่ง (ของผมเอง555) ช่วงนี้มีความคิดว่า เด่วนี้ QR code ย่อมาจาก Quick Response (ควิ๊ก เรสปอน) พบเจอได้บ่อยมากในการชำระค่าบริการต่างๆ รวมถึงการใส่ URL ที่ยาวๆลงไปเป็น QR code เพื่อให้ผู้ใช้นำสมาร์ทโฟนสแกนและเข้าไปยัง URL นั้นได้โดยไม่ต้องพิมพ์เอง หรือแม้แต่ใช้เพื่อระบุ ID ในการระบุตำแหน่งของหุ่นยนต์อย่าง Amazon warehouse robots เนื่องจาก QR code มีการเข้ารหัสข้อมูลเป็น 2 มิติ ต่างจาก Bar code ที่เรียงเป็นแถวยาวๆ ทำให้มีขนาดกระทัดรัดกว่า เลยคิดว่าน่าจะมีประโยชน์ที่จะลองทำ QR code จาก Arduino ดูบ้าง
QR code ยังมี feature ที่น่าสนใจอีกอย่างคือ Error correction คือ หากมีบล๊อค หรือพิกเซลใน QR-Code บางตัวเสียไป ก็ยังคงสามารถส่งสารปลายทางได้อย่างถูกต้อง ซึ่งอาจป้องกันการเสียข้อมูลได้ถึง 30% เลยทีเดียว จึงเป็นที่นิยมอย่างแพร่หลาย
ความจุข้อมูลคิวอาร์โค้ด |
|
ตัวเลขอย่างเดียว |
มากสุด 7,089 ตัวอักษร |
ตัวอักษร ผสม ตัวเลข |
มากสุด 4,296 ตัวอักษร |
ไบนารี (8 บิต) |
มากสุด 2,953 ไบต์ |
คันจิ/คะนะ |
Max. 1,817 ตัวอักษร |
เกริ่นแค่พอประมาณ ในการเขียนกับ Arduino เราจะใช้จอแสดงผล oled ขนาดเล็กเพื่อแสดง QR-code ซึ่งจากการทดสอบด้วยหน้าจอขนาด 128x64 ก็เพียงพอต่อการแสดง QR-code แล้วครับ
อุปกรณ์ที่ใช้ในบทความนี้
1. Arduino Nano
2. จอ 0.96 inch 7-pin สองสีแบบ SPI
3. สายไฟ jumper เมีย-เมีย 7 เส้น
ซึ่งต่อวงจรตามนี้ครับ
OLED Pin Arduino Pin
SDA 9
SCK 10
DC 11
CS 12
RES 13
ในส่วนของการเขียนโปรแกรมในตัวอย่างนี้เราจะใช้ QR-Code library ซึ่งสามารถดาวน์โหลดได้จาก Arduino IDE เช่นกัน โดยการเข้า Arduino IDE -> Tools -> Manage Libraries จากนั้นเมื่อมีหน้าต่าง Library manager ให้พิมพ์ qrcode เลือก install library ของคุณ Richard Moore ตามรูปครับ
เมื่อติดตั้งเรียบร้อยแล้ว ให้ติดตั้ง Library ของจอ oled ที่เราจะใช้แสดงผล โดยจะใช้ Library ชื่อว่า Adafruit GFX Library และ Adafruit SSD1306 ซึ่งสามารถหาได้จาก Library Manager เช่นเดียวกัน
เมื่อลง Library เสร็จสรรพ ให้ Copy Code ด้านล่างนี้ไปยัง Arduino IDE
ตั้งค่าบอร์ด และ port ให้ถูกต้อง กด Sketch -> Upload หน้าจอควรแสดงผลดังรูป
ทีนี้ลองมาดูในตัว Code กันครับ Code แบ่งออกเป็น 2 ส่วน คือส่วนตั้งค่าหน้าจอ ซึ่งเป็นการใช้หน้าจอ oled SSD1306 และการสร้าง QR code โดยหัวใจหลักของการสร้าง QR code อยู่ที่บรรทัดนี้
/***************| * สร้าง QR-code | **************/ uint8_t qrcodeBytes[qrcode_getBufferSize(1)]; qrcode_initText(&qrcode, qrcodeBytes, 1, ECC_LOW, "arduinona.com");
เริ่มต้นโดยสร้างตัวแปร qrcodeBytes เป็น Array ขนาดเท่ากับ qrcode_getBufferSize(1) ซึ่่งมีพารามิเตอร์เป็น 1 ที่หมายถึง version ของ QR code โดยเราสามารถใส่ version ได้ตั้งแต่ 1- 40 ซึ่งเลข version หมายถึงขนาดสี่เหลี่ยมด้านเท่าขนาด = 4*version + 17 ดังนั้น version 1 หมายถึง QR code ที่ generate จะมีขนาด 4*(1)+17 = 21 คือ 21x21 นั่นเอง
ขนาดที่เพิ่มขึ้น ทำให้ต้องการพื้นที่การเก็บข้อมูลที่สูงขึ้นตามระดับ version ด้วย ตารางข้างล่างแสดง version และขนาดที่จุได้แตกต่างกัน โดยข้อมูลจะถูกแยกเป็น 3 แบบคือ
Numeric : หมายถึงตัวเลข 0-9
Alphanumeric : หมายถึง ตัวอักษรตัวใหญ่ A-Z เลข 0-9 และอักขระดอลล่า ($), เว้นวรรค ( ) โคลอน (:) และ +, -, *, /
Byte : หมายถึงอักขระทุกตัว
ซึ่งตารางข้างล่างจะบอกว่า แต่ละ version มีความสามารถในการเก็บข้อมูลแบบไหนขนาดเท่าไรบ้างครับ
นอกจากนั้น เราสามารถกำหนดค่า Error correction ให้สูง หรือ ต่ำได้ตามต้องการ โดยการกำหนดค่าสูงอาจต้องแลกมากับการจุข้อมูลได้น้อยลงตามตารางนั่นเองครับ โดยเลือกใส่ระหว่าง ECC_LOW, ECC_MEDIUM, ECC_QUARTILE และ ECC_HIGH
Version | Size | Error Correction | Mode | ||
---|---|---|---|---|---|
Numeric | Alphanumeric | Byte | |||
1 | 21 x 21 | LOW | 41 | 25 | 17 |
MEDIUM | 34 | 20 | 14 | ||
QUARTILE | 27 | 16 | 11 | ||
HIGH | 17 | 10 | 7 | ||
2 | 25 x 25 | LOW | 77 | 47 | 32 |
MEDIUM | 63 | 38 | 26 | ||
QUARTILE | 48 | 29 | 20 | ||
HIGH | 34 | 20 | 14 | ||
3 | 29 x 29 | LOW | 127 | 77 | 53 |
MEDIUM | 101 | 61 | 42 | ||
QUARTILE | 77 | 47 | 32 | ||
HIGH | 58 | 35 | 24 | ||
4 | 33 x 33 | LOW | 187 | 114 | 78 |
MEDIUM | 149 | 90 | 62 | ||
QUARTILE | 111 | 67 | 46 | ||
HIGH | 82 | 50 | 34 |
หวังว่าคงมีประโยชน์ไม่มากก็น้อย ใครที่ทำได้ทำไม่ได้ยังไง แชร์ให้ทราบกันในช่อง comment ได้นะครับ
ธนบดี บุหลันศรีชาติ
ผู้เขียน
เลี้ยงกาแฟผมสักแก้ว : https://ko-fi.com/modulemore
Reference.
1. www.mobile-qr-codes.org/qr-codes-vs-barcodes.html
2. www.mindphp.com/คู่มือ/73-คืออะไร/1836-what-is-qr-code.html