16/5/62

ปรับความสว่าง LED ด้วย R ปรับค่าได้ Potentiometer

มินิโปรเจค Arduino ปรับความสว่าง LED ด้วย R ปรับค่าได้ Potentiometer



ประโยชน์และการนำโปรเจคไปพัฒนาต่อ

การปรับความสว่าง LED ด้วย R ปรับค่าได้ นั้น เป็นการควบคุมค่า 
PWM ให้สามารถปรับความสว่าง ของ LED ให้เหมาะสมกับการใช้งาน และยังเป็นการใช้พลังงานอย่างประหยัดและคุ้มค่าโดยการสร้างค่านิยมและจิตใต้สำนึกการใช้พลังงาน ตัวอย่าง เช่น ห้องนอน , ห้องที่ไม่ต้องการแสงสว่างมากเกินไป และยังสามารถปรับความสว่างเพิ่มมากขึ้น หรือลดลง ตามความต้องการได้อีกด้วย


เป้าหมายและหลักการทำงานของโปรเจค


ผลของการทำงานทำให้สามารถปรับความสว่าง LED  ได้โดยการหมุนปรับค่า Potentiometer


ทดสอบโดย หมุน โพเทนซิโอมิเตอร์ Adjustable Potentiometer หรืออาจจะเรียกสั้นๆว่า “pot” ซึ่งเป็นอุปกรณ์ที่มีสามขา ปรับค่าได้ ที่ต่ออยู่ที่ 
Pin อนาล็อก A0 ของ Arduino เมื่ออ่านค่า
อินพุท (input) แบบ อนาล็อก (Analog) แล้วเก็บค่าไว้ในตัวแปร

แต่เนื่องจาก การแปลงค่าจาก 
อนาล็อก เป็น ดิจิตอล (Analog to Digital Converter) หรือเรียกสั้นๆว่า ADC ของ Arduino นั้นเป็น ADC ขนาด 10-bit จึงอ่านค่า Analog ได้ตั้งแต่ 0 – 1024 แต่ PWM  หรือการหรี่ไฟ ต้องการค่าตั้งแต่ 0 - 255 จึงต้องแปลงค่า เพื่อทำการสเกลค่าลงจาก 0 - 1024 ให้เป็น 0 - 255 แล้วนำไปเก็บไว้ในตัวแปร PWM

ส่วนที่ Pin ดิจิตอล (Digital) หมายเลข 5 เป็นเอาท์พุท (output) ที่สั่งให้ LED ปรับความสว่าง ตามค่า PWM ที่ส่งออกมา


รู้จัก PWM(Pulse Width Modulation)

PWM คือเทคนิดการส่งสัญญาณแบบสวิต หรือ ส่งค่าดิจิตอล 0-1 โดยให้สัญญาณความถี่คงที่ การควบคุมระยะเวลาสัญญาณสูงและสัญญาณต่ำ ที่ต่างกัน ก็จะทำให้ค่าแรงดันเฉลี่ยของสัญญาณสวิต ต่างกันด้วย







สำหรับโมดุล PWM ของ Arduino มีความละเอียด 8 bit หรือ ปรับได้ 255 ระดับ ดังนั้นค่าสัญญาณ 0 โวลต์ถึง 5 โวลต์ จะถูกแสดงเป็นสัญญาณแบบดิจิตอล จะได้ 0 ถึง 255 ซึ่งเราสามารถเทียบสัดส่วนคำนวนจากเลขจริง เป็น เลขทางดิจิตอลได้



อุปกรณ์ที่ใช้ในโปรเจค






ขั้นตอนการทำโปรเจค


1. เชื่อมต่อ Arduino UNO R3 กับ Adjustable Potentiometer Module (5V ลงใน Mini Breadboard)





2. เชื่อมต่ออุปกรณ์ที่เหลือ ลงใน Mini Breadboard



3. ตัดแจ๊กขั้วถ่านออก แล้วเชื่อมต่อ แจ๊ก เข้ากับ รางถ่าน แล้วจึงเสียบเข้า บอร์ด Arduino เพื่อเป็นไฟเลี้ยงบอร์ด




4. ภาพรวมการต่อโปรเจค





5. อัพโหลดโค้ด

   

