เชื่อมต่อจอแอลซีดีโนเกีย 5110 ประโยชน์ของการใช้ Arduino Uno ร่างในการดำเนินการ

อาจเหมือนกับผู้สร้าง Arduino ทุกคนที่มีความคิดบ้าๆ บอๆ อยู่ในหัว ฉันสั่งชิ้นส่วนที่จำเป็นทั้งหมดจากจีน เราต้องรอเป็นเวลานานมาก แต่แล้วก็มีการส่งมอบบอร์ด Arduino Uno และจอแสดงผล LCD ของ Nokia 5110 ก่อนกำหนด เนื่องจากฉันไม่เคยคุ้นเคยกับอุปกรณ์อิเล็กทรอนิกส์และการเขียนโปรแกรมมาก่อน ฉันจึงตัดสินใจไม่เสียเวลาและเริ่มเรียนรู้วิธีแสดงข้อมูลในโมดูลนี้

สิ่งแรกที่ฉันทำคือ Google และบังเอิญเจอสิ่งพิมพ์ “Arduino, Nokia 5110 LCD module and Cyrillic letter” จากผู้เขียน แล้วฉันก็ตระหนักว่าทุกสิ่งที่ฉันวางแผนไว้ก่อนหน้านี้จะไม่ง่ายที่จะทำ

ฉันเข้าใจอักษรซีริลลิกแล้ว ทุกอย่างเรียบง่ายที่นั่น ฉันจะไม่คัดลอกวางโพสต์ล่าสุด แต่รูปภาพมีปัญหาจริงๆ ภารกิจคือ: คุณต้องวาดภาพและอัปโหลดไปยังจอแสดงผล เจอปัญหาแรกเข้าระบบเมื่อวันพุธ การเขียนโปรแกรมอาร์ดูโน่ฉันเห็นว่าไม่มี "แทรก - รูปภาพ" แต่คุณต้องเขียนรูปภาพด้วยรหัสบางอย่างในระบบเลขฐานสิบหก ฉันพบบรรณาธิการหลายคน แต่นั่นไม่ใช่กรณีนี้ รูปภาพแสดงได้ไม่เพียงพอ ฉันเริ่มมองหาปัญหาที่อาจเกิดขึ้น

จากการทดลอง ความพยายาม และการทดสอบต่างๆ มากมาย ฉันจึงได้อัลกอริธึมที่ฉันจะแชร์กับคุณ:

1) คุณต้องได้ภาพในรูปแบบ .bmp ขาวดำ โดยมีนามสกุล 84 x 48 พิกเซล
ซึ่งสามารถทำได้หลายวิธีสำหรับเกือบทุกคน โปรแกรมแก้ไขกราฟิกมีฟังก์ชัน "บันทึกเป็น" ที่เราระบุพารามิเตอร์ที่จำเป็น
ฉันทำใน corelDRAW เราได้รับสิ่งที่คล้ายกัน มีความจำเป็นต้องชี้แจงว่าต้องบันทึกชื่อของรูปภาพ รูปแบบละตินคีย์บอร์ดเพราะว่า โปรแกรมถัดไปจะไม่สามารถเปิดมันได้

2) หากจำเป็น คุณสามารถแก้ไขรูปภาพด้วยสีได้ มีเครื่องมือที่เรียบง่ายและน่าสนใจอยู่หลายอย่าง

3) การใช้สิ่งนี้เราได้รับรหัสฐานสิบหกของรูปภาพ

4) ใส่ รหัสนี้วี รหัสโปรแกรม Arduino และอัปโหลดไปยังบอร์ด:

// SCK - พิน 8 // MOSI - พิน 9 // DC - พิน 10 // RST - พิน 11 // CS - พิน 12 // #include จอแอลซีดี5110 myGLCD(8,9,10,11,12); ภายนอก uint8_t OKO; ลอย y; uint8_t* bm; พื้นที่ภายใน; การตั้งค่าเป็นโมฆะ() ( myGLCD.InitLCD(); ) void loop() ( myGLCD.clrScr(); myGLCD.drawBitmap(0, 0, OKO, 84, 48); myGLCD.update(); ล่าช้า (2000); )

#รวม const uint8_t OKO PROGMEM=( // คัดลอกเครื่องมือ GLCD รหัสฐานสิบหก);

เมื่อประกอบอุปกรณ์บน Arduino เรามักจะเผชิญกับความจำเป็นในการส่งออกข้อมูลโดยอัตโนมัติ และเช่นเคย ฉันต้องการให้โซลูชันมีราคาไม่แพง และปรากฎว่าการเลือกอุปกรณ์ราคาไม่แพงนั้นไม่ได้สมบูรณ์มากนัก

หากมีการแสดงข้อมูลเพียงเล็กน้อย จะสะดวกในการใช้ตัวบ่งชี้เจ็ดส่วน พวกมันสว่างและตัดกันมาก ไม้บรรทัด 4 หลักสูง 0.36 นิ้วบน TM1637 ขายในราคา 70 เซ็นต์และควบคุมด้วยพินเพียง 2 อัน ดังที่คุณอาจเดาได้ ส่วนใหญ่จะออกแบบมาเพื่อแสดงเวลา แม้ว่าจะสามารถแสดงอุณหภูมิ ความดัน และพารามิเตอร์อื่นๆ ได้อย่างง่ายดาย ซึ่งตัวเลข 4 หลักก็เพียงพอแล้ว

แต่หากมีข้อมูลเอาต์พุตจำนวนมากก็จะไม่ทำงาน ในกรณีเช่นนี้มักใช้จอแสดงผล LCD 1602 แบบ "พื้นบ้าน" ซึ่งมีความสามารถในการแสดง 2 บรรทัดจำนวน 16 ตัวอักษรในราคาหนึ่งเหรียญครึ่ง วิธีนี้ทำให้คุณสามารถแสดงข้อมูลได้มากขึ้น

พี่ชาย 4 บรรทัดที่ล้ำหน้ากว่าจะแสดงข้อมูลได้มากขึ้น แต่มีราคาแพงกว่าอย่างเห็นได้ชัดประมาณ 5 ดอลลาร์และขนาดของมันก็ค่อนข้างใหญ่อยู่แล้ว

อุปกรณ์ทั้งหมดนี้มีทั้งข้อดีและข้อเสีย ข้อเสียเปรียบหลัก ได้แก่ การขาดการรองรับภาษารัสเซียเนื่องจากตารางโค้ดมีการต่อสายเข้ากับชิปอย่างแน่นหนาและการไม่สามารถแสดงกราฟิกได้ พูดอย่างเคร่งครัดมีความเป็นไปได้ที่จะมีเฟิร์มแวร์ Cyrillic ในอุปกรณ์ดังกล่าว แต่ส่วนใหญ่จะขายในรัสเซียและในราคาที่ไม่สมเหตุสมผล
หากข้อเสียเหล่านี้ชี้ขาดสำหรับการใช้งานในอุปกรณ์ที่ถูกสร้างขึ้นและความละเอียด 84x48 พิกเซลในกราฟิกขาวดำเหมาะสมกับคุณคุณควรให้ความสนใจกับจอแสดงผล Nokia 5110 กาลครั้งหนึ่ง แต่มันก็ไม่สมบูรณ์มาก และในสถานที่ที่ล้าสมัย โดยเฉพาะอย่างยิ่งมีการระบุไว้ที่นั่นว่าไม่สามารถแสดงอักษรซีริลลิกได้ วันนี้ไม่มีปัญหาดังกล่าว

