วันจันทร์ที่ 16 มีนาคม พ.ศ. 2558

Arduino countdown 7Segment

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 ว่าได้ตามที่โจทย์ต้องการมั้ย?

ไม่มีความคิดเห็น:

แสดงความคิดเห็น