ควบคุมเปิดปิดไฟเลี้ยว


โครงสร้างใน sketch

ที่แตกต่างจากรูปแบบมาตราฐานคือ ใน sketch จะมี ฟังก์ชั่นเพิ่มเติมสองส่วน ได้แก่
ฟังก์ชั่น Setup() ทุกครั้งของการทำงาน ตั้งแต่จ่ายไฟ arduino จะทำงานตามคำสั่งที่อยู่ใน setup() 
เป็นส่วนแรก และ ทุกคำสั่งใน setup() ทำงานแค่ครั้งเดียวเท่านั้น ส่วนนี้จึงตั้งชื่อว่า setup หรือเอาไว้ตั้งค่านี้เอง

Void Setup() {
  // the setup() method runs once ,when starts
  // setup() ทำงาน แค่ครั้งแรก ครั้งเดียว ในใช้ในการ initial ค่าตัวแปร
}
ฟังก์ชั่น loop() หลังจากที่ทำงานส่วน setup() ,โปรแกรมใน sketch จะทำงานในฟังก์ชั่น loop() 
ตามชื่อ ตลอดการจ่ายไฟ arduino จะทำงานทุกคำสั่งที่อยู่ใน loop() วนไปเรื่อยๆ
Void Loop(){
   // the loop() method runs again and again ,as long as arduino have a power.
   // loop() หลังจากรันส่วน setup ,โปรแกรมจะทำงาน เฉพาะคำสั่งที่อยู่ใน loop() และ วนอยู่ลูป เท่านั้น
}


เมื่อจ่ายไฟ โปรแกรมจะทำงานในส่วนของ setup() 

ก่อน โดยเราได้กำหนดว่าจะใช้ขาไหนว่าเป็น Output เพื่อจ่ายไฟให้ LED ไว้โดยใช้คำสั่ง pinMode() 
 โดยที่ขา LED บนบอร์ด Arduino จะต่อกับ D13 ครับ จากตัวอย่างเราจึงสร้างตัวแปรชื่อ ledPin ซึ่งมีค่า 13 ไว้ เพื่อใช้แทนกำหนด ตัวเลข 13 ลงไปในโปรแกรม

int ledPin =  13; // LED connected to digital pin 13
// The setup() method runs once, when the sketch starts
void setup()   {
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT);
}
มาถึงฟังก์ชั่น Loop() เราได้ใส่คำสั่ง digitalWrite() เป็นคำสั่งให้ขา Digital ของ Arduino จ่ายไฟ หรือ 
หยุดจ่ายไฟ คิดง่ายๆว่า Arduino เหมือนสวิตส์ที่เราสั่งเปิดปิดไฟ ได้โดยการโปรแกรมคำสั่ง การสร้างไฟกระพริบ
 ก้อเป็นการจ่ายไฟ และ หยุดจ่ายไฟ ที่เป็นจังหวะเท่ากัน  ดูในคำสั่งข้างล่าง ผมใส่ digitalWrite() แล้วจะต่อท้าย delay() 
เพื่อให้ไฟติด และหน่วงเวลาไว้ เพื่อให้มันยังติดหรือดับอยู่
// the loop() method runs over and over again, as long as Arduino has power
void loop()
{
  digitalWrite(ledPin, HIGH);   // set the LED on
  delay(500);  // wait for a second
  digitalWrite(ledPin,LOW);  // set the LED off
  delay(500);  // wait for a second
}

 // ไฟกระพริบ เทพ ๆ
  digitalWrite( ledPin, HIGH );   // set the   LED on
  delay(500);   // wait for a second

  digitalWrite( ledPin, LOW );   // set the   LED off
  delay(500);  // wait for a second
เขาจึงใช้ฟังก์ชั่นเข้าช่วย ให้การออกแบบโปรแกรม ดูดี เข้าใจง่าย ดูสะอาด ฟังก์ชั่นใช้งานซ้ำๆ ได้ง่ายอีกด้วย


ทดสอบบอร์ดอานู่โน่ ได้ดีเยี่ยม 

