Deryoung Electronics
         arduino lab note
 
Welcome to ... Guest! Not yet Open Comming Soon
ไทย (Thai) | English
| Login

เจาะลึกคำสั่ง delay

  • delayMicroseconds()

คำสั่ง delayMicroseconds() นั้นเป็นการออกคำสั่งเพื่อการทำงานของโปรแกรม เป็นหยุดเวลาในช่วงสั้นๆ อยู่ในระดับไมโครวินาที ซึ่ง 1,000 ไมโครวินาที(us) เท่ากับ 1 มิลลิวินาที (ms) หรือ 1,000,000 ไมโครวินาที เท่ากับ 1 วินาที (s) นั่นเอง

และค่าที่มากสุดในการให้ระยะเวลาที่แม่นยำคือ 16,383 และน้อยสุด คือ 3 ไมโครวินาที ซึ่งเป็นสิ่งสำคัญของนักโปรแกรม ที่จะต้องใส่ใจในการเลือกใช้คำสั่งดังกล่าวให้เหมาะสมกับช่วงเวลาที่ต้องการนั้นด้วย ลองดูชุดคำสั่งต่อไปนี้

//*************************************
//Program:testMicroDelay.pde
//Crate by:Deryoung.com
//Resulte: on-off in rage microsecond time.
//Interface: none
//*************************************
int outPin=9;
void setup()
{
  pinMode(outPin,OUTPUT);
}

void loop() 
{
  digitalWrite(outPin, HIGH);   // sets the pin on
  delayMicroseconds(50);        // pauses for 50 microseconds      
  digitalWrite(outPin, LOW);    // sets the pin off
  delayMicroseconds(50);        // pauses for 50 microseconds   
  
}

รูปที่ 1. แสดงการเปิดปิดของ port Digital-9 ด้วยเวลา 50us

หลังจากเราได้ใช้คำสั่ง

digitalWrite(outPin, HIGH); จะอยู่ในสถานะ HIGH (5vdc)
delayMicroseconds(50); คำสั่งนี้จะทำการหยุดโปรแกรมชั่วขณะเป็นเวลา 50 ไมโครวินาที ทำให้ขา digitital-9
เป็น HIGH นาน 50 ไมโครวินาที

digitalWrite(outPin, LOW);จะอยู่ในสถานะ LOW (0V)
delayMicroseconds(50); คำสั่งนี้จะทำการหยุดโปรแกรมชั่วขณะเป็นเวลา 50 ไมโครวินาที ทำให้ขา digitital-9
เป็น LOW นาน 50 ไมโครวินาที

ทดลองอีกครั้ง โดยเราจะทดลองป้อนสถานะ HIGH ให้ขา digital-9 เป็นเวลา 25 us (ครึ่งหนึ่งของสถานะ Low)

void loop() 
{
  digitalWrite(outPin, HIGH);  
  delayMicroseconds(25);        // pauses for 25 microseconds      
  digitalWrite(outPin, LOW);    
  delayMicroseconds(50);           
  
}

หลังจาก Run โปรแกรมข้างต้น จะผลลัพธ์ที่ออกมาดังแสดงด้านล่าง


รูปที่ 2. ป้อนสถานะ HIGH นาน 25 ไมโครวินาที

 

เพื่อเป็นหาค่า min ที่ต่ำสุด (อย่างแม่นยำ) ทดลองป้อนเวลาเป็น 1 ไมโครวินาทีในสภาวะ HIGH ที่ digital-9 และ LOW เป็นระยะเวลา 5 ไมโครวินาที

int outPin=9;
void setup()
{
  pinMode(outPin,OUTPUT);
}

void loop() 
{
  digitalWrite(outPin, HIGH);   // sets the pin on
  delayMicroseconds(1);        // pauses for 1 microseconds      
  digitalWrite(outPin, LOW);    // sets the pin off
  delayMicroseconds(5);        // pauses for 5 microseconds   
  
}



รูปที่ 3. ผลของความต่างระหว่าง 1us และ 5us

