17...โปรเจคArduino Timer


   

    

 การจับเวลาด้วย Arduino

LearningsLED ติดดับอัตโนมัติด้วย LDRทำโปรเจคเล็กๆ กับไฟ LED ติดดับตามแสงสว่าง ด้วย Sensor ตัวต้านทานแสง LDR และทรานซิสเตอร์Last Update 8 April 2016Views 200การทำไฟกระพริบด้วยทรานซิสเตอร์ทำวงจรไฟกระพริบง่ายๆด้วยทรานซิสเตอร์ ที่สำคัญ ใช้งบประมาณน้อยมาก!Last Update 13 February 2016Views 200

Learning Basic Arduino

มาเรียนรู้การใช้งาน Arduino กันเถอะ แล้วจะรู้ว่าไมโครคอนโทรลเลอร์ไม่ยากเลย!Last Update 5 March 2016Views 200

  รายการสินค้า   

  

4x4 Matrix Membrane KeypadKeypad 4x4 (16 ปุ่ม)• ใช้ 8 pin แต่ได้ถึง 16 ปุ่ม• Max Voltage 24 V• Max Current 30 mA• ขนาด 6.9 x 7.6 cm• ความยาวสาย 8.8 cm฿ 45.00 THB

ต่อ 1 ชิ้น

 

Arduino UNO R3 +USBบอร์ด UNO R3 Design in Italy• ATmega328P• 28 Pins• 14 Pins Digital Input/Output• 6 Pins Analog Input฿ 310.00 THB ลดเหลือ฿ 190.00ประหยัด120 THB 

ต่อ 1 ชิ้น

 

12 V Active Buzzerออดไฟฟ้า Buzzer กำเนิดเสียงสูง• ไฟเลี้ยง 5-12V• กระแสใช้งาน 25 - 30 mA• ความดัง 85 dBA• 2,300 ± 300 Hz (เสียงสูง)• เส้นผ่านศูนย์กลาง 11 mm฿ 15.00 THB

ต่อ 1 ชิ้น

     

  

Arduino Timer 

  เราสามารถใช้ Arduino มาประยุกต์เป็นเครื่องจับเวลาแบบง่ายๆได้ โดยการรับค่าเวลาเข้ามา จากนั้นก็แค่ให้มันจับเวลาไปเรื่อยๆจนครบเวลาที่เรากำหนด ซึ่งนี่คือหลักการของการจับเวลาหรือนับเวลาถอยหลังที่ทุกคนรู้อยู่แล้ว millis() คืออะไร?มีบางคนคิดว่าการจับเวลาจะต้องใช้คำสั่ง Delay() เช่นถ้าต้องการจับเวลา 5 วิ ก็แค่ Delay(5000) แต่จริงๆแล้วการ Delay ไม่เหมาะกับการนำมาจับเวลา เพราะการ Delay คือการหน่วงเวลา ไม่ใช่การนับเวลา และการ Delay ยังมีผลทำให้เราไม่สามาถหยุดการทำงานได้ในบางกรณี เช่น ไม่สามารถหยุดการจับเวลาได้ เราจึงนิยมใช้คำสั่ง millis() แทนmillis() หรือ milliseconds คือการจับเวลาของ Arduino ซึ่งทันทีที่มีไฟเลี้ยงเข้า Arduino หรือทันทีที่ Arduino ทำงาน มันก็จะมีการจับเวลาอัตโนมัติไปเรื่อยๆ โดยที่เราไม่ต้องไปสั่งมัน ซึ่งการเรียกใช้คำสั่ง millis() ก็คือการเรียกค่าของเวลาที่ถูกจับอยู่มาใช้นั่นเอง   แสดงค่า millis()   โดยในเบื่องต้น เราต้องเข้าใจการทำงานของคำสั่งนี้ก่อน โดยสามารถเรียกดูค่าการจับเวลาได้ง่ายๆผ่าน Serial Monitor

  

unsigned long ShowTime; // ประกาศตัวแปรชื่อ ShowTime เก็บค่าการนับเวลา เป็นตัวแปร unsigned long