ฮีโร่แห่งรีวิวของเราซึ่งมีราคาไม่ถึงสองเหรียญมาหาฉันในกล่องกระดาษแข็งที่ทนทานพร้อมฟิล์มกันรอยบนหน้าจอ ซึ่งต้องขอบคุณผู้ขายมาก อุปกรณ์นี้มีแผงวงจรพิมพ์ขนาด PCB สีแดง 45x45 มม. และหน้าจอ LCD ความละเอียด 84x48 พิกเซลและขนาด 40x25 มม. ตัวเครื่องมีน้ำหนัก 15 กรัม มีไฟแบ็คไลท์สีน้ำเงินที่สามารถปิดได้ สำหรับ Arduino จอแสดงผลนี้จะกัดพินดิจิทัล 5 พิน ไม่นับแหล่งจ่ายไฟ กระดานมีพิน 2 แถวที่ขนานกัน คุณจึงใช้เพียงแถวเดียวได้ ในจำนวนนี้ 5 รายการใช้สำหรับการควบคุม 2 รายการสำหรับเปิดเครื่องและอีก 1 รายการสำหรับเปิดไฟแบ็คไลท์ หากต้องการเปิดไฟแบ็คไลท์คุณจะต้องทำให้พิน LIGHT สั้นลงกราวด์ (ตามที่พวกเขาพูดมีจอแสดงผลอีกเวอร์ชันหนึ่ง - บนกระดานสีน้ำเงินซึ่งพินนี้เชื่อมต่อกับแหล่งจ่ายไฟ) บอร์ดไม่มีการขาย มีหวี 2 อันรวมอยู่ในชุด
ดังนั้นเราจึงเชื่อมต่อพิน SCLK, DIN, DC, CE และ RTS เข้ากับพิน Arduino เช่น 3, 4, 5, 6, 7 พิน VCC เป็น 3.3V (3.3 พอดีไม่ใช่ 5!) เชื่อมต่อ กราวด์และดาวน์โหลดไลบรารี
ฟังก์ชันจากไลบรารีนี้ช่วยให้คุณสามารถแสดงกราฟิกดั้งเดิม (เส้น วงกลม สี่เหลี่ยมผืนผ้า ฯลฯ) ภาพแรสเตอร์ และข้อความ ห้องสมุดมีตัวอย่างที่แสดงความสามารถ ฉันแนะนำให้คุณดู แต่เพื่อให้ข้อความแสดงเป็นภาษารัสเซีย คุณจะต้องปรับแต่งแบบอักษร แต่โชคดีที่คนดีทำทุกอย่างให้เราแล้วและสามารถดาวน์โหลดไฟล์ทดแทนได้
ฉันจะยกตัวอย่างภาพร่างด้านล่างและสามารถดูผลลัพธ์ของข้อความในภาษารัสเซียได้ด้านบน ง่ายต่อการคำนวณว่าด้วยขนาดตัวอักษรที่เล็กที่สุด (หมายเลข 1) คุณสามารถแสดงอักขระได้ 84 ตัว (14 ใน 6 บรรทัด) ซึ่งเพียงพอที่จะแสดง เช่น ข้อความวินิจฉัยที่ครอบคลุม แบบอักษร #2 มีขนาดใหญ่เป็นสองเท่า
ความละเอียดหน้าจอช่วยให้คุณแสดงภาพแรสเตอร์สองสีได้ค่อนข้างดีซึ่งสามารถใช้เป็นไอคอนในโปรแกรมได้

การสร้างไอคอนดังกล่าวนั้นง่ายมาก ภายใต้สปอยเลอร์ฉันจะแสดงให้คุณเห็นว่าสิ่งนี้เสร็จสิ้นได้อย่างไร

วิธีสร้างภาพแรสเตอร์อย่างรวดเร็วโดยใช้ตัวอย่างโลโก้เว็บไซต์ MYSKU

ขั้นแรก มาจับภาพหน้าจอของหน้าจอโลโก้ (ปุ่ม Print Screen)
เปิด Paint จากโปรแกรมมาตรฐานแล้วกด Ctrl+V หน้าจอทั้งหมดที่มีโลโก้อยู่ในมือเรา


เลือกส่วนที่ต้องการแล้วกดปุ่ม TRIM มารับชิ้นส่วนของเรากันเถอะ

ตอนนี้เราต้องเปลี่ยนส่วนนี้เป็นสองสี สีเองก็สามารถจัดการเรื่องนี้ได้ คลิก "บันทึกเป็น" และเลือกประเภท "ภาพขาวดำ (*.bmp)" เราเพิกเฉยต่อคำเตือนของบรรณาธิการและคลิกตกลงและเห็นภาพต่อไปนี้:

ตอนนี้เราต้องเปลี่ยนชุดพิกเซลนี้เป็นอาร์เรย์ของโค้ดสำหรับ Arduino ฉันพบสิ่งหนึ่งที่รับมือกับงานนี้ได้
เขาจำเป็นต้องส่งไฟล์ bmp เป็นอินพุต แต่ต้องเป็น 256 สี! ดังนั้นเราจะคลิก "บันทึกเป็น" อีกครั้งและเลือกประเภท "256 color bmp art" ตอนนี้เรามาจำขนาดของด้านข้างของไฟล์ผลลัพธ์คุณจะต้องระบุในแบบร่าง (ดูใน Paint ที่ด้านล่างในแถบสถานะหรือโดยการเปิดคุณสมบัติไฟล์ -> แท็บรายละเอียด) และไปที่ตัวแปลงออนไลน์ .


มาเลือกไฟล์ของเรา ตรวจสอบเลขฐานสิบหก แล้วคลิก CONVERT
มารับอาร์เรย์ที่เราต้องการ:


เราคัดลอกอาร์เรย์นี้ลงในร่าง รวบรวมและดูว่าเกิดอะไรขึ้น


ตอนนี้เรามาปิดไฟแบ็คไลท์แล้วดูว่าภาพจะเป็นอย่างไรหากไม่มีมัน


อย่างที่คุณเห็นทั้งข้อความและไอคอนสามารถอ่านได้ ยิ่งไปกว่านั้น ยิ่งแสงสว่างมากเท่าไหร่ การอ่านก็จะยิ่งดีขึ้นเท่านั้น (โอ้ ฉันจำได้ว่าการใช้ Nokia 1100 ในวันที่อากาศแจ่มใสช่างน่ายินดีแค่ไหน ในขณะที่ผู้คนซ่อนมือถือของตนไว้ในที่ร่มเพื่อหมุนหมายเลขโดยใช้เมทริกซ์สี) โดยทั่วไป คุณสามารถใช้จอแสดงผลในโหมดนี้ได้หากมีแสงสว่างเพียงพอหรือแสงพื้นหลังรบกวน หรือเพื่อประหยัดพลังงานแบตเตอรี่ หากมองเห็นหน้าจอของใครบางคนได้ยาก ให้ลองเล่นกับคอนทราสต์ในภาพร่าง ความเปรียบต่างที่ดีที่สุดทั้งที่มีและไม่มีแบ็คไลท์นั้นได้มาจากค่าที่ต่างกัน ซึ่งจะต้องนำมาพิจารณาด้วย

ตัวอย่างภาพร่างสำหรับแสดงข้อความและรูปภาพ