ผลจากการตรวจวัดด้วย Oscilloscope จะผลลัพทธ์ช่วง HIGH ได้ผลลัพธ์ประมาณ 2.3us (ใกล้เคียง 3 us) ส่วนผลลัพธ์ของช่วงล่างที่เป็น LOW ยังคงได้ระยะเวลาที่ใกล้เคียงกับ 5.0us มากกว่า ตามที่เราป้อนหรือโปรแกรมมันลงไปในโปรแกรมข้างต้น.

  • delay()

รูปแบบคำสั่ง ของ delay()

  • delay (unsigned longะยะเวลาในมิลลิวินาที )
  • delay (unsigned long time)
  • delay(ms)

ตัวอย่าง delay(1000);

  • หมายถึงการหยุดรอ (pause) เป็นเวลา 1,000 มิลลิวินาที (millisecond)
  • หรือ 1,000 ms, หรือเท่ากับ 1 วินาที (second)

    int outPin=9;
    void setup()
    {
      pinMode(outPin,OUTPUT);
    }
    
    void loop() 
    {
      digitalWrite(outPin, HIGH);   // sets the pin on
      delay(2);        // pauses for 2 milliseconds      
      digitalWrite(outPin, LOW);    // sets the pin off
      delay(10);        // pauses for 10 milliseconds   
      
    }


  • รูปที่ 4. ผลของความแตกต่างระหว่าง 2ms และ 10ms

    ถึงแม้นว่าค่าพารามิเตอรร์ (parameter) ของคำสั่ง delay(ms) นั้น จะเปิดกว้างให้ป้อนค่าในระดับมิลลิวินาทีแล้ว เมื่อทดลองใช้ค่าต่ำๆ ก็ยังให้ผลใก้ลเคียง

    ตัวอย่างข้างล่างนี้ จะเป็นการเพิ่ม/ลดขนาดของพัลส์ (pulse)

    เราจะใช้ตัวแปร i เป็นตัวนับ ในลูป for แรกนั้นเราจะทำการเขียน port ด้วยคำสั่ง analogWrite() ลงบน port digital-9, analogWrite(port,i)โดยมีค่าผันแปรไปตามลำดับของ i ซึ่งจะเริ่มนับจาก 0 เพิ่มขึ้นที่ละ 5 ไปจนเท่ากับ 255 แล้วหยุด จากนั้นจะรอต่ออีกเป็นเวลา 10 ms.

    //*************************************
    //Program:pwm.pde
    //Crate by:Deryoung.com
    //Resulte: LED fade-in and out
    //Interface: LED pin(+) to digital-9 and pin(-) to Ground
    //*************************************
    int ledPin = 9;    // LED connected to digital pin 9
    
     void setup()  { 
       // nothing happen here!
     } 
    
     void loop()  { 
       int i; // time for fade-in/out
       
       for(i=0;i<=255;i+=5) { // count up from 0 to 255,with 5+ step
         analogWrite(ledPin,i);
         delay(10);
       }
       for(i=255;i>=0;i-=5) { // count down from 255 to 0,with 5- step
         analogWrite(ledPin,i);
         delay(10);
       }
       
     }
                    

    ในลูปที่ 2 จะเป็นการเขียน port ด้วยคำสั่ง analogWrite() โดยมีค่าที่ป้อนให้จะเริ่มขึ้นจาก 255 และลดลงที่ 5 ไปจนถึง 0

    ในขณะที่คำสั่ง analogWrite ได้รับค่า 255 เช่น analogWrite(port,255) จะเป็นช่วงที่ LED สว่างที่สุด และความสว่างจะลดลงไปเรื่อยๆ ตามค่าของ i ที่ลดลงจาก 255 ไปเป็น 0 ตามลำดับ

    ในขณะที่คำสั่ง analogWrite ได้รับค่า 0 เช่น analogWrite(port,0) จะเป็น LED 0 จะมืดที่สุด และความสว่างจะเพิ่มขึ้นเรื่อยๆ ตามค่าของ i ที่เพิ่มขึ้นงจาก 0 ไปเป็น 255 ตามลำดับ

    ศึกษาความรู้เพิ่มเติมการป้อนค่า analog ผ่านทางตัวต้านทางปรับค่าได้ (potentiometer) เพิ่มเติมได้ ที่นี่

 

 

This website is personally and all reserved right of meterial, you can copy and use its with refer link to this site
Email contact : support@deryoung.com