ผู้เขียนบทความ : กฤษณ์ จันทร์ประทีป COE#15
คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์
วิชา 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง
1.ความเป็นมา
ปัจจุบันปัญหาการหายตัวของเด็กในประเทศไทยเป็นปัญหาที่ต่อเนื่อง ไม่ว่าจะเป็น เด็กผู้ชาย เด็กผู้หญิง ผู้ป่วยที่อยู่ในกระบวนการติดตาม หรือเด็กที่มีความพัฒนาล่าช้าหรือปัญญาอ่อนส่วนใหญ่ประเภทของสถานที่ที่เด็กหายไปมักจะไม่คาดคิดเช่น หน้าบ้าน หน้าโรงเรียน ตลาด
โครงการนี้มีการแก้ไขปัญหาคือการลดจำนวนเด็กที่หลงจากพ่อแม่หรือ ผู้ป่วยที่อยู่ในการติดตามและเด็กที่พัฒนาการล่าช้าโดย ESP32 และ Active Buzzer Module
2. วัตถุประสงค์
1. เพื่อความปลอดภัยของเด็กที่หลงทางกับผู้ปกครอง : โครงการนี้สร้างมาเพื่อนความปลอดภัยของเด็กที่หลงทางกับผู้ปกครอง เมื่อเสียงจาก Buzzer ดังจะเป็นการแสดงตำแหน่งของเด็กที่หลงซึ่งเมื่อเด็กหลงทางผู้ปกครองสามารถปิด Wifi เพื่อให้ Buzzer ดังเพื่อหาตำแหน่งของเด็กได้ทันที
2. เพื่อลดจำนวนของเด็กที่หาย และหลงจากผู้ปกครอง : โครงการนี้จะช่วยให้เด็กที่หลงทางนั้นไม่จำเป็นต้องเดินไปไหนและลดการลูกลักพาตัวของเด็กด้วย
3.ขอบเขต
1. สามารถส่งข้อมูลแจ้งเตือน line notify ได้ : เมื่อผู้ปกครองเชื่อมต่อ Wifi ให้ Esp32 แล้วจะต้องมีข้อความแจ้งเตือนมายังไลน์ว่า Connected
2. สามารถระบุตำแหน่งได้ : สามารถระบุที่อยู่ที่เด็กอยู่ได้โดยเสียงของ Buzzer ได้อย่างชัดเจน
4.ประโยชน์ที่คาดว่าจะได้รับ
จำนวนเด็กที่หลงจากพ่อแม่และเด็กที่ถูกลักพาตัวนั้นน้อยลงและอุปกรณ์นี้สามารถเพิ่มความปลอดภัยให้เด็กที่หลงได้
5.ความรู้ที่เกี่ยวข้อง
1.ESP32 30-pin คือบอร์ดหรือโมดูลที่ใช้ชิพ ESP32 ซึ่งเป็นชิพคอมพิวเตอร์ที่มีความสามารถในการเชื่อมต่อแบบไร้สายและมีความหลากหลายในการให้บริการต่าง ๆ รวมถึงการเชื่อมต่อกับอุปกรณ์และเซนเซอร์ต่าง ๆ ผ่านพอร์ตต่าง ๆ ที่มีอยู่บนบอร์ดนี้
2.Active buzzer (บัซเซอร์แบบแอคทีฟ) คืออุปกรณ์ที่ใช้เป็นเสียงเตือนหรือสัญญาณเสียงในรูปแบบของความถี่ที่สูงของสัญญาณไฟฟ้าที่ได้รับการสั่งให้ทำงาน โดยไม่ต้องมีวงจรสั่งงานเสริม (driver circuit) เพิ่มเติม ในกรณีนี้, สัญญาณไฟฟ้าจะเป็นสัญญาณแบบไฟฟ้าเข็มขัด (digital signal) ที่เปลี่ยนไปตามการควบคุมของไมโครคอนโทรลเลอร์หรือบอร์ดควบคุมอื่น ๆ
#define BUZZER_PIN 21
void setup()
{
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
delay(500);
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Connecting to WiFi...");
delay(500);
}
}
void loop()
{
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Connected to WiFi");
delay(10000);
}
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
delay(100);
digitalWrite(BUZZER_PIN, HIGH);
delay(100);
}
}
บรรทัดโค๊ดในภาพ เป็นการเรียกใช้ฟังก์ชันของ active buzzer เมื่อ active buzzer ไม่ได้เชื่อม ต่อ Wifi จะส่งเสียงดังออกมาเมื่อ เชื่อมต่อ Wifi แล้วเสียงจะเงียบแล้วเมื่อ Wifi หลุด active buzzer จะส่งเสียงออกมา
3.Line Notify เป็นบริการที่ให้ผู้ใช้สามารถส่งการแจ้งเตือนหรือข้อความไปยังแอปพลิเคชัน Line ของตนเองหรือกลุ่มชุมชนผ่านทาง API ของ Line โดยไม่ต้องเปิดแอปพลิเคชัน Line ขึ้นมา นอกจากนี้ยังสามารถตั้งเวลาการแจ้งเตือนหรือทำให้การแจ้งเตือนเกิดขึ้นจากเหตุการณ์ที่เกิดขึ้นในระบบอัตโนมัติได้ด้วย
ในภาพคือพิมพ์ใน Google ว่า line notify แล้วล็อกอิน line เมื่อล็อกอินไลน์แล้ว จะขึ้นหน้านี้มา
กดตรงชื่อไลน์ของเราตรงมุมขวา แล้วกด My page
เมื่อกด My page แล้วจะขึ้นหน้านี้
ให้กดตรงที่ Generate token เพื่อสร้าง Bot ไลน์ขึ้นมา
พิมพ์ชื่อ Bot แล้วเลือก 1-on-1 เพื่อให้ส่งแจ้งเตือนให้เราคนเดียวหรือจะกดกลุ่มไลน์เพื่อให้คนที่อยู่ในกลุ่มไลน์รู้ด้วยก็ได้เมื่อเสร็วให้กด Generate token
จะได้ Token มาให้ Copy Token ไว้เพื่อใช้ในการเขียนโปรแกรม
เมื่อสร้างแล้ว line จะแจ้งเตือนตามภาพ
#include <WiFi.h>
#include <TridentTD_LineNotify.h>
const char* ssid = "***";
const char* password = "******";
const char* lineToken = "*******";
void setup()
{
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
delay(500);
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Connecting to WiFi...");
delay(500);
}
Serial.println("Connected to WiFi");
LINE.setToken(lineToken);
LINE.notify("Connecter");
}
void loop()
{
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Connected to WiFi");
delay(10000);
}
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
delay(100);
digitalWrite(BUZZER_PIN, HIGH);
delay(100);
}
}
บรรทัดโค๊ดในภาพ เป็นการเรียกใช้ฟังก์ชัน line notify + Buzzer เพื่อส่งข้อความว่า Esp32 ได้เชื่อมต่อกับ Wifi แล้วการทำงานของโค๊ดคือ เมื่อ esp32 มี Wifi จะแจ้งเตือนไปยังไลน์ว่า Connected
4.สวิตช์กดติดปล่อยดับ (หรือ Switch On/Off) คือโมดูลที่ถูกใช้ร่วมกับ Esp32 คืออุปกรณ์ที่สามารถให้สัญญาณไฟฟ้าเปลี่ยนแปลงได้เมื่อมีการกดหรือปล่อย.
#include <WiFi.h>
#include <TridentTD_LineNotify.h>
#define BUZZER_PIN 21
#define SW_PIN 4
const char* ssid = "KKK";
const char* password = "31415926536";
const char* lineToken = "PrZVWxgd8h9AUQQoBsnYXzCCKBHjugLTXPtCkv7qKhj";
int lastState = HIGH;
int currentState;
void setup()
{
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
delay(500);
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Connecting to WiFi...");
delay(500);
}
Serial.println("Connected to WiFi");
LINE.setToken(lineToken);
LINE.notify("Connecter");
}
void loop()
{
currentState = digitalRead(SW_PIN);
if (lastState == HIGH && currentState == LOW) {
LINE.notify("Connecter");
Serial.println("กดปุ่ม");
}
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(Led_Green, HIGH);
digitalWrite(Led_Red, LOW);
Serial.println("Connected to WiFi");
delay(10000);
}
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
delay(100);
digitalWrite(BUZZER_PIN, HIGH);
delay(100);
Serial.println("Connecting to WiFi...");
delay(10000);
}
lastState = currentState;
}
โค๊ด ปุ่มใช้เพื่อเช็คสถานะของ Esp32 ว่าเชื่อมต่อหรือไม่หากเชื่อมต่อจะแจ้งเตือนในไลน์ว่า Connected
6.LED (Light Emitting Diode) คืออุปกรณ์ที่สามารถแสดงแสงเป็นผลลัพธ์จากการให้กระแสไฟฟ้าไปผ่านมัน โดย LED มีความสามารถในการแปลงพลังงานไฟฟ้าเป็นแสงและมีการใช้งานที่หลากหลายในหลายแดนมาแล้ว โดยปกติ LED มีสีแดง สีเขียว และสีน้ำเงิน แต่ยังมี LED ที่สามารถแสดงสีอื่น ๆ ได้ รวมถึง LED ที่สามารถปรับสีได้ตามคำสั่ง (RGB LED)
#include <WiFi.h>
#include <TridentTD_LineNotify.h>
#define BUZZER_PIN 21
#define SW_PIN 4
#define Led_Green 27
#define Led_Red 26
const char* ssid = "KKK";
const char* password = "31415926536";
const char* lineToken = "PrZVWxgd8h9AUQQoBsnYXzCCKBHjugLTXPtCkv7qKhj";
int lastState = HIGH;
int currentState;
void setup()
{
Serial.begin(115200);
pinMode(Led_Green, OUTPUT);
pinMode(Led_Red, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(Led_Red, LOW);
delay(500);
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(Led_Red, HIGH);
Serial.println("Connecting to WiFi...");
delay(500);
}
Serial.println("Connected to WiFi");
LINE.setToken(lineToken);
digitalWrite(Led_Red, LOW);
digitalWrite(Led_Green, HIGH);
LINE.notify("Connecter");
}
void loop()
{
currentState = digitalRead(SW_PIN);
if (lastState == HIGH && currentState == LOW) {
LINE.notify("Connecter");
Serial.println("กดปุ่ม");
}
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(Led_Green, HIGH);
digitalWrite(Led_Red, LOW);
Serial.println("Connected to WiFi");
delay(10000);
}
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(Led_Green, LOW);
digitalWrite(Led_Red, LOW);
delay(100);
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(Led_Red, HIGH);
delay(100);
Serial.println("Connecting to WiFi...");
delay(10000);
}
lastState = currentState;
}
โค๊ดของ Led จะเป็นอีก 1 อย่างที่บอกสถานะของ Esp32 ว่าเชื่อมต่อ Wifi หรือไม่โดยหากเมื่อไม่ได้เชื่อมต่อ LED สีแดงจะติดกระพิบแต่หากเชื่อมต่ออยู่ LED สีเขียวจะติดด้าง
6.ผลการดำเนินงาน
ภาพการทำงานของโครงงานเด็กหลง
โค๊ดทั้งหมด
#include <WiFi.h>
#include <TridentTD_LineNotify.h>
#define BUZZER_PIN 21
#define SW_PIN 4
#define Led_Green 27
#define Led_Red 26
const char* ssid = "KKK";
const char* password = "31415926536";
const char* lineToken = "PrZVWxgd8h9AUQQoBsnYXzCCKBHjugLTXPtCkv7qKhj";
int lastState = HIGH;
int currentState;
void setup()
{
Serial.begin(115200);
pinMode(Led_Green, OUTPUT);
pinMode(Led_Red, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(Led_Red, LOW);
delay(500);
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(Led_Red, HIGH);
Serial.println("Connecting to WiFi...");
delay(500);
}
Serial.println("Connected to WiFi");
LINE.setToken(lineToken);
digitalWrite(Led_Red, LOW);
digitalWrite(Led_Green, HIGH);
LINE.notify("Connecter");
}
void loop()
{
currentState = digitalRead(SW_PIN);
if (lastState == HIGH && currentState == LOW) {
LINE.notify("Connecter");
Serial.println("กดปุ่ม");
}
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(Led_Green, HIGH);
digitalWrite(Led_Red, LOW);
Serial.println("Connected to WiFi");
delay(10000);
}
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(Led_Green, LOW);
digitalWrite(Led_Red, LOW);
delay(100);
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(Led_Red, HIGH);
delay(100);
Serial.println("Connecting to WiFi...");
delay(10000);
}
lastState = currentState;
}
การทดลอง
เราจะทดลองจากการเดินทีละก้าวเพื่อเช็คระยะสัญญาณ Wifi ของ Esp32 ว่ากี่ก้าวอุปกรณ์จะทำงาน
โดยที่เราจะใส่รองเท้าในการวัดกาวเพื่อให้ง่ายต่อการคำนวณ รองเท้ามีความยาว 9.84 นิ้วหรือประมาณ 25 เซนติเมตร
วิดีโอการทดลองวัดระยะการทำงานของอุปกรณ์
ผลจากการทดลอง 10 ครั้งตามภาพ
Test การเชื่อมต่อ Wifi
Test การกดปุ่มเช็คสถานะ
7.สรุปผลการทดลอง
1.สรุปผล
จากการทดลองอุปกรณ์แจ้งเตือนเมื่อเด็กหลงสามารถแจ้งเตือนผ่าน Line ทำงานได้อย่างมีประสิทธิภาพตามเงื่อนไขที่ตั้งไว้ active buzzer สามารถส่งเสียงได้อย่างที่ตั้้งใจ
2.ข้อเสนอแนะ
สามารถนำไปต่อยอดโดยการใช้โมดูล GPS มาแชร์ละจิจูดกับลอจิจูดเมื่อระยะห่างของแม่กับลูกไกลตามที่กำหนดไว้จะส่ง ละจิจูดและลองจิจูดไปยังไลน์
3.ปัญหา
เนื่องจากการใช้งานอุปกรณ์ที่น้อยจึงไม่สามารถออกแบบอุปกรณ์ให้ใส่กล่องได้อย่างสวยงามได้
เนื่องจากการเขียนแบบ OOP นั้นค่อนข้างซับซ้อนจึงไม่สามารถเขียนได้ในตอนนี้
8.ข้อมูลอ้างอิง
1.https://ieeexplore.ieee.org/document/10112468