5.1 เชื่อมต่อสาย USB ระหว่าง คอมพิวเตอร์ กับ บอร์ด Arduino
  



   

5.2 เปิดโปรแกรม Arduino IDE เขียนโค้ดดังนี้




int POT_PIN = A0;

int VAL;

int PWM;

int LED_PIN = 5;

void setup() {

  pinMode(LED_PIN, OUTPUT);


}

void loop() {

  VAL = analogRead(POT_PIN);

  PWM = map(VAL, 0, 1024, 0, 255);

  analogWrite(LED_PIN, PWM);

  delay(15);

}



  
5.3 ไปที่ Tools > Board เลือกเป็น Arduino/Genuino UNO



5.4 ไปที่ Tools > Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port มากกว่าหนึ่ง  ให้เลือกตัวอื่นที่ไม่ใช่ COM1)



ในตัวอย่างเลือกเป็น "COM8"



(ถ้ายังว่าง หรือ เป็น COM1 ให้ตรวจสอบการติดตั้งไดร์เวอร์ การต่อสาย USB ของ Arduino UNO)


5.5 กดปุ่ม  เพื่ออัพโหลด



5.6 หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง



6. อธิบายโค้ด




int POT_PIN = A0;  // ประกาศให้พินอนาล็อก A0 เป็นตัวแปรชื่อ POT_PIN  มีชนิดของข้อมูลเป็น int คือ เลขจำนวนเต็ม

int VAL;  // ประกาศตัวแปรชื่อ VAL มีชนิดของข้อมูลเป็น int คือ เลขจำนวนเต็ม

int PWM;  //  // ประกาศตัวแปรชื่อ PWM มีชนิดของข้อมูลเป็น int คือ เลขจำนวนเต็ม

int LED_PIN = 5;  // ประกาศให้พินดิจิตอล 5 เป็นตัวแปรชื่อ LED_PIN  มีชนิดของข้อมูลเป็น int คือ เลขจำนวนเต็ม

void setup() {  // ฟังก์ชัน setup จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น

  pinMode(LED_PIN, OUTPUT);  //  ให้ LED_PIN พินดิจิตอล 5 เป็นพินโหมด แบบเอาท์พุท


}  // สิ้นสุดการทำงานของฟังก์ชัน setup


void loop() {  // ฟังก์ชัน loop จะทำงานซ้ำ วนลูป ไปเรื่อยๆ

  VAL = analogRead(POT_PIN); // อ่านค่าจากขา A0 เก็บไว้ที่ตัวแปร VAL

  PWM = map(VAL, 0, 1024, 0, 255);  // เนื่องจาก ADC ภายใน Arduino เป็น ADC ขนาด 10-bit จึงอ่านค่า Analog ได้ตั้งแต่ 0 – 1024 แต่ PWM  หรือการหรี่ไฟ ต้องการค่าตั้งแต่ 0 - 255 จึงต้องแปลงค่า เพื่อทำการสเกลค่าลงจาก 0 - 1024 ให้เป็น 0 - 255 แล้วนำไปเก็บไว้ในตัวแปร PWM

  analogWrite(LED_PIN, PWM);  // ให้พินดิจิตอล 5 LED_PIN ส่งค่า PWM หรือค่าอนาล็อก 0 - 255 ออกไป

  delay(15);  //  หน่วงเวลา 15 มิลลิวินาที

}

5/5/62

ตรวจจับเปลวไฟ หรือเหตุเพลิงไหม้ ด้วย Fire Extinguisher

มินิโปรเจค Arduino ตรวจจับเปลวไฟ หรือเหตุเพลิงไหม้ ด้วย Fire Extinguisher



ประโยชน์และการนำโปรเจคไปพัฒนาต่อ

ระบบสัญญาณเตือนไฟไหม้ (Fire Alarm System) คือ ระบบสำหรับแจ้งเตือนเมื่อมีเปลวไฟ หรือเหตุเพลิงไหม้ภายในอาคาร โดยใช้เซนเซอร์หรืออุปกรณ์ตรวจจับชนิดต่างๆ ตามความเหมาะสม เช่น อุปกรณ์ตรวจจับควันไฟ (Smoke Detector) อุปกรณ์ตรวจจับความร้อน (Heat Detector) อุปกรณ์ตรวจจับเปลวไฟ (Fire Extinguisher) เป็นต้น