#รวม #รวม // pin 3 - การตอกบัตรแบบอนุกรม (SCLK) // pin 4 - ข้อมูลแบบอนุกรมออก (DIN) // pin 5 - เลือกข้อมูล/คำสั่ง (D/C) // pin 6 - เลือกชิป LCD (CS) // pin 7 - รีเซ็ต LCD (RST) จอแสดงผล Adafruit_PCD8544 = Adafruit_PCD8544(3, 4, 5, 6, 7); const ถ่านที่ไม่ได้ลงนามคงที่ PROGMEM ku59x39 = ( 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x3, 0xf0, 0xfc, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0x87, 0xff 0xc0, 0x0, 0x0, 0x7f, 0xc0, 0xff, 0xe3, 0xff, 0x0, 0x0, 0x7f, 0xff, 0x90, 0xff, 0xf1, 0xfc, 0x0, 0x7, 0xff, 0xff, 0x30, 0xff, 0xf8, 0xf0, 0x0, 0xff, 0xfe, 0x30, 0xff, 0xfc, 0x40, 0x3, 0xff, 0xff, 0xfc, 0x70, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff, 0xf8, 0xf0, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xf0, 0xf0, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xe1, 0xf0, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xe3, 0xf0, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x83, 0xf0, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x87, , 0xff, 0xff, 0, 0xff, 0xff , 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0x1f, 0x87, 0xf0, 0xff, 0xff, 0xf8, 0x7f, 0x0, 0x0, 0x7, 0xf0, 0 xff, 0xff, 0xfc, 0x38, 0x0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xf0, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x0, 3f, 0xe1, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x3, 0xf0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfe, 0xf, 0x80, 0x0, 0x0, 0xf0, 0xff, 0xff, 0xff, 0xe, 0x0, 3f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc, 0x3, 0xff, 0xe1, 0xf0, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xc0, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x9c, 0xf0, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0x38, 0xf0, 0xff, 0xff, 0xff, 0xc3, , 0xff, 0x19, 0xf0, xff, 0xff, 0xff , 0xf0, 0xff, 0xff, 0x3, 0xf0, 0xff, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xff, 0xce, 0x7f, 0xdf, 0xf0, 0xff, 0xff, xff, 0xce, 0x7f , 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x9e, 0x7f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff 0, xf0, 0xff, 0xff, 0xff, , 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xf0 ); การตั้งค่าเป็นโมฆะ() ( display.begin(); display.setContrast(50); display.setTextSize(1); display.setTextColor(BLACK); // ตั้งค่าสีข้อความ ) void loop() ( display.clearDisplay(); display .drawBitmap(10, 5, ku59x39, 59, 39, BLACK); display.display(); display.clearDisplay(); display.setCursor(0,0); ไม่เพียงแต่เป้าหมายทางอากาศพลศาสตร์เท่านั้น ; display.display(); ล่าช้า (2000);


และเนื่องจาก Arduino (โปรเซสเซอร์ + RAM + Bootloader-BIOS) + ไดรฟ์ (EEPROM) + ระบบอินพุต / เอาท์พุต (IRDA Remote และ Nokia 5110) ที่จริงแล้วเป็นคอมพิวเตอร์ที่มีคุณสมบัติครบถ้วนแล้วทำไมไม่เขียนคอมพิวเตอร์ที่มีคุณสมบัติครบถ้วน เกมเพื่อมันเหรอ? แน่นอนว่าคอมพิวเตอร์ Arduino ของเราไม่สามารถจัดการกับเกมอย่าง GTA ได้ แต่มันสามารถจัดการกับของเล่นง่ายๆ สบายๆ ได้อย่างง่ายดาย! มาเขียนเกมตลอดกาลกันเถอะ - Tetris
สำหรับโปรแกรมเมอร์คนไหนก็เหมือนกับการออกกำลังกายตอนเช้า เป็นการออกกำลังกายสมองง่ายๆ ดังนั้นลุยเลย! และมันเหมือนกับว่าสิ่งนี้ไม่เคยเกิดขึ้นมาก่อนในมัสก้า และภายในเกมศักยภาพของวิชาก็จะถูกเปิดเผย
ในฐานะระบบอินพุต ฉันตัดสินใจใช้รีโมทคอนโทรล IRDA จากอุปกรณ์ใดก็ได้ ด้วยวิธีนี้เราต้องการเพียงอันเดียวโดยมีราคา 4 รูเบิลต่ออัน และรีโมทคอนโทรล IR สามารถพบได้ในอพาร์ตเมนต์ทุกห้อง สำหรับการแสดงเสียงเราจะใช้ทวีตเตอร์แบบพายโซจากมาเธอร์บอร์ดเก่าซึ่งจะเป็นอะนาล็อกมัลติมีเดียราคาประหยัดของเรา)) ตอนนี้อันที่เจ๋งกว่ากำลังมาหาฉัน แต่นี่ทำให้ราคาซูเปอร์คอมพิวเตอร์ของเราขึ้นหนึ่งดอลลาร์แล้ว! เราจะผ่านไปได้ในตอนนี้ มันจะอยู่กับเขาแล้ว
บนเขียงหั่นขนมเราเชื่อมต่ออุปกรณ์เอาท์พุตและอุปกรณ์อินพุตและ "มัลติมีเดีย" ของเรา มันกลับกลายเป็นเช่นนี้:


ฉันใช้ Arduino Uno เนื่องจากมี 3.3V ที่เราต้องการอยู่แล้ว แต่ถ้าคุณใช้ Mini คุณจะต้องได้ 3.3V ที่ต้องการจาก 5 โวลต์สำหรับหน้าจอ วิธีที่ง่ายที่สุดจากอินเทอร์เน็ตคือการใส่ซิลิคอนไดโอดสองตัวต่ออนุกรมกัน (เลือก)
เพื่อไม่ให้วาดไดอะแกรมไฟฟ้า ฉันจะระบุพิน Arduino ที่ฉันใช้
การเชื่อมต่อจอแสดงผล Nokia 5110:
พิน 3 - โอเวอร์คล็อกอนุกรม (SCLK)
พิน 4 - ข้อมูลอนุกรมออก (DIN)
พิน 5 - เลือกข้อมูล/คำสั่ง (D/C)
พิน 6 - เลือกชิป LCD (CS)
พิน 7 - รีเซ็ต LCD (RST)
ในการส่องสว่างพิน LIGHT ของจอแสดงผล ให้โยนมันไปที่ GND ของ Arduino (เฉพาะกระดานสีแดงเท่านั้น!) จ่ายไฟเพิ่มที่ 3.3V. กราวด์เป็น GND
การเชื่อมต่อตัวรับสัญญาณ IR:
พิน 8 - IR (ควบคุม) แหล่งจ่ายไฟที่ +5V และ GND ตามลำดับ
การเชื่อมต่อทวีตเตอร์แบบ Piezo:
พิน 9 - ลำโพง, กราวด์ถึง GND
หลังการติดตั้ง ให้อัพโหลดภาพร่าง

เกมร่างของเกม Tetris

