ขั้นตอนการทำโปรเจค
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. เชื่อมต่อ
SRF05
3. เชื่อมต่ออุปกรณ์ที่เหลือ ลงใน Mini Breadboard
4. ตัดแจ๊กขั้วถ่านออก แล้วเชื่อมต่อ แจ๊ก เข้ากับ รางถ่าน แล้วจึงเสียบเข้า บอร์ด Arduino เพื่อเป็นไฟเลี้ยงบอร์ด
5. ภาพรวมการต่อโปรเจค
6. อัพโหลดโค้ด
/*
Automatic distance measurement and dimmer with SRF05
For more details visit:
https://miniarduino.blogspot.com/2019/04/srf05.html
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const unsigned int TRIG_PIN = 7;
const unsigned int ECHO_PIN = 6;
const unsigned int LED_PIN = 5;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
const unsigned long duration = pulseIn(ECHO_PIN, HIGH);
int distance_cm = duration / 29 / 2;
int PWM;
lcd.setCursor(0, 0);
lcd.print("Distance = " + String(distance_cm) + " cm ");
if (distance_cm < 101) {
PWM = map(distance_cm, 0, 100, 0, 255);
lcd.setCursor(5, 1);
lcd.print("PWM = " + String(255 - PWM) + " ");
analogWrite(LED_PIN, 255 - PWM);
}
else {
lcd.setCursor(5, 1);
PWM = 255;
lcd.print("PWM = " + String(255 - PWM) + " ");
analogWrite(LED_PIN, 255 - PWM);
}
delay(200);
}
7. อธิบายโค้ด
#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 บรรทัด
const unsigned int TRIG_PIN = 7; // ประกาศให้พินดิจิตอล 7 เป็นตัวแปรชื่อ TRIG_PIN มีชนิดของข้อมูลคือ const คือ ค่าคงที่ , unsigned int คือ เลขจำนวนเต็ม +
const unsigned int ECHO_PIN = 6; // ประกาศให้พินดิจิตอล 6 เป็นตัวแปรชื่อ ECHO_PIN มีชนิดของข้อมูลคือ const คือ ค่าคงที่ , unsigned int คือ เลขจำนวนเต็ม +
const unsigned int LED_PIN = 5; // ประกาศให้พินดิจิตอล 5 เป็นตัวแปรชื่อ LED_PIN มีชนิดของข้อมูลคือ const คือ ค่าคงที่ , unsigned int คือ เลขจำนวนเต็ม +
void setup() { // ฟังก์ชัน setup จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น
lcd.begin(); // เริ่มการทํางาน จอ LCD
lcd.backlight(); // ให้จอ LCD แสดงผลเป็นแบบพื้นสีดำ
pinMode(TRIG_PIN, OUTPUT); // ให้ TRIG_PIN เป็นพินโหมด แบบเอาท์พุท
pinMode(ECHO_PIN, INPUT); // ให้ ECHO_PIN เป็นพินโหมด แบบอินพุท
pinMode(LED_PIN, OUTPUT); // ให้ LED_PIN เป็นพินโหมด แบบเอาท์พุท
} // สิ้นสุดการทำงานของฟังก์ชัน setup
void loop() { // ฟังก์ชัน loop จะทำงานซ้ำ วนลูป ไปเรื่อยๆ
digitalWrite(TRIG_PIN, LOW); // ให้ขา Trig ให้เป็น LOW
delayMicroseconds(2); // หน่วงเวลา 2 ไมโครวินาที
digitalWrite(TRIG_PIN, HIGH); // ให้ขา Trig ให้เป็น HIGH
delayMicroseconds(10); // หน่วงเวลา 10 ไมโครวินาที digitalWrite(TRIG_PIN, LOW); // ให้ขา Trig ให้เป็น LOW
const unsigned long duration = pulseIn(ECHO_PIN, HIGH); // โมดูลเริ่มวัดระยะ แล้วส่งค่าที่วัดได้ออกมาเป็นความกว้างพัลส์ที่ขา Echo และเก็บค่าไว้ในตัวแปร duration
int distance_cm = duration / 29 / 2; // วัดระยะทาง ทั้งขาไปและขากลับโดยการนำตัวแปร duration มาหารด้วย 29 จะได้หน่วยเป็นเซนติเมตร แล้วแปลงให้เหลือขาไปอย่างเดียวโดยการหารด้วย 2 อีกครั้ง และนำค่าที่ได้เก็บไว้ในตัวแปร distance_cm
int PWM; // ประกาศตัวแปร PWM มีชนิดของข้อมูลคือ เลขจำนวนเต็ม
lcd.setCursor(0, 0); // เลื่อนเคเซอร์ไปที่ตัวอักษรที่ 0 บรรทัดที่ 1
lcd.print("Distance = " + String(distance_cm) + " cm "); // แสดงผลคำว่า Distance = ระยะทางที่วัดได้ ตามด้วย หน่วย cm
if (distance_cm < 101) { // ถ้าระยะทางที่วัดได้น้อยกว่า 101 เซนติเมตร
PWM = map(distance_cm, 0, 100, 0, 255); // แปลงค่าระยะทางที่วัดได้ จาก 0 - 100 ให้เป็น 0 - 255 แล้วเก็บค่าไว้ในตัวแปร PWM
lcd.setCursor(5, 1); // เลื่อนเคเซอร์ไปที่ตัวอักษรที่ 5 บรรทัดที่ 2
lcd.print("PWM = " + String(255 - PWM) + " "); // แสดงผลคำว่า PWM = 255 ลบด้วย ค่าตัวแปร PWM
analogWrite(LED_PIN, 255 - PWM); // ให้ LED_PIN ส่งค่าอนาล็อก 0 - 255 ออกไป
}
else { // อื่นๆเช่นระยะทางที่วัดได้ เท่ากับ 101 เซนติเมตร หรือมากกว่า 101 เซนติเมตร ขึ้นไป
lcd.setCursor(5, 1); // เลื่อนเคเซอร์ไปที่ตัวอักษรที่ 5 บรรทัดที่ 2
PWM = 255; // ให้ตัวแปร PWM มีค่าเท่ากับ 255
lcd.print("PWM = " + String(255 - PWM) + " "); // แสดงผลคำว่า PWM = 255 ลบด้วย ค่าตัวแปร PWM
analogWrite(LED_PIN, 255 - PWM); // ให้ LED_PIN ส่งค่าอนาล็อก 0 - 255 ออกไป
}
delay(200); // หน่วงเวลา 200 มิลลิวินาที
} // สิ้นสุดการทำงานของฟังก์ชัน loop แล้วเริ่มทำงานฟังก์ชัน loop ใหม่ซ้ำไปเรื่อยๆ