void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
ShowTime = millis(); // ให้ ShowTime = เวลาที่ Arduio นับได้
Serial.println(ShowTime); // แสดงค่า ShowTime และขึ้นบรรทัดใหม่ด้วยคำสั่ง println
}

  Upload Code ลง Arduino และเปิด Serial Monitor เพื่อดูการทำงาน ** unsigned long คือประเภทของตัวแปรชนิดหนึ่งunsigned คือ ไม่คิดเครื่องหมาย (เป็นบวกเท่านั้น) เพราะเราต้องการให้เวลาที่ได้เป็นบวกเสมอ (ในบางครั้งเวลาที่จับได้อาจมีเครื่องหมายติดลบ เพราะการทำงานผิดพลาด เราจึงต้องใช้ unsigned เข้ามาช่วย)long คือ ตัวแปรที่มีจำนวนไบต์เป็น 2 เท่าของจำนวนเดิม ซึ่งการจับเวลาไปเรื่อยๆ อาจได้เลขหลายหลักมาก เราจึงนิยมเก็บค่าด้วย long แทนที่จะเป็น int ธรรมดาunsigned long จึงหมายถึง ค่าจำนวนเต็มบวก ที่สามารถเก็บค่าได้เป็น 2 เท่าจากเดิม 

เปิด Serial Monitor เพื่อดูการทำงาน 

ผลลัพธ์เมื่อเปิดดู Serial Monitor ก็จะเห็นเลขชุดหนึ่งวิ่งไปเรื่อยๆ โดยเลขดังกล่าว คือเลขแสดง มิลลิวินาที (Milliseconds) ซึ่งหมายถึง 1 / 1000 วินาที ดังนั้นเลขที่อยู่ในแถบสีแดง คือจำนวนวินาทีที่ผ่านไปนั่นเอง หรือถ้าอยากให้แสดงในหน่วยวินาที ก็แค่นำตัวเลขดังกล่าวมาหารด้วย 1000   เริ่มทำวงจรจับเวลา   เมื่อพอเข้าใจคำสั่ง millis() แล้ว เราก็สามารถนำมันมาประยุกต์เพื่อทำวงจรจับเวลาอย่างง่ายๆ ไปจนถึงระดับใช้งานจริงได้โดยในตอนที่ 1 นี้ เราจะทำการจับเวลาแบบพื้นฐาน คือจับเวลาเลขหนึ่งหลัก (ตั้งแต่ 0 - 9 วินาที) โดยการรับค่าเวลาจาก Matrix Keypad และเมื่อเวลาครบตามที่กำหนด ก็ให้ออดหรือลำโพงส่งเสียงเตือน หรือใครไม่มีออด สามารถเปลี่ยนไปใช้ไฟ LED แทนก็ได้

 Download Library ใช้งาน

 LIBRARY  Keypad.h อ่านเรื่อง >> การใช้ Keypad กับ Arduino 

//Basic Timer 
//www.commandronestore.com

#include <Keypad.h> //เรียกใช้ Library Keypad

const byte numRows= 4; 
const byte numCols= 4;
unsigned long previousTime = 0;
int setTime = 0;
int start = 0;
int buzzer = 0;

//กำหนดค่าของปุ่มต่างๆ โดยในที่นี้จะกำหนดเฉพาะปุ่มที่ใช้งาน ปุ่มที่เหลือจให้เป็นค่าว่าง
char keymap[numRows][numCols]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', ' '},
{' ', '0', ' ', ' '}
};

byte rowPins[numRows] = {9,8,7,6}; //Rows 0 to 3 ตั้งค่าการต่อ Pin ของ Keypad
byte colPins[numCols]= {5,4,3,2}; //Columns 0 to 3

Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup()
{
Serial.begin(250000);
pinMode(12, OUTPUT); //ให้ Pin 12 ที่จะต่อกับออดไฟฟ้า เป็น Output
}