///// © Klop 2017 #รวม #รวม #รวม #รวม #define rk 4 // ความกว้างของสี่เหลี่ยมจัตุรัส #define rz 5 // ความกว้างของที่นั่ง #define smeX 1 #define smeY 1 #define MaxX 10 // จำนวนที่นั่งในแนวนอน #define Speaker 9 #define RECV_PIN 8 // foot บนตัวรับสัญญาณ IRDA // pin 3 - Serial clock out (SCLK) // pin 4 - Serial data out (DIN) // pin 5 - ข้อมูล/คำสั่งเลือก (D/C) // pin 6 - เลือกชิป LCD (CS) // พิน 7 - รีเซ็ต LCD (RST) จอแสดงผล Adafruit_PCD8544 = Adafruit_PCD8544(3, 4, 5, 6, 7); IRrecv irrecv(RECV_PIN); ผลลัพธ์ decode_results; ไบต์ mstacan; ไบต์ Lst, SmeH, ศูนย์กลาง, NumNext; ไบต์ MaxY; // จำนวนแก้วในแนวตั้ง int dxx, dyy, FigX, FigY, Victory, myspeed, tempspeed; ไม่ได้ลงนามยาวตกลง, ซ้าย, ปราโว, vniz, myrecord; flfirst แบบยาวที่ไม่ได้ลงนาม = 1234; // ไบต์ป้ายกำกับการเปิดตัวครั้งแรก fig= (((0,0,0,0), (0,0,0,0), (0,0,0,0), (0,0,0,0)) , ((0,1,0,0), (0,1,0,0), (0,1,0,0), (0,1,0,0)), ((0,0,0 ,0), (0,1,1,0), (0,1,1,0), (0,0,0,0)), ((0,1,0,0), (0,1 ,1,0), (0,0,1,0), (0,0,0,0)), ((0,1,0,0), (0,1,0,0), (0 ,1,1,0), (0,0,0,0)), ((0,1,0,0), (0,1,1,0), (0,1,0,0), (0,0,0,0)), ((0,0,1,0), (0,1,1,0), (0,1,0,0), (0,0,0,0 )), ((0,0,1,0), (0,0,1,0), (0,1,1,0), (0,0,0,0)), ((0,0 ,0,0), //8 (0,0,0,0), (0,0,0,0), (0,0,0,0)) ); //================================================ ============= เป็นโมฆะ mybeep () // เสียง (analogWrite (ลำโพง 100); ล่าช้า (100); analogWrite (ลำโพง 0); ) //======= =============== ======================== เป็นโมฆะ figmove(ไบต์ a, ไบต์ b) ( สำหรับ (ไบต์ i=0;i<4;i++) for (byte j=0;j<4;j++) fig[a][i][j]=fig[b][i][j]; } //============================================== void figinit(byte a) { for (byte i=0;i<4;i++) for (byte j=0;j<4;j++) { fig[i][j]=fig[i][j]; if (fig[a][j][i]==1) // покажем след фигуру display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, BLACK); else display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, WHITE); } display.display(); NumNext=a; tempspeed=myspeed-(Victory/30)*50; // через каждые 30 линий увеличим скорость падения; dxx=0; for (byte i=0;i0) display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, สีดำ); อื่น display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, WHITE);<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) if (i+FigX+dx<0 || i+FigX+dx>ds(ชัยชนะ,1);<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) {mstacan=1; dxx=0; } } // переместили фигуру на новые координаты else { if (pov) figmove(0,8); for (i=0;i<4;i++) // восстановили фигуру for (j=0;j<4;j++) if (fig[j][i]==1) mstacan=1; } return(flag); } //================================================ void clearstacan() { for (byte i=0;idisplay.display(); ) //=============================================== =============== = เป็นโมฆะ ds(int aa, int b) ( display.fillRect(55, 10, 29, 10, WHITE); display.setCursor(55,b*10 ); display.println(aa); ) //=== ================================ ========================= บูล iffig(int dx , int dy) (int i,j; bool flag=true; bool pov=false; สำหรับ (i=0;i
และคุณสามารถต่อสู้ได้ เกมดังกล่าวรองรับการเชื่อมโยงกับรีโมตคอนโทรลใด ๆ ในการทำเช่นนี้เมื่อเริ่มเกมเมื่อถูกถามว่า "กดตกลง" ให้กดปุ่มบนรีโมทคอนโทรลที่จะรับผิดชอบในการหมุนร่าง หากคุ้นเคยกับรีโมตคอนโทรลของเกมแล้ว เกมจะเริ่มต้นทันที หากรีโมตคอนโทรลเป็นของใหม่ รหัสของปุ่ม OK จะไม่ตรงกับที่จำได้ และเกมจะต้องให้คุณกดปุ่ม "ซ้าย", "ขวา" และ "ลง" ตามลำดับ ปุ่มเหล่านี้จะถูกบันทึกลงในหน่วยความจำแบบไม่ลบเลือนของ Arduino และต่อมารีโมทคอนโทรลเฉพาะนี้จะถูกจดจำทันทีเมื่อกดปุ่ม "ตกลง"


เมื่อคุณ "ล้มเหลว" ในแถวที่รวบรวม จะมีการเล่นเสียงแหลม มันถูกนำมาใช้บนพื้นฐานของพิน Arduino หลายตัว (ในกรณีของเรา 9) เพื่อสร้าง PWM ที่ความถี่ที่กำหนด
เกมดังกล่าวรองรับคุณลักษณะทั้งหมดของเกมปกติ นอกจากนี้ยังมีคำใบ้สำหรับตัวเลขถัดไปและคะแนนปัจจุบันอีกด้วย เกมจะติดตามบันทึก ค่านี้ถูกเก็บไว้ในหน่วยความจำแบบไม่ลบเลือนของ Arduino หากต้องการรีเซ็ตบันทึก เพียงเปลี่ยนค่า flfirst=1234 ในแบบร่างเป็นค่าอื่น เกมยังเพิ่มความเร็วในการตกโดยอัตโนมัติทุก ๆ 30 ไลน์ที่ถูกตัดออกไป ดังนั้นคุณจะไม่สามารถเล่นได้อย่างไม่มีกำหนด) ภาพร่างไม่ได้รับการปรับให้เหมาะสมหรือดำเนินการอย่างระมัดระวัง แต่เขียนขึ้นเพื่อความสนุกสนาน หากใครพบข้อผิดพลาดเขียน เกี่ยวกับ ©. คุณได้รับอนุญาตให้แก้ไขร่างตามที่คุณต้องการ เฉพาะเมื่อเผยแพร่ตัวเลือกของคุณที่ใดที่หนึ่งเท่านั้น โปรดระบุลิงก์ไปยังแหล่งที่มาดั้งเดิม)
ทำไมฉันถึงทำ - วันหยุดยาว + "เพื่อความรักในศิลปะ" ถ้าลูกสาวของฉันยังเด็ก ฉันคงจะทำให้เธอเป็นสล็อตแมชชีนขนาดเล็กสำหรับห้องตุ๊กตาของเธอในวันที่ 8 มีนาคม ทันเวลาพอดี ฉันจะเพิ่มเกมบางเกมเช่น Snake และ Arkanoid และอาจตัดส่วนของร่างกายออกจาก PCB ปีนี้มีเพียงลูกสาวของฉันเท่านั้นที่ปกป้องปริญญาเอกของเธอแล้ว ดังนั้นจึงพลาดไป แต่แนวคิดนี้อาจเป็นประโยชน์กับคนอื่น)

สรุปผลการแสดงผลของ Nokia 5110:
ข้อดี
+ ความเป็นไปได้ในการแสดงกราฟิก
+ ไม่มีปัญหากับอักษรซีริลลิก
+ น้ำหนักเบา;
+อัตราส่วนที่ดีเยี่ยมของขนาด/ปริมาณของข้อมูลที่แสดง
+ข้อดีของเทคโนโลยี LCD ที่ใช้คือใช้พลังงานต่ำและสามารถอ่านได้ดีในที่มีแสงจ้า
+ แสงไฟสลับได้;
+ราคา.

ข้อเสีย
- แสงไฟไม่สม่ำเสมอ
-ภาพเป็นขาวดำ (ไม่มีเฉดสี)
- จำเป็นต้องดูแล 3.3V ไม่ใช่ทุก Arduino ที่มีแรงดันไฟฟ้าดังกล่าว

คำตัดสิน: สำหรับเงินของมันในแง่ของคุณสมบัติทั้งหมดมันครองตำแหน่งเฉพาะของมันอย่างมั่นใจ ไม่ใช่ว่าไม่มีเหตุผลที่จะเป็นตับที่ยาวในบรรดาอุปกรณ์แสดงผลสำหรับ Arduino

ฉันกำลังวางแผนที่จะซื้อ +102 เพิ่มในรายการโปรด ฉันชอบรีวิว +148 +269