ซึ่งระบบสัญญาณเตือนไฟไหม้นี้จะทำให้ผู้ที่อยู่ในอาคารสามารถรับรู้และแก้ไขได้อย่างทันท่วงที ป้องกันไม่ให้ไฟไหม้นั้นลุกลามจนไม่สามารถควบคุมได้ ซึ่งในการใชงานจริง อาจจะต้องใช้ 
เซนเซอร์ ทั้ง 3 แบบ ร่วมกันในการตรวจสอบ แล้วไปสั่ง หัวสปริงเกอร์ฉีดน้ำให้ทำงาน แต่ในตัวอย่างโปรเจคจะเลือกใช้ อุปกรณ์ตรวจจับเปลวไฟ (Fire Extinguisher) ในขั้นตอนที่มีเปลวไฟ (Flame Stage) คือเริ่มมีเปลวไฟทำให้มองเห็นว่าเป็นไฟแต่ยังไม่สามารถวัดค่าความร้อนได้ ในการใช้งานโปรเจคนี้ อาจนำไปติดตั้ง สถานที่ ห้ามสูบบุหรี่ เป็นต้น


เป้าหมายและหลักการทำงานของโปรเจค






ให้ (Input) เซ็นเซอร์ 
ตรวจจับเปลวไฟ (Fire Extinguisher) ตรวจจับว่ามีเปลวไฟเกิดขึ้นหรือไม่ โดยให้แสดงการตรวจจับแบบดิจิตอล ทั้ง 5 เซ็นเซอร์ แล้วให้แสดงผลที่จอ LCD บรรทัดที่ 1  คือ สถานะ 1 = "มีเปลวไฟ" และ สถานะ 0 = "ไม่มีเปลวไฟ" การตรวจสอบว่ามีเปลวไฟหรือไม่? คือ ถ้าเซ็นเซอร์ ตัวใดตัวหนึ่งใน 5 ตัว มีสถานะเป็น 1 ให้ถือว่ามีเปลวไฟ

จอ LCD บรรทัดที่ 2 ถ้า "ไม่มี
เปลวไฟ" แสดงคำว่า "NORMAL" แต่ถ้า "มีเปลวไฟ" ให้แสดงคำว่า "FIRE ALARM" แล้วไปสั่งงาน (Output) คือ ให้ออด Buzzer แสดงการแจ้งเตือน และเมื่อไม่มีเปลวไฟ ให้ ออด Buzzer หยุดการแจ้งเตือน



อุปกรณ์ที่ใช้ในโปรเจค
5. 5 Way Fire Extinguisher Sensor 

6. Keyestudio Passive Buzzer Alarm Module


*** การใช้งานแบบไม่ต้องการเชื่อมต่อสาย USB กับ คอมพิวเตอร์ ให้ใช้ Adapter DC 9V 1A Power Supply เป็นแหล่งจ่ายไฟ เสียบเข้ากับ DC Power Jack ของ  บอร์ด Arduino ***


ขั้นตอนการทำโปรเจค

1. ต่อใช้งาน จอ LCD กับ Arduino




1.1 ยึดบอร์ด Arduino UNO



1.2 ประกอบ Sensor Shield V 5.0



1.3 เชื่อมต่อสาย LCD








1.4 ดาวน์โหลด Arduino I2C Library สำหรับ LCD

https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library


1.5 ติดตั้ง I2C Library สำหรับ LCD


1.5.1 เชื่อมต่อสาย USB ระหว่าง คอมพิวเตอร์ กับ บอร์ด Arduino




1.5.2 เปิดโปรแกรม Arduino IDE


1.5.3 ไปที่ Skecth -> Include Library -> Add .ZIP Library...




1.5.4 ไปที่ ไลบรารี Arduino-LiquidCrystal-I2C-library-master.zip ที่เรา ดาวน์โหลด มา -> Open



1.5.5 ตรวจสอบที่ Skecth -> Include Library  จะพบ ไลบรารี Arduino-LiquidCrystal-I2C-library-master เพิ่มเข้ามาใน Arduino IDE ของเรา




1.6 อัพโหลดโค้ด


1.6.1 เขียนโค้ดดังนี้


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
void setup()
{
  
  lcd.begin();
 
  lcd.backlight();
  lcd.print("Hello, world!");
}
 
