คำสั่ง 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 (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) เพิ่มเติมได้ ที่นี่