จำสมัยที่โทรศัพท์มือถือ "โอ๊ค" ได้ไหม พวกเขามีแป้นพิมพ์ปุ่มกดแยกต่างหากและจอแสดงผลคริสตัลเหลวขาวดำขนาดเล็ก

ขณะนี้ตลาดนี้เป็นของ iPhone, Galaxy และอื่น ๆ ทุกประเภท แต่จอแสดงผลกำลังค้นหาการใช้งานใหม่: โปรเจ็กต์ DIY!

จอแสดงผลขาวดำขนาด 84x48 พิกเซลที่เราจะพิจารณานั้นใช้ในโทรศัพท์ Nokia 3310 ข้อได้เปรียบหลักคือใช้งานง่าย จอแสดงผลดังกล่าวจะลงตัวกับโครงการของคุณเพื่อการแลกเปลี่ยนข้อมูลแบบโต้ตอบกับผู้ใช้

ในบทความนี้เราจะดูการควบคุมการแสดงผลกราฟิกนี้โดยใช้ Arduino พิจารณาคุณสมบัติการเชื่อมต่อลักษณะทางเทคนิคของจอแสดงผลและโปรแกรมสำหรับ Arduino ทั้งหมด

วัสดุที่จำเป็น

  • Arduino หรือโคลนของมัน
  • ขั้วต่อ
  • แผงวงจร.

ข้อมูลจำเพาะการแสดงผลของโนเกีย 5110

ก่อนที่จะเชื่อมต่อจอแสดงผลและตั้งโปรแกรม Arduino เรามาดูข้อมูลทั่วไปเกี่ยวกับอุปกรณ์นี้ก่อน

พินเอาท์

ในการเชื่อมต่อและส่งข้อมูล จอแสดงผลจะใช้ขั้วต่อ 8 แถวคู่ขนานกัน แต่ละพินจะถูกทำเครื่องหมายไว้ที่ด้านหลังของจอแสดงผล


ดังที่ได้กล่าวไปแล้วหมุดนั้นเชื่อมต่อกันแบบขนานกัน ข้อมูลเกี่ยวกับวัตถุประสงค์ของตัวเชื่อมต่อแต่ละตัวมีดังต่อไปนี้


โภชนาการ

คุณสังเกตเห็นแล้วว่าจอแสดงผล LCD 5110 มีขั้วต่อสายไฟสองตัว สิ่งแรกคือสิ่งที่สำคัญที่สุด - การขับเคลื่อนตรรกะในการแสดงผล เอกสารข้อมูลระบุว่าควรเลือกในช่วง 2.7 - 3.3 V ในการทำงานปกติ จอแสดงผลจะใช้ 6 ถึง 7 mA

ขั้วต่อสายไฟอันที่สองใช้สำหรับไฟแบ็คไลท์ของจอแสดงผล หากคุณถอดจอแสดงผลออกจากบอร์ด (ไม่จำเป็นคุณสามารถดูภาพด้านล่างได้) คุณจะเห็นว่ามีการใช้แบ็คไลท์อย่างง่ายดาย: ไฟ LED สีขาวสี่ดวงซึ่งอยู่ที่มุมของบอร์ด โปรดทราบว่าไม่มีตัวต้านทานจำกัดกระแส


ดังนั้นคุณต้องระวังเรื่องอาหารให้มากขึ้น คุณสามารถใช้ตัวต้านทานจำกัดกระแสเมื่อเชื่อมต่อพิน "LED" หรือใช้แรงดันไฟฟ้าสูงสุด 3.3 V อย่าลืมว่า LED สามารถดูดซับกระแสสูงได้! พวกเขาจะดึงกระแสประมาณ 100 mA ที่แรงดันไฟฟ้า 3.3 V โดยไม่มีข้อจำกัด

อินเตอร์เฟซการควบคุม

จอแสดงผลมีตัวควบคุมในตัว: Philips PCD8544 ซึ่งแปลงอินเทอร์เฟซแบบขนานขนาดใหญ่ให้เป็นอนุกรมที่สะดวกยิ่งขึ้น PCD8544 ถูกควบคุมโดยใช้โปรโตคอลอนุกรมแบบซิงโครนัสซึ่งคล้ายกับ SPI โปรดทราบว่ามีพินตัวนับเวลา (SCLK) และพินอินพุตข้อมูลอนุกรม (DN) รวมถึงการเลือกชิปที่ใช้งานต่ำ (SCE)

เหนือตัวเชื่อมต่อแบบอนุกรมที่พิจารณาจะมีการติดตั้งตัวเชื่อมต่ออื่น - D / C ซึ่งได้รับข้อมูลว่าสามารถแสดงข้อมูลที่ถูกส่งได้หรือไม่

สำหรับรายการคำสั่ง โปรดดูส่วน “คำแนะนำ” ของเอกสารข้อมูล PCD8544 (หน้า 11) มีคำสั่งล้างหน้าจอ, กลับพิกเซล, ปิดเครื่อง ฯลฯ

การประกอบและเชื่อมต่อจอแสดงผล 5110

ก่อนที่จะอัปโหลดร่างและถ่ายโอนข้อมูลไปยังจอแสดงผล คุณต้องเข้าใจการเชื่อมต่อก่อน ในการทำเช่นนี้คุณต้องแก้ไขปัญหาในการประกอบและเชื่อมต่อกับ Arduino

การประกอบ

หากต้องการ "ประกอบ" จอแสดงผล คุณอาจต้องใช้ขั้วต่อ 8 ชิ้นก็เพียงพอแล้ว คุณสามารถใช้ขาตรงหรือขา 90 องศาก็ได้ ขึ้นอยู่กับการใช้งานต่อไป หากคุณวางแผนที่จะใช้แผงวงจร รางที่มีขั้วต่อตรงน่าจะเป็นตัวเลือกที่ดีที่สุด

จอแสดงผล LCD จาก Nokia 5110 ติดตั้งบนแผงวงจรขนาดเล็ก:


คุณยังสามารถบัดกรีอะแดปเตอร์เข้ากับจอแสดงผลได้โดยตรง

การเชื่อมต่อจอแสดงผล 5110 กับ Arduino

ในตัวอย่างนี้ เราจะเชื่อมต่อจอแสดงผล LCD เข้ากับ Arduino เทคนิคที่คล้ายกันนี้สามารถนำไปปรับใช้กับบอร์ดและไมโครคอนโทรลเลอร์อื่นๆ ได้อย่างง่ายดาย ในการเชื่อมต่อพินการถ่ายโอนข้อมูล - SCLK และ DN(MOSI) - เราใช้พิน Arduino SPI ซึ่งให้การถ่ายโอนข้อมูลที่รวดเร็ว พินการเลือกชิป (SCE) รีเซ็ต (RST) และพินข้อมูล/การควบคุม (D/C) สามารถเชื่อมต่อกับพินดิจิทัลใดก็ได้ เอาต์พุตจาก LED เชื่อมต่อกับพินบน Arduino ซึ่งรองรับการปรับ PWM ด้วยเหตุนี้ จึงสามารถปรับความสว่างของแบ็คไลท์ได้อย่างยืดหยุ่น

น่าเสียดายที่แรงดันไฟฟ้าสูงสุดของจอแสดงผล 5110 สูงถึง 3.6 โวลต์ ดังนั้นจึงไม่สามารถเชื่อมต่อโดยตรงกับเอาต์พุตมาตรฐาน 5 V บน Arduino ได้ จำเป็นต้องปรับแรงดันไฟฟ้า ดังนั้นจึงมีตัวเลือกการเชื่อมต่อหลายอย่างปรากฏขึ้น