void loop()
{
  
}

1.6.2 ไปที่ Tools > Board เลือกเป็น Arduino/Genuino UNO




1.6.3 ไปที่ Tools > Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port มากกว่าหนึ่ง  ให้เลือกตัวอื่นที่ไม่ใช่ COM1)

ในตัวอย่างเลือกเป็น "COM6"

(ถ้ายังว่าง หรือ เป็น COM1 ให้ตรวจสอบการติดตั้งไดร์เวอร์ การต่อสาย USB ของ Arduino UNO)



1.6.4 กดปุ่ม  เพื่ออัพโหลด




1.6.5 หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง




1.7 ปรับความสว่างหน้าจอ LCD





2. เชื่อมต่อสาย Fire Extinguisher Sensor

(จะมีแถวเชื่อมต่อ 2 แถว ให้เลือกเชื่อมต่อแถวด้านล่าง)




3. เชื่อมต่อสาย Keyestudio Buzzer





4. ภาพรวมการต่อโปรเจค






5. อัพโหลดโค้ด


/*
    Fire Alarm System with Fire Extinguisher
    For more details visit:
    https://miniarduino.blogspot.com/2019/05/fire.html

*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int sensor[5] = {0, 0, 0, 0, 0};
String my_sensor ;
int buzzer = 8;

void setup ( ) {

  lcd.begin();
  lcd.backlight();
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(buzzer, OUTPUT);
}



void loop ( ) {

  sensor[0] = digitalRead(7);
  sensor[1] = digitalRead(6);
  sensor[2] = digitalRead(5);
  sensor[3] = digitalRead(4);
  sensor[4] = digitalRead(3);

  my_sensor =  "S = " + String(sensor[0]) + "," + String(sensor[1]) + "," + String(sensor[2]) + "," + String(sensor[3]) + "," + String(sensor[4]) + ",";

  if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0)) {

    lcd.setCursor(0, 0);
    lcd.print(my_sensor);
    lcd.setCursor(0, 1);
    lcd.print("NORMAL       ");
  }
  else {

    lcd.setCursor(0, 0);
    lcd.print(my_sensor);
    lcd.setCursor(0, 1);
    lcd.print("FIRE ALARM");
    buzzer_on();
  }

  delay(10);

}

void buzzer_on()

{ unsigned char i, j;

  { for (i = 0; i < 80; i++)

    { digitalWrite(buzzer, HIGH);

      delay(1);//delay1ms
      digitalWrite(buzzer, LOW);
      delay(1);//ms delay

    }

    for (i = 0; i < 100; i++)

    {

      digitalWrite(buzzer, HIGH);
      digitalWrite(buzzer, LOW);
      delay(2);

    }

  }

}


6. อธิบายโค้ด


#include <Wire.h> 
// ให้คอมไพเลอร์นำเฮดเดอร์ไฟล์ (Library Function) ชื่อ Wire.h เข้ามาร่วมในการประมวลผลด้วย

#include <LiquidCrystal_I2C.h>
  
// ให้คอมไพเลอร์นำเฮดเดอร์ไฟล์ (Library Function) ชื่อ LiquidCrystal_I2C.h เข้ามาร่วมในการประมวลผลด้วย

LiquidCrystal_I2C lcd(0x27, 16, 2);
  
// ตั้งค่า Address ของ จอ LCD เป็น 0x27 และให้แสดงผล แบบ 16 ตัวอักษร 2 บรรทัด

int sensor[5] = {0, 0, 0, 0, 0};  // ประกาศตัวแปร 5 เซนเซอร์ แบบอาร์เรย์

String my_sensor ;  // ประกาศตัวแปร my_sensor เป็นข้อมูลชนิดข้อความ

int buzzer = 8;  // ประกาศให้พินดิจิตอล 8 เป็นตัวแปรชื่อ buzzer  มีชนิดของข้อมูลคือ int คือ เลขจำนวนเต็ม 

void setup ( ) { // ฟังก์ชัน setup จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น

  lcd.begin();  // เริ่มการทํางาน จอ LCD

  lcd.backlight();  // ให้จอ LCD แสดงผลเป็นแบบพื้นสีดำ

  pinMode(3, INPUT);  //  ให้ พินดิจิตอล 3 เป็นพินโหมด แบบอินพุท

  pinMode(4, INPUT);  //  ให้ พินดิจิตอล 4 เป็นพินโหมด แบบอินพุท

  pinMode(5, INPUT);  //  ให้ พินดิจิตอล 5 เป็นพินโหมด แบบอินพุท

  pinMode(6, INPUT);  //  ให้ พินดิจิตอล 6 เป็นพินโหมด แบบอินพุท

  pinMode(7, INPUT);  //  ให้ พินดิจิตอล 4 เป็นพินโหมด แบบอินพุท

  pinMode(buzzer, OUTPUT);  //  ให้ buzzer พินดิจิตอล 8 เป็นพินโหมด แบบเอาท์พุท

 
// สิ้นสุดการทำงานของฟังก์ชัน setup



void loop ( ) {  // ฟังก์ชัน loop จะทำงานซ้ำ วนลูป ไปเรื่อยๆ

  sensor[0] = digitalRead(7);  // อ่านค่าข้อมูลจากพินดิจิตอล 7 เก็บไว้ที่ตัวแปรอาร์เรย์ sensor อินเด็กซ์ 0

  sensor[1] = digitalRead(6);  // อ่านค่าข้อมูลจากพินดิจิตอล 6 เก็บไว้ที่ตัวแปรอาร์เรย์ sensor อินเด็กซ์ 1

  sensor[2] = digitalRead(5);  // อ่านค่าข้อมูลจากพินดิจิตอล 5 เก็บไว้ที่ตัวแปรอาร์เรย์ sensor อินเด็กซ์ 2

  sensor[3] = digitalRead(4);  // อ่านค่าข้อมูลจากพินดิจิตอล 4 เก็บไว้ที่ตัวแปรอาร์เรย์ sensor อินเด็กซ์ 3

  sensor[4] = digitalRead(3);  // อ่านค่าข้อมูลจากพินดิจิตอล 3 เก็บไว้ที่ตัวแปรอาร์เรย์ sensor อินเด็กซ์ 4

  my_sensor =  "S = " + String(sensor[0]) + "," + String(sensor[1]) + "," + String(sensor[2]) + "," + String(sensor[3]) + "," + String(sensor[4]) + ",";  // รวมชุดข้อมูลเก็บไว้ที่ตัวแปร my_sensor

  if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0)) {  // ถ้าเซ็นเซอร์ ตรวจจับว่าไม่มีเปลวไฟ ทั้ง 5 เซ็นเซอร์ 

    lcd.setCursor(0, 0);  // เลื่อนเคเซอร์ไปที่ตัวอักษรที่ 0 บรรทัดที่ 1

    lcd.print(my_sensor);  // LCD แสดงผล ชุดข้อมูลที่เก็บไว้ในตัวแปร my_sensor

    lcd.setCursor(0, 1);  // เลื่อนเคเซอร์ไปที่ตัวอักษรที่ 0 บรรทัดที่ 2

    lcd.print("NORMAL       ");  // LCD แสดงผลคำว่า NORMAL

  }
 
else {  //  ถ้า
เซ็นเซอร์ ตรวจจับว่ามีเปลวไฟตัวใดตัวหนึ่งใน 5 เซ็นเซอร์ หรือ อื่นๆ 

    lcd.setCursor(0, 0);  // เลื่อนเคเซอร์ไปที่ตัวอักษรที่ 0 บรรทัดที่ 1

    lcd.print(my_sensor);  // LCD แสดงผล ชุดข้อมูลที่เก็บไว้ในตัวแปร my_sensor

    lcd.setCursor(0, 1);   // เลื่อนเคเซอร์ไปที่ตัวอักษรที่ 0 บรรทัดที่ 2

    lcd.print("FIRE ALARM");  // LCD แสดงผลคำว่า FIRE ALARM

    buzzer_on();   // เรียกใช้ ฟังก์ชัน buzzer_on เพื่อกำเหนิดเสียงแจ้งเตือน

  }

  delay(10); //  หน่วงเวลา 10  มิลลิวินาที

 // สิ้นสุดการทำงานของฟังก์ชัน loop แล้วเริ่มทำงานฟังก์ชัน loop ใหม่ซ้ำไปเรื่อยๆ