void loop()
{
unsigned long showTime = millis();
char key = myKeypad.getKey(); // ตัวแปร key เป็นตัวแปรแบบ char รับค่าการกดปุ่ม
if (key != NO_KEY && key != 'A' && key != 'B' && key != ' ') //เมื่อกดปุ่ม (เฉพาะเลข 0 - 9) ค่า setTime จะเท่ากับปุ่มที่กด
{
setTime = (key - 48); //นำค่า key ที่ได้มาลบกับ 48 เนื่องจากเป็นรหัส ascii48 ที่เลข 0 จะเริ่มที่ 48
Serial.print(key);
}

if(key == 'A') //เมื่อกดปุ่ม A ตัวแปร start จะเท่ากับ 1 และค่า previousTime สุดท้ายจะเท่ากับ showTime ณ ตอนนั้น
{
start = 1;
previousTime = showTime;
Serial.print("Start...");
}

if(key == 'B') //เมื่อกดปุ่ม B ทุกอย่างจะถูกหยุด 
{
start = 0;
buzzer = 0;
previousTime = 0;
Serial.print("Stop!...");
}

if(start == 1) //เมื่อ start = 1 จะเป็นการวน loop จับเวลาไปเรื่อยๆ จนกว่าจะครบกำหนด
{
Serial.print("setTime: ");
Serial.print(setTime); //แสดงค่าเวลาที่ตั้งไว้
Serial.print("   showTime: ");
Serial.print(showTime); //แสดงเวลา millis() ของ Arduino ซึ่งจะเป็นค่าที่วิ่งไปเรื่อยๆ
Serial.print("   previousTime: ");
Serial.print(previousTime); //แสดงค่าสุดท้ายของ previousTime หลังจากที่กดปุ่ม A ซึ่งจะเป็นค่าคงที่ ไม่วิ่งตาม millis()
Serial.print("   Time: ");
Serial.println((showTime - previousTime) / 1000); //แสดงผลการคำนวณว่าจับเวลาไปกี่วิแล้ว

if((showTime - previousTime) / 1000 >= setTime) //ถ้าเวลาที่จับได้ มากกว่าหรือเท่ากับเวลาที่ตั้งไว้...
{
start = 0;
buzzer = 1;
Serial.print("Finish!");
}
}

if(buzzer == 1) //เมื่อตัวแปร buzzer = 1 , pin12 ที่ต่อกับออด (Buzzer) จะ HIGH ออดจึงดัง
{
digitalWrite(12, HIGH); 
}
if(buzzer == 0) //เมื่อตัวแปร buzzer = 0 (กดปุ่ม B) ออดจะหยุดดัง
{
digitalWrite(12, LOW); 
}

}

  หลักการทำงาน• เรา Input เวลาเข้าไปในโปรแกรม เพื่อตั้งค่าว่าให้จับเวลากี่วินาที (ตั้งแต่ 0 - 9 วินาที) โดยตัวแปรที่รับค่าเวลานี้คือ setTime• เมื่อกดปุ่ม A จะเริ่มจับเวลา (start = 1)• เมื่อกดปุ่ม B จะเป็นการหยุดและเริ่มทุกอย่างใหม่หมด (start = 0)• ระหว่างที่กำลังจับเวลา (start = 1) โปรแกรมจะสามารถรู้ว่าเวลาครบกันหนดหรือยัง โดยการนำค่า showTime มาลบกับ previousTime- showTime คือ millis() จะวิ่งไปเรื่อยๆตั้งแต่ Arduino ทำงาน- previousTime คือเวลาสุดท้าย ทีกดปุ่ม A และจะค้างอยู่อย่างนั้นไปเรื่อยๆ จนกว่าจะจับเวลาใหม่อีกรอบดังนั้น ถ้า showTime ลบกับ previousTime แล้วมากกว่าหรือเท่ากับ setTime นั่นแสดงว่าจับเวลาเสร็จเรียบร้อยแล้ว• เมื่อจับเวลาครบเสร็จเรียบร้อย start จะเท่ากับ 0 เพื่อหยุดการจับเวลา และตัวแปร buzzer จะเท่ากับ 1• เมื่อ buzzer = 1 ,pin12 ที่ต่อกับ buzzer หรือออด จะ HIGH ออดจึงดัง• เมื่อต้องการหยุดเสียง ให้กดปุ่ม B แล้วทุกอย่างจะหยุด (buzzer = 0) ทำไมจึงนำ previousTime ไว้นอก void loop() แต่นำ showTime ไว้ใน void loop()เป็นเพราะว่า เราต้องการให้ค่า previousTime เป็นค่าแบบคงที่ และต้องการให้ค่า showTime วิ่งไปเรื่อยๆ จึงแยกสองค่านี้ออกจากกัน โดยค่า showTime ที่อยู่ใน void loop() ก็จะวิ่งไปเรื่อยๆนั่นเองเนื่องจากเราวัดเวลาว่าครบหรือยัง จากการนำ showTime ลบกับ previousTime แล้วต้องมากกว่าหรือเท่ากับ setTimeดังนั้น ถ้า previousTime วิ่งตาม showTime ก็จะไม่มีวันลบกันได้มากกว่าหรือเท่ากับ setTime ascii48จากส่วนของโปรแกรมตรง setTime = (key - 48) นั่นหมายถึงเลข 0-9 ที่เรารับได้จาก keypad นั้น ไม่ใช่ตัวเลขจริงๆ แต่เป็นตัวเลขในรูปแบบ char เพราะเราประกาศให้มันเป็น char ดังนั้น เราจึงต้องแปลงให้อยู่ในรูปของตัวเลข โดยในตาราง ascii48 เลข 0 จะเริ่มที่ 48

อย่าลืมปรับ baud rate ด้านล่างขวาให้เป็น 250000 ด้วยนะครับ

     

 

ตอบกลับ

 


ความคิดเห็น

บทความที่ได้รับความนิยม