สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ทุกครั้งที่ฉันเห็นปุ่มกด มันมาพร้อมกับหมุดจำนวนมาก เป็นการสิ้นเปลืองหมุด Arduino ของคุณครั้งใหญ่ ดังนั้นเราจะเรียกใช้แป้นพิมพ์ด้วยขาเดียวและขาเดียวได้หรือไม่.คำตอบอยู่ที่นี่
ขั้นตอนที่ 1: รายการวัสดุ
ฮาร์ดแวร์:
01 Arduino UNO
02 เขียงหั่นขนม
01 LCD พร้อม I2C
16 ปุ่มกด
04 ตัวต้านทาน 1.5 kΩ
04 ตัวต้านทาน 620 Ω
04 ตัวต้านทาน 220 Ω
08 ตัวต้านทาน 100 Ω
01 ตัวต้านทาน 1 kΩ
07 สายจัมเปอร์
ซอฟต์แวร์:
Arduino IDE ติดตั้งบนพีซีของคุณ
ขั้นตอนที่ 2: แผนผังและ Cicruit
แนวคิดทั้งหมดคือเรามีปุ่มกด 4*4 เมทริกซ์ที่เชื่อมต่อในแนวตั้งกับกราวด์ด้วยตะกั่วที่ถูกต้อง และในแนวนอนโดยตะกั่วอีกอัน (ตะกั่วของปุ่ม) และตัวต้านทาน 1.5 kΩ, 620Ω, 220Ω และ 100Ω ที่ปลาย 4 แถวเชื่อมต่อกันด้วยตัวต้านทาน100Ωสี่ตัวดังที่แสดงในแผนผัง
ทุกครั้งที่คุณกดปุ่ม คุณจะปิดวงจรและกระแสจะไหลผ่านเส้นทางที่แตกต่างกันและสายของตัวต้านทานที่แตกต่างกัน นั่นเป็นสาเหตุที่พิน A0 ได้รับการอ่านแบบอะนาล็อกที่แตกต่างกันสำหรับทุกๆ ปุ่มกด สิ่งที่คุณต้องการตอนนี้คือการเข้ารหัส
ขั้นตอนที่ 3: รหัส
#รวม
#รวม
LiquidCrystal_I2C จอแอลซีดี (0x3f, 20, 4);
ปุ่ม int = A0;
ค่าการอ่าน int;
การตั้งค่าเป็นโมฆะ ()
{
Serial.begin(9600);
lcd.begin();
pinMode (ปุ่ม, อินพุต);
LCD.backlight();
lcd.print("สวัสดีชาวโลก");
ล่าช้า (2000);
lcd.clear();
lcd.print("ปุ่มกด 4*4 หนึ่งพิน");
ล่าช้า (2000); }
วงเป็นโมฆะ ()
{
readvalue = analogRead (ปุ่ม);
Serial.println (ค่าอ่าน);
ถ้า (readvalue==852){lcd.clear();lcd.print("A");}
อื่น{ if (readvalue==763){lcd.clear();lcd.print("B");}
อื่น{ if (readvalue==685){lcd.clear();lcd.print("C");}
อื่น{ if (readvalue==965){lcd.clear();lcd.print("D");}
อื่น{ if (readvalue==565){lcd.clear();lcd.print("9");}
อื่น{ if (readvalue==614){lcd.clear();lcd.print("6");}
อื่น{ if (readvalue==360){lcd.clear();lcd.print("3");}
อื่น{ if (readvalue==335){lcd.clear();lcd.print("#");}
อื่น{ if (readvalue==396){lcd.clear();lcd.print("8");}
อื่น{ if (readvalue==349){lcd.clear();lcd.print("5");}
อื่น{ if (readvalue==235){lcd.clear();lcd.print("2");}
อื่น{ if (readvalue==279){lcd.clear();lcd.print("0");}
อื่น{ if (readvalue==452){lcd.clear();lcd.print("7");}
อื่น{ if (readvalue==271){lcd.clear();lcd.print("4");}
อื่น{ if (readvalue==170){lcd.clear();lcd.print("1");}
อื่น{ if (readvalue==92){lcd.clear();lcd.print("*");}else{}}}}}}}}}}}}}}}}}}
ขั้นตอนที่ 4: การแก้ไขค่า
เมื่อคุณเปิดมอนิเตอร์ซีเรียล มันจะแสดงค่า 1023 หากคุณกดปุ่ม มันจะให้การอ่านอีกครั้ง คุณต้องใช้ค่าเหล่านั้นและทำการเปลี่ยนแปลงบางอย่างในโค้ด
ขั้นตอนที่ 5: โครงการหลังการวิพากษ์วิจารณ์และทบทวน
ไม่ต้องสงสัยเลยว่าเราทั้งหมดอยู่ที่นี่เพื่อเรียนรู้และแบ่งปันความรู้ของเรา ขอบคุณความคิดเห็นบางส่วนจากชุมชนที่เป็นประโยชน์มาก ฉันตัดสินใจทำการปรับเปลี่ยนและปรับปรุงโครงการของฉัน:
ฮาร์ดแวร์:
ฉันตัดสินใจประสานส่วนประกอบทั้งหมดใน PCB เพื่อหลีกเลี่ยงปัญหาการเชื่อมต่อที่ไม่ดีในเขียงหั่นขนม
รหัส:
เพื่อนแนะนำให้ฉันใช้ซอฟต์แวร์ debouncing และเป็นเพียงการวนซ้ำ (เช่น "for" loop) เพื่อให้โปรแกรมใช้เวลาในการเลือกอ่าน หมายความว่ามีการอ่านจำนวนมาก (500 ในตัวอย่างของฉัน) แต่ต้องใช้เวลา อันสุดท้ายเท่านั้น
สำหรับ (i=1; i<= 500; i++) { // รับเฉพาะ analogread ตัวที่ 500
ค่า = analogRead(ปุ่ม);} // ซึ่งช่วยให้หลีกเลี่ยงการอ่านที่ไม่ดีได้
ขอบคุณเพื่อนอีกคนที่เขาแนะนำให้ฉันเปรียบเทียบ "ค่าที่อ่าน" กับช่วงของค่าที่ไม่ใช่ค่าหนึ่งเพราะ "ค่าที่อ่าน" ใช้ค่าจำนวนมากสำหรับการกดปุ่มเดียวกัน ตัวอย่างเช่น "A" ให้การอ่าน: 849, 850, 851 852, 853, 854, 855 จึงเป็นช่วง 7 ค่า:a threshold (852) และ 3 ค่าซ้ายและขวา สิ่งที่เราต้องทำที่นี่คือการเปรียบเทียบค่าสัมบูรณ์ของความแตกต่างระหว่าง "ค่าที่อ่าน" และ "852" ถึง "3"
if(abs(readvalue-852)<=8){lcd.clear();lcd.print("A");}
ขั้นตอนที่ 6: หลังจากงานบัดกรีบางส่วน
ขั้นตอนที่ 7: ช่วงเวลาแห่งความจริง
อย่างที่คุณเห็น บางครั้งโปรแกรมอาจสร้างความสับสนให้กับปุ่ม แต่ก็ยังใช้งานได้ ตามทฤษฎีแล้ว วงจรไม่ได้มีอะไรผิดปกติ แต่โค้ดต้องการการปรับเทียบเพิ่มเติม
ขั้นตอนที่ 8: จุดจบ
ฉันหวังว่าคุณจะชอบโครงการนี้และพยายามทำมัน บางทีคุณอาจจะทำได้ดีกว่าที่ฉันทำ
ถามฉันหากคุณมีคำถาม แสดงความคิดเห็น และอย่าลืมโหวตให้ฉันหากคุณชอบ