// Blinking Testing Program
int ledPin =  13;  // LED connected to digital pin 13
// The setup() method runs once, when starts
void setup()   {
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT);
}
// the loop() method runs again and again
// as long as Arduino has power
void loop()
{
  digitalWrite(ledPin, HIGH);  // set the LED on
  delay(1000);  // wait for a second
  digitalWrite(ledPin, LOW);   // set the LED off
  delay(1000);  // wait for a second
}

ไฟกระพริบ ช้าๆ และ เร็วๆ สลับกัน 

int ledPin =  13; // LED connected to digital pin 13
// The setup() method runs once, when the sketch starts
void setup()   {
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT);
}
// the loop() method runs over and over again,
void loop()
{
    Blinky(1000);
    Blinky(250);
}
void Blinky(int time)
{
  digitalWrite(ledPin, HIGH); // set the LED on
  delay(time); // wait for a second
  digitalWrite(ledPin, LOW);    // set the LED off
  delay(time); // wait for a second
}
จาก Sketch ข้างต้น เราจะทำไฟกระพริบ ช้าๆ และ เร็วๆ สลับกัน 
อย่างสบายมาก และ sketch ที่สร้างดูดี และเรายังแก้ไขได้ง่ายยิ่งขึ้น 
อีกด้วยครับ แค่แก้ไข คำสั่งตัวแปรที่ส่งไปกับ Blinky() เท่านั้นเอง



ประยุกต์ การควบคุมเปิดปิดไฟเลี้ยวด้วย Arduino 

การควบคุมเปิดปิดไฟเลี้ยวด้วย Arduino สามารถทำได้โดยใช้ รีเลย์ (Relay Module)
เพื่อเป็นสวิตช์ควบคุมการเปิด/ปิดไฟเลี้ยวจริงที่มีแรงดันและกระแสสูงกว่าที่ Arduino จะจ่ายได้โดยตรง
หลักการทำงานเบื้องต้น:


อุปกรณ์ที่จำเป็น

บอร์ด Arduino (เช่น Arduino Uno, Nano)
โมดูลรีเลย์ (Relay Module) 1 หรือ 2 ช่อง (สำหรับควบคุมไฟเลี้ยวซ้ายและขวา)
แหล่งจ่ายไฟ 12V (สำหรับไฟเลี้ยว)
หลอดไฟเลี้ยว (12V) หรือ LED ที่มีกำลังไฟเหมาะสม
สวิตช์ (สำหรับสั่งงานเลี้ยวซ้าย/ขวา)
สายไฟ/สายจัมเปอร์

การเชื่อมต่อ

เชื่อมต่อ ขาควบคุม (IN) ของรีเลย์เข้ากับ ขา Digital Output ของ Arduino
ต่อไฟเลี้ยง VCC และ GND ของรีเลย์เข้ากับแหล่งจ่ายไฟ 5V (จาก Arduino หรือแยก)
ต่อวงจรไฟเลี้ยว: ตัดสายไฟที่จ่ายไฟเข้าหลอดไฟเลี้ยว แล้วต่อผ่านหน้าสัมผัสของรีเลย์ 
(มักใช้ขา Common (COM) และ Normally Open (NO)) โดยให้ Arduino สั่งงานรีเลย์เพื่อจ่ายไฟ 12V ไปที่หลอดไฟเลี้ยว



การเขียนโปรแกรม (Code)

กำหนดขา Digital Pin ที่ใช้เชื่อมต่อกับรีเลย์เป็น OUTPUT
ใช้คำสั่ง digitalWrite(pin, HIGH); หรือ digitalWrite(pin, LOW); เพื่อสั่งให้รีเลย์ทำงาน (เปิดหรือปิด)
ใช้ฟังก์ชัน delay() หรือการจัดการเวลาแบบ millis() เพื่อสร้างจังหวะ ไฟกระพริบ ของไฟเลี้ยว (เช่น เปิด 500ms, ปิด 500ms)
สำหรับโปรเจกต์ที่ซับซ้อนขึ้น เช่น ระบบไฟเลี้ยวอัตโนมัติยกเลิกเอง (Self-Canceling Turn Signals) 
ที่ใช้กับรถยนต์หรือจักรยานยนต์ อาจต้องมีการใช้เซนเซอร์ตรวจจับการหมุนของพวงมาลัยหรือแฮนด์เพิ่มเติม