Arduino countdown 7Segment
หลังจากที่ได้คำแนะนำจากพี่ไทร และลองเปิดอ่านจากTextเพิ่มเติมดูแล้วก้ได้ลองมาออกแบโปรแกรมนับถอยหลัง 100 sec (99-00)
Plan&Do:
เนื่องจากการที่เราจะสั่งให้เลขทั้งสองหลัปรากฏขึ้นมาพร้อมกันเป้นคนลตัวเลขได้นั้นทำได้ค่อนข้างยาก(อาจะทำได้แต่ผมไม่รู้วิธีในแบบนี้) ผมจึงลองใช้โจทย์จากอันที่แล้วใน Arduino note 13/3/15 ที่ทำให้ไฟกระพริบด้วยความถี่ที่เร็วขึ้นจนเรามองเห็นว่ามันแสดงผลพร้อมกัน โดยผมกำหนดให้ความถี่ในการกระพริบในdelay() มีค่า 5 ms ทั้งหลักหน่วยและหลักสิบ จากนั้นสร้างfor ครอบัวเลขสองหลักสั่งให้ลูป100ครั้ง ดั้งนั้นตอนนี้เราจะได้เลขสองหลักที่ทำงานแสดงผล 1 secondเช่น
for(int i=0;i<100;i++)
{
digitalWrite(a, 0);
digitalWrite(b, 0);
digitalWrite(c, 0);
digitalWrite(d,0);
digitalWrite(e, 1);
digitalWrite(f, 1);
digitalWrite(g,0);
digitalWrite(h, 0);
digitalWrite(5,1);
digitalWrite(4,1);
digitalWrite(A2,0);
delay(5);
digitalWrite(a, 1);
digitalWrite(b, 1);
digitalWrite(c, 1);
digitalWrite(d,1);
digitalWrite(e, 1);
digitalWrite(f, 1);
digitalWrite(g,0);
digitalWrite(h, 0);
digitalWrite(5,1);
digitalWrite(4,0);
digitalWrite(A2,1);
delay(5);
}
เมื่อcomplied ก็จมีเลขแสดงผลเป็น 1กับ 0นาน1วินาที [( 5 ms + 5 ms ) x 100 round = 1000 ms = 1 s]
และเมื่อผมลองทำเล่นๆไปได้10จำนวน ก็พบกับปัญหาคือcodeมีขนาดใหญ่มาก ข้อมูลติดกันเป็นพืดๆ ผมจึงลองเขียนfunctionขึ้นมาๅอันเป้นแบบนี้
void number(int n)
{
switch(n)
{
case 0:
digitalWrite(a, 1);
digitalWrite(b, 1);
digitalWrite(c, 1);
digitalWrite(d,1);
digitalWrite(e, 1);
digitalWrite(f, 1);
digitalWrite(g,0);
digitalWrite(h, 0);
break;
case 1:
digitalWrite(a, 0);
digitalWrite(b, 0);
digitalWrite(c, 0);
digitalWrite(d,0);
digitalWrite(e, 1);
digitalWrite(f, 1);
digitalWrite(g,0);
digitalWrite(h, 0);
break;
case 2:
digitalWrite(a, 1);
digitalWrite(b, 1);
digitalWrite(c, 0);
digitalWrite(d,1);
digitalWrite(e, 1);
digitalWrite(f, 0);
digitalWrite(g,1);
digitalWrite(h, 0);
break;
case 3:
digitalWrite(a, 1);
digitalWrite(b, 0);
digitalWrite(c, 0);
digitalWrite(d,1);
digitalWrite(e, 1);
digitalWrite(f, 1);
digitalWrite(g,1);
digitalWrite(h, 0);
break;
.
.
.
,
}
และเมื่อลองเรียกใช้ก็สามารถทำงานได้เช่นกัน ซึ่งในการเรียกใช้functionตัวนี้ต้อง เขียนด้วย
number(จำนวนที่ต้องการให้ปรากฏในSegmentนั้นๆ);
สมติว่าประกาศ
number(3);
เมื่อรันดปรแกรมส่วนที่นำมาใช้แทนจริงๆคือ
case 3:
digitalWrite(a, 1);
digitalWrite(b, 0);
digitalWrite(c, 0);
digitalWrite(d,1);
digitalWrite(e, 1);
digitalWrite(f, 1);
digitalWrite(g,1);
digitalWrite(h, 0);
break;
หลังจากเขียนfunction number();เสร้จผมก้ลองร่างๆดูว่าจำนวน99-00 มีdisplayที่แสดงออกมาเป้นอะไรบ้าง และเริ่มวาดส่วนประกอบต่างๆของโปรแกรม ในกระดาษทด จากนั้นก็ลองพิมพ์ที่คิดไว้ออกมาเป็นcodeจริงๆ
อธิบาย: 1.สร้างfunction number(); ซึ่งใช้ให้เป็นแสดงค่าเลขdisplayของSegment โดยฟังก์ชั่นจะทำงานก็ต่อเมื่อมีค่ารับเข้ามา และนำค่านั้นไปเลือกแสดงผลของ switch case ดังรูป
2.สร้างfunction digit(); และ tens();ไว้เป็นตัวกำหนดหลักของSegment
3. ในส่วน void setup() ให้กำหนดค่าpinของ7Segmentลงไป(อย่าลืมใส่ค่าpinของหลักsegmentด้วย)
4.ต่อมาในส่วนvoid loop() ให้สร้างloop ใหญ่ที่ใช้เป็นตัวกำหนดค่า99-00 ด้วยfor(int k=99;k>=0;k--)
5.checkค่าkด้วยif และกำหนดเงื่อนไขว่าถ้าk<10 จริงให้เลขฝั่งซ้ายเป้น0และเลขฝั่งขวาเท่ากับkเลย => if(k<10)
{
right=0;
left=k;
}
6.กำหนดเงื่อนไขที่ k เป็นอย่างอื่นและเป็นจริงให้เลขฝั่งซ้ายหารเอาเศษ และเลขฝั่งขวาหารเอาจำนวนเต็ม => else
{
right=k%10; //การหารเอาเศษ modulo
left=k/10;
}
7.สร้างloopที่ใช้แสดงผลตัวเลข 99-00 โดยการนำเอาตัวแปร left และ rightแทนใน function ของ number();โดย ใช้คำสั่ง
for(int i=0;i<100;i++)
{
number(left);
tens();
number(right);
digit();
}
8.complied program และตรวจสอบdisplay ว่าได้ตามที่โจทย์ต้องการมั้ย?
ไม่มีความคิดเห็น:
แสดงความคิดเห็น