การเชื่อมต่อโดยตรงกับ Arduino

ตัวเลือกที่ง่ายที่สุดคือการเชื่อมต่อกับ Arduino โดยตรง ในกรณีนี้คุณต้องใช้ บอร์ด Arduinoโปร 3.3V/8MHz หรือ 3.3V Arduino Pro Mini


ตัวเลือกที่นำเสนอด้านล่างใช้งานได้กับบอร์ด Arduino 5V นี่เป็นตัวเลือกที่ใช้งานได้ แต่อายุการแสดงผลอาจลดลงเล็กน้อย


หมุดเชื่อมต่อดังนี้: ตัวเลือกที่ดีและราคาไม่แพงในการป้องกันเพิ่มเติมคือการติดตั้งตัวต้านทานระหว่างพินข้อมูลจาก Arduino กับ LCD 5110 หากคุณใช้อาร์ดูโน่ อูโน่


การเชื่อมต่อจะเหมือนกับในตัวอย่างแรก แต่มีการติดตั้งตัวต้านทานในแต่ละวงจรสัญญาณ มีการติดตั้งตัวต้านทาน 10 kOhm ระหว่างพิน SCLK, DN, D/C และ RST ตัวต้านทาน 1 kOhm อยู่ระหว่างพิน SCE และพิน 7 ส่วน 330 โอห์มยังคงอยู่ระหว่างพิน 9 และพินที่มี LED และพิน 7

ตัวแปลงระดับ

ตัวเลือกการเชื่อมต่อที่สามคือการใช้ตัวแปลงระดับเพื่อสลับระหว่าง 5 และ 3.3 V เพื่อวัตถุประสงค์เหล่านี้ คุณสามารถใช้ตัวแปลงระดับลอจิกแบบสองทิศทางหรือโมดูล TXB0104


น่าเสียดายที่มีอินพุตห้าช่องสำหรับสัญญาณ 3.3 V บนจอแสดงผลและสี่ช่องบนตัวแปลงระดับ คุณสามารถปล่อยให้เอาต์พุต RTS อยู่ในระดับสูงได้ (โดยเชื่อมต่อโดยใช้ตัวต้านทาน 10k โอห์ม) ด้วยเหตุนี้ คุณจะไม่สามารถควบคุมวิธีการรีบูตจอแสดงผลได้อีกต่อไป แต่ฟังก์ชันอื่นๆ ทั้งหมดจะใช้งานได้

ตัวอย่างร่าง Arduino แรก: การสาธิต LCD

หลังจากการเชื่อมต่อสำเร็จ คุณสามารถดำเนินการดาวน์โหลดภาพร่างและแสดงข้อมูลบนจอแสดงผลได้!

โปรแกรมสำหรับ Arduino

ความคิดเห็นในโค้ดด้านบนจะช่วยให้คุณเข้าใจโปรแกรมได้ การดำเนินการส่วนใหญ่เกิดขึ้นภายในฟังก์ชัน lcdFunTime()

ร่างในการดำเนินการ

หลังจากอัปโหลดไปยัง Arduino แล้ว ภาพร่างจะเริ่มทำงานและเปิดตัวการสาธิต - ชุดภาพเคลื่อนไหวมาตรฐานและการทดสอบฟังก์ชันกราฟิก ก่อนอื่น เรามาแสดงพิกเซลกันก่อน หลังจากนั้น เราจะไปยังการแสดงเส้น สี่เหลี่ยม และวงกลม การโหลดบิตแมป ฯลฯ


หลังจากเสร็จสิ้นการร่างภาพแล้ว จอภาพจะสลับไปที่โหมดการถ่ายโอนข้อมูลผ่านโปรโตคอลแบบอนุกรม เปิดมอนิเตอร์แบบอนุกรม (ด้วยอัตรารับส่งข้อมูล 9600 bps) สิ่งที่คุณพิมพ์บนจอภาพแบบอนุกรมจะปรากฏบนจอภาพ LCD

หากคุณสนใจความสามารถในการแสดงภาพแรสเตอร์ โปรดอ่านต่อ เราจะมาดูกันว่าคุณสามารถนำเข้าภาพบิตแมป 84x48 ของคุณเองและแสดงบนหน้าจอได้อย่างไร

ตัวอย่างที่สอง ร่าง Arduino: การโหลดและการแสดงบิตแมป

ในตัวอย่างนี้ เราจะสร้างบิตแมป 84x48 ใหม่ รวมเข้ากับโค้ด Arduino และส่งไปยังจอภาพ LCD


ค้นหา/สร้าง/เปลี่ยนบิตแมป

ขั้นแรก ค้นหาภาพที่คุณต้องการแสดงบนหน้าจอ LCD 5110 คุณจะไม่สามารถขยายเป็น 84x48 พิกเซลได้มากนัก แต่ก็ยังสามารถทำได้ นี่คือตัวอย่างบางส่วน:

หลังจากเลือกรูปภาพแล้ว คุณต้องแก้ไข: ทำให้เป็นขาวดำ (สี 2 บิต); คงขนาด 84x48 พิกเซลไว้ คุณสามารถใช้โปรแกรมแก้ไขรูปภาพส่วนใหญ่สำหรับสิ่งนี้ รวมถึง Paint หากคุณมี Windows บันทึกภาพที่ได้

การแปลงบิตแมปเป็นอาร์เรย์

ขั้นตอนต่อไปคือการแปลงไฟล์นี้เป็นอาร์เรย์อักขระขนาด 504 ไบต์ คุณสามารถใช้โปรแกรมต่างๆได้ ตัวอย่างเช่น ผู้ช่วย LCD

หากต้องการโหลดรูปภาพลงใน LCD Assistant ให้ไปที่ไฟล์ > โหลดรูปภาพ หน้าต่างที่มีภาพตัวอย่างควรเปิดขึ้น ตรวจสอบให้แน่ใจว่ารูปภาพมีขนาดที่ถูกต้อง - กว้าง 84 พิกเซล สูง 48 พิกเซล และตั้งค่าการวางแนวไบต์เป็นแนวตั้ง ความกว้างของขนาดเป็นเล็ก การตั้งค่าเริ่มต้นที่เหลือควรตั้งค่าให้ถูกต้อง (8 พิกเซล/ไบต์)

หลังจากนี้ ไปที่แท็บ ไฟล์ > บันทึกเอาต์พุต เพื่อสร้างไฟล์ข้อความชั่วคราว เปิดไฟล์ข้อความนี้เพื่อดูอาร์เรย์ใหม่ที่ยอดเยี่ยมของคุณ เปลี่ยนประเภทอาร์เรย์เป็นถ่าน (ไม่ใช่ไม่ได้ลงนามหรือ const) ตรวจสอบให้แน่ใจว่าตั้งชื่ออาร์เรย์อย่างถูกต้อง (ไม่มีขีดกลาง ไม่ขึ้นต้นด้วยตัวเลข ฯลฯ)

นำเข้าสู่ร่างและวาด!

คัดลอกอาร์เรย์ที่สร้างขึ้นลงในร่าง Arduino คุณสามารถใช้แบบร่างจากตัวอย่างแรกได้ วางอาร์เรย์ของคุณไว้ที่ใดก็ได้ ตอนนี้ หากต้องการแสดงภาพร่างของคุณ ให้แทนที่ setup() และ loop() ในภาพร่างของคุณด้วยเส้นด้านล่าง (คงฟังก์ชันและตัวแปรอื่นๆ ไว้เหมือนเดิม):

// ...ตัวแปร ค่าคงที่ และอาร์เรย์บิตแมปถูกกำหนดไว้ด้านบน

จอแอลซีดีเริ่มต้น(); // การตั้งค่าพินและการเริ่มต้นจอแสดงผล LCD

ตั้งค่าคอนทราสต์ (60); // ปรับความคมชัด (ช่วงที่ต้องการคือ 40 ถึง 60)

setBitmap(เปลวไฟบิตแมป); //flameBitmap ควรถูกแทนที่ด้วยชื่ออาร์เรย์ของคุณ

อัพเดตดิสเพลย์(); //อัพเดตการแสดงผลเพื่อแสดงอาเรย์

// ฟังก์ชั่นสำหรับการควบคุมและกราฟิกบนจอ LCD มีการกำหนดไว้ด้านล่าง...

มันเจ๋งจริงเหรอ? เหนือสิ่งอื่นใด คุณสามารถนำเข้าภาพหลายภาพและสร้างภาพเคลื่อนไหวขนาดเล็กได้! ลองมันฉันแน่ใจว่าคุณจะชอบมัน!

ลิงค์สำหรับดาวน์โหลดโปรแกรม ไลบรารี และเอกสารข้อมูลทางเทคนิคเพิ่มเติม

เอกสารข้อมูลสำหรับจอแสดงผล LCD และไดรเวอร์
  • เอกสารข้อมูล LCD – ไม่เหมือนกับ 5110 ทุกประการ แต่มีสเป็คคล้ายกันมาก
ไลบรารีและภาพร่างของ Arduino
  • PCD8544 Arduino Library - ไลบรารีสำหรับ Arduino ทำงานพร้อมไดรเวอร์ LCD PCD8544
โปรแกรมสำหรับสร้างภาพแรสเตอร์
  • TheDotFactory – เครื่องมือที่ยอดเยี่ยมสำหรับการสร้างอาร์เรย์แบบอักษรที่กำหนดเอง

แสดงความคิดเห็น คำถาม และแบ่งปันประสบการณ์ส่วนตัวของคุณด้านล่าง แนวคิดและโครงการใหม่ ๆ มักเกิดในการสนทนา!

บทความใหม่

● โครงการ 16: ตัวบ่งชี้กราฟิก การเชื่อมต่อ จอแสดงผลโนเกีย 5110

ในการทดลองนี้ เราจะดูที่จอแสดงผลกราฟิก Nokia 5110 ซึ่งสามารถใช้ในโปรเจ็กต์ Arduino เพื่อแสดงข้อมูลกราฟิก

ส่วนประกอบที่จำเป็น:

จอแสดงผลคริสตัลเหลว Nokia 5110 เป็นจอแสดงผลขาวดำที่มีความละเอียด 84×48 บนตัวควบคุม PCD8544 ซึ่งออกแบบมาเพื่อแสดงข้อมูลกราฟิกและข้อความ แหล่งจ่ายไฟของจอแสดงผลควรอยู่ระหว่าง 2.7-3.3 V (สูงสุด 3.3 V หากจ่าย 5 V ให้กับพิน VCC จอแสดงผลอาจเสียหาย) แต่พินคอนโทรลเลอร์นั้นทน +5V จึงสามารถเชื่อมต่อโดยตรงกับอินพุต Arduino จุดสำคัญคือการสิ้นเปลืองพลังงานต่ำซึ่งช่วยให้คุณสามารถจ่ายไฟให้กับจอแสดงผลจากบอร์ด Arduino โดยไม่ต้องใช้แหล่งพลังงานภายนอก
แผนภาพการเชื่อมต่อสำหรับ Nokia 5110 กับ Arduino แสดงในรูปที่ 1 16.1.

ข้าว. 16.1. แผนภาพการเชื่อมต่อสำหรับ Nokia 5110 กับ Arduino

ในการทำงานกับจอแสดงผล Nokia 5110 เราจะใช้ไลบรารี Adafruit_GFX ซึ่งมีความสามารถมากมายในการแสดงกราฟิกและข้อความ ในการทดลองของเรา เราจะได้รับข้อมูลการส่องสว่างจากโฟโตรีซีสเตอร์ที่เชื่อมต่อกับอินพุตอะนาล็อกของ Arduino A0 และส่งออกข้อมูลการส่องสว่างในรูปแบบตัวเลขและกราฟิก แผนภาพการเชื่อมต่อแสดงในรูปที่ 1 16.2.

ข้าว. 16.2. แผนภาพการเชื่อมต่อของ Nokia 5110 และโฟโตรีซีสเตอร์กับ Arduino

รหัสสำหรับร่างการทดลองของเราแสดงอยู่ในรายการ 16.1 เราอ่านข้อมูลจากโฟโตรีซีสเตอร์และแสดงค่าตัวเลข รวมทั้งในรูปแบบกราฟิก (แถบความคืบหน้า) ค่าความสว่างเป็นเปอร์เซ็นต์ของค่าสูงสุด เราใช้ค่าการส่องสว่างขั้นต่ำและสูงสุดจากการทดลองที่ 13

// เชื่อมต่อห้องสมุด #รวม #รวม // PIN 7 - RST Pin 1 บน LCD // PIN 6 - CE Pin 2 บน LCD // PIN 5 - DC Pin 3 บน LCD // PIN 4 - DIN Pin 4 บน LCD // PIN 3 - CLK Pin 5 บน LCD จอแสดงผล Adafruit_PCD8544 = Adafruit_PCD8544(3, 4, 5, 6, 7); cont int LIGHT=A0; // ปักหมุด A0 สำหรับอินพุตโฟโตรีซิสเตอร์ค่าคงที่ MIN_LIGHT=200 ; // เกณฑ์การส่องสว่างต่ำกว่าค่าคงที่ MAX_LIGHT=900 ; // เกณฑ์การส่องสว่างด้านบน // ตัวแปรสำหรับการจัดเก็บข้อมูลโฟโตรีซีสเตอร์อินท์ val1,val2 = 0 ; การตั้งค่าเป็นโมฆะ ()(display.begin(); // ตั้งค่าความคมชัดของพื้นหลังหน้าจอ // พารามิเตอร์ที่สำคัญมาก! display.setContrast (60); display.clearDisplay(); //เคลียร์หน้าจอล่าช้า (2000); - เป็นโมฆะวน()( val1 = อะนาล็อกอ่าน(LIGHT); // อ่านการอ่านค่าโฟโตรีซิสเตอร์ DrawText(val1,1); // แสดงข้อความ // ปรับค่าโพเทนชิออมิเตอร์เป็น 0-75 val2= แผนที่ (val1, MIN_LIGHT, MAX_LIGHT, 0 , 75 ); // ส่งออกสี่เหลี่ยมสีดำเป็น % display.fillRect(5, 25, val2, 10, 1); // ส่งออกส่วนสีขาวของสี่เหลี่ยม display.fillRect(5 +val2,25 , 75 -val2, 10 , 0 ); display.display(); ล่าช้า (1,000); // หยุดชั่วคราวก่อนการวัดใหม่ DrawText(val1,2); // ลบข้อความ) // ขั้นตอนการส่งออกข้อความ เป็นโมฆะ DrawText ( ตัวเลขยาวที่ไม่ได้ลงชื่อ, int color)( display.setTextSize(2); // ขนาดตัวอักษร display.setCursor(20,5); // ตำแหน่งเคอร์เซอร์ถ้า (สี==1 ) display.setTextColor(สีดำ); // พิมพ์ค่าอื่น display.setTextColor (สีขาว); // ลบ (ขาวบนพื้นขาว) display.print(หมายเลข); -
ลำดับการเชื่อมต่อ:

1. เชื่อมต่อเซ็นเซอร์จอแสดงผล Nokia 5110 และโฟโตรีซีสเตอร์ตามแผนภาพในรูป 16.2.
2. โหลดแบบร่างจากรายการ 16.1 ลงบนบอร์ด Arduino
3. ใช้มือปิดกั้นการไหลของแสง ดูการเปลี่ยนแปลงของการอ่านค่าความสว่างบนหน้าจอแสดงผล

รายการโปรแกรม

ก่อนหน้านี้ในบล็อกนี้ได้กล่าวถึงจอแสดงผล/ตัวบ่งชี้ LCD หลายตัวและการใช้งานจาก Arduino ข้อเสียเปรียบที่สำคัญคือขนาดและน้ำหนักค่อนข้างใหญ่ บ่อยครั้งนี่ไม่ใช่ปัญหา ตัวอย่างเช่น หากคุณกำลังประกอบสถานีบัดกรีแบบ DIY ในกล่องทำเอง ไม่ว่าจอแสดงผลจะมีขนาดเท่าใดก็ตาม ในทางกลับกัน หากคุณต้องการใช้จอแสดงผล เช่น quadcopter น้ำหนักและขนาดก็มีความสำคัญ ดังนั้นวันนี้เราจะมาเรียนรู้วิธีการทำงานกับหน้าจอที่เล็กและเบามากจากโทรศัพท์ Nokia 5110

บันทึก:โพสต์อื่นๆ ในหัวข้อหน้าจอ - เรียนรู้การแสดงข้อความบนตัวบ่งชี้ LCD จาก Arduino เกี่ยวกับการใช้หน้าจอ 1602 ด้วยอะแดปเตอร์ I2C การทำงานกับ LCD ที่ใช้ HD44780 โดยไม่มีไลบรารี และเครื่องวัดอุณหภูมิแบบดิจิตอลจากเมทริกซ์ LCD, TMP36 และ Arduino

ไม่ต้องกังวล คุณจะไม่ต้องซื้อ Nokia 5110 ซึ่งไม่มีอยู่จริงในปัจจุบัน เพียงเลือกหน้าจอแล้วทิ้งส่วนอื่นๆ ทั้งหมด หน้าจอ Nokia 5110 เป็นโมดูลแบบสแตนด์อโลนทั่วไปสำหรับนักวิทยุสมัครเล่น และมีราคาตั้งแต่ 2 ถึง 5 ดอลลาร์ ขึ้นอยู่กับร้านค้า ในรัสเซียสามารถซื้อโมดูลได้เช่นบน tpai.ru arduino-kit.ru, amperkot.ru, compacttool.ru, chipster.ru หรือ electromicro.ru และแน่นอนว่าหน้าจอขายในราคาต่ำสุดใน AliExpress แต่คุณจะต้องรอหนึ่งหรือสองเดือนจนกว่าสินค้าจะมาถึงจากจีน

ดังที่มักเกิดขึ้นในโลก Arduino มีไลบรารีสำเร็จรูปสำหรับโมดูลอยู่แล้วและมีมากกว่าหนึ่งแห่ง ฉันชอบไลบรารี LCD5110 ที่โพสต์บนเว็บไซต์ rinkydinkelelectronics.com ไลบรารีนี้มีสองเวอร์ชัน อันแรกเรียกว่า LCD5110_Basic ง่ายกว่าและสามารถแสดงเฉพาะข้อความในแบบอักษรที่มีขนาดต่างกันเท่านั้น สามารถสร้างแบบอักษรของคุณเองได้ รุ่นที่สองเรียกว่า LCD5110_Graph มีความสามารถทั้งหมดของไลบรารี่แรก และนอกจากนั้น ยังสามารถวาดส่วน สี่เหลี่ยม วงกลม และอื่น ๆ ได้อีกด้วย

เพื่อจุดประสงค์ของโพสต์นี้ เราจะใช้ LCD5110_Basic ไลบรารีทั้งสองมีเอกสารอย่างดีและมีตัวอย่างการใช้งานมากมาย ดังนั้นหากคุณต้องการ LCD5110_Graph คุณก็สามารถแก้ไขได้ด้วยตัวเอง อย่างไรก็ตาม เป็นที่น่าสังเกตว่าเพื่อให้ LCD5110_Basic คอมไพล์โดยไม่มีคำเตือน ฉันต้องทำการแก้ไขโค้ดเล็กน้อยเล็กน้อย

ตัวอย่างการใช้ห้องสมุด:

#รวม

ภายนอก uint8_t BigNumbers ;
ภายนอก uint8_t MediumNumbers ;
ภายนอก uint8_t SmallFont ;

/* SCK / CLK, MOSI / DIN, DC, RST, CS */
จอแอลซีดี5110(2, 3, 4, 6, 5);

การตั้งค่าเป็นโมฆะ ()
{
จอแอลซีดี.InitLCD();
}

intctr = 0 ;
เป็นโมฆะวน()
{
จอแอลซีดี.clrScr();

Lcd.setFont(ตัวเลขขนาดใหญ่) ;
lcd.printNumI(ctr, ขวา, 0);

Lcd.setFont(ตัวเลขปานกลาง) ;
lcd.printNumF(12.34, 2, ขวา, 24);

จอแอลซีดี setFont(SmallFont) ;
lcd.print ("บรรทัด 1" , 0 , 8 * 0 ) ;
lcd.print("บรรทัด 2", 0, 8 * 1);
lcd.print ("บรรทัด 3" , 0 , 8 * 2 ) ;
จอแอลซีดีพิมพ์ ("L 4" , 0 , 8 * 3 ) ;
จอแอลซีดีพิมพ์ ("L 5" , 0 , 8 * 4 ) ;
จอแอลซีดีพิมพ์ ("0123456789ABCD" , 0 , 8 * 5 ) ;

ศูนย์กลาง + = 5 ;
ถ้า (ctr >= 1,000 )
ctr = 0 ;

ความล่าช้า(500);
}

ดูเหมือนว่าในทางปฏิบัติ:

ฉันหวังว่าจะไม่จำเป็นต้องเคี้ยวรหัส โปรดทราบว่าโมดูลนี้ใช้พลังงานจาก 3.3 V แต่สามารถเข้าใจคำสั่งจาก Arduino ได้ตามปกติ โดยไม่ต้องใช้ตัวแปลงระดับลอจิก ดังนั้นเราจึงเชื่อมต่อพิน VCC (กำลังไฟ) และ BL (แบ็คไลท์) เข้ากับ 3.3 V เชื่อมต่อ GND เข้ากับกราวด์ และเชื่อมต่อพินห้าพินที่เหลือเข้ากับพินดิจิทัล Arduino เราส่งหมายเลขพินไปยังตัวสร้างคลาส LCD5110 ตามความคิดเห็นในโค้ดที่กำหนด

ง่ายใช่มั้ย? คุณสามารถค้นหาซอร์สโค้ดแบบเต็มสำหรับโพสต์นี้ได้ในพื้นที่เก็บข้อมูล GitHub นี้ ยินดีต้อนรับการเพิ่มเติมและคำถามเช่นเคย

ส่วนที่เพิ่มเข้าไป:ผู้เขียนไลบรารีสำหรับการทำงานกับหน้าจอ Nokia 5110 ยังเป็นผู้เขียนไลบรารี OLED_I2C ซึ่งออกแบบมาเพื่อทำงานกับหน้าจอ OLED ที่ได้รับความนิยมไม่แพ้กันพร้อมอินเทอร์เฟซ I2C คุณสามารถดูตัวอย่างการใช้ OLED_I2C ได้ในโพสต์ การใช้จอยสติ๊ก Sega Genesis ในโครงการ Arduino อย่างที่คุณคาดหวัง ไลบรารีทั้งสองมีอินเทอร์เฟซที่คล้ายกัน