ระบบกดกริ่งแจ้งเตือนไปยังLine และเปิดปิดประตูอัตโนมัติด้วยคำสั่ง

ผู้เขียนบทความ : 035 นายมูฮำหมัดอาริฟีน เจะเฮง COE #15

คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์

วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง 1/2566

1.ความเป็นมา

เนื่องด้วยบางครั้งเมื่อมีบุคคลภายนอกอยู่บริเวณหน้าบ้าน บางครั้งเราอยู่ในบ้านอาจจะไม่สามารถรับรู้ได้ทันที มีเหตุการณ์อะไรที่เกิดขึ้นบ้าง เพราะไม่ได้มีระบบแจ้งเตือนให้กับเราเมื่อมีบุคคลภายนอก หรือมีเหตุการณ์ต่างๆ ที่ไม่สามารถรับรู้ได้ทันที ในปัจจุบันสามารถดูผ่านกล้องวงจรปิดก็จริง แต่เราต้องการที่จะสร้างขึ้นเพื่อตอบสนองความต้องการระบบรักษาความปลอดภัยอัตโนมัติและความสะดวกสบายใจที่ต้องการควบคุมการเข้าออกของบุคคลภายนอก เพื่อนึกถึงความปลอดภัย ในปัจจุบันอินเทอร์เน็ตมีบทบาทสำคัญในการพัฒนาระบบควบคุมและการเข้าถึงต่าง ๆ โดยการใช้ Line เป็นช่องทางหนึ่งในการแจ้งเตือนและการติดต่อสื่อสารกลางระบบมีความสะดวกสบายและความทันสมัย สามารถเพิ่มระดับความปลอดภัย โดยเฉพาะเมื่อมีบุคคลภายนอกเข้ามาในพื้นที่ส่วนตัวของบ้านเรา

ด้วยเหตุนี้ ระบบกดกริ่งและล็อคประตูที่เสนอจึงมีศักยภาพที่จะเป็นประโยชน์ต่อสังคมในหลากหลายวิธี รวมถึงเพิ่มระดับความปลอดภัยและความสะดวกสบายในการตรวจสอบและอนุญาตการเข้าถึงสถานที่ได้อย่างมีประสิทธิภาพ

2.วัตถุประสงค์

2.1 เพื่อเพิ่มระบบความปลอดภัยในการควบคุมการเข้าถึงสถานที่พื้นที่ส่วนตัวในทุกเวลา สามารถระบุตัวตนของบุคคลและกำหนดสิทธิ์ในการเข้าถึง

2.2 เพื่อให้ระบบสามารถบันทึกเหตุการณ์การเปิดประตูและการเข้าถึง ทำให้มีบันทึกประวัติที่สามารถตรวจสอบได้

2.3 เพื่อให้ผู้ใช้สามารถทราบข้อมูลเกี่ยวกับการเข้าถึงและผู้มาเยือนได้ทันที

3.ขอบเขต

3.1 การแจ้งเตือนผ่านLine ระบบสามารถส่งข้อความและรูปภาพแจ้งเตือนไปยังแชทของผู้ใช้ใน Line

3.1.1 เมื่อมีการกดกริ่งระบบจะส่งรูปภาพเป็นแบบเรียลไทม์ รับภาพจากกล้อง ESP32 Cam

3.2 ระบบสามารถเชื่อมต่อกับอินเทอร์เน็ตและเซิร์ฟเวอร์ของ Line เพื่อส่งข้อความและรูปภาพไปยัง Line 

3.3 การควบคุมประตูอัตโนมัติผ่านแอปพลิเคชัน Blynk สามารถเชื่อมต่อกับอินเทอร์เน็ตและทำงานได้ปกติ

3.3.1 รับคำสั่งจากผู้ใช้ ผู้ใช้สามารถเปิดประตูโดยใช้แอปพลิเคชัน Blynk ที่ได้กำหนดการทำงานไว้

4.ประโยช์นที่คิดว่าจะได้รับ

4.1 ทำให้สามารถช่วยในการควบคุมการข้าถึงในพื้นที่ส่วนตัวจากบุคคลภายนอก และทำให้บ้านหรือสถานที่ปลอดภัยมากขึ้น

4.2 ทำให้สามารถดูประวัติบันทึกเหตุการณ์การเข้าถึง และสามารถตรวจสอบได้ในภายหลัง

4.3 ทำให้ผู้ใช้ได้รับการแจ้งเตือนทันทีเมื่อมีผู้มาเยือนหรือมีการกดกริ่ง

5.ความรู้ที่เกี่ยวข้อง

5.1 TridentTD_LineNotify.h

ซึ่งเป็นไลบรารีที่ใช้ในการส่งข้อความทาง LINE Notify และ WiFi.h ซึ่งใช้ในการเชื่อมต่อกับเครือข่าย WiFi ของคุณทำให้ผู้ใช้งานสามารถเขียนโปรแกรมเพื่อสร้างบริการที่ผู้พัฒนาต้องการ ผ่านการส่งข้อความและโต้ตอบกับผู้ใช้ในลักษณะ Chatbot นั่นเอง Line Messaging API มีฟังก์ชันการทำงานมากมาย แต่ที่เราใช้ฟังก์ชันการทำงานคือ การส่งข้อความ สามารถใช้ส่งข้อความแบบข้อความธรรมดา ข้อความรูปภาพ ข้อความวิดีโอ ข้อความเสียง ฯลฯ

ในการสร้างระบบนี้ จำเป็นต้องมี Token ของ Line Messaging API ซึ่งสามารถขอได้จาก Line Developer ข้อความแจ้งเตือนสามารถกำหนดค่าได้ตามต้องการ เช่น ข้อความแจ้งเตือน รูปภาพ หรือวิดีโอ

void Send_line(uint8_t *image_data, size_t   image_size) {            //เป็นการเรียกฟังก์ชันของ Send_line เพื่อให้ส่งข้อมูลภาพเเละขนาด
  LINE.notifyPicture("มีคนมา!!", image_data, image_size);     //ให้ไลน์ส่งรูปภาพมาให้เเชท
}


บรรทัดโค้ดในภาพแสดงการเรียกใช้ฟังก์ชัน LINE.notifyPicture() เพื่อส่งภาพไปยัง LINE ฟังก์ชันนี้ใช้เพื่อส่งข้อมูลภาพไปยังบัญชี LINE ของผู้ใช้

ในบรรทัดโค้ดนี้ ฟังก์ชัน LINE.notifyPicture() จะถูกเรียกโดยใช้อาร์กิวเมนต์สามตัว คือ title message และ imageData ซึ่งระบุหัวเรื่องข้อความ เนื้อหาข้อความ และข้อมูลภาพ

5.2 Line notify

เป็นบริการหนึ่งจากทาง LINE ที่ทำให้สามารถเชื่อมต่อข้อมูลระหว่าง Web service ของเรา กับ LINE และส่งการอัพเดตจาก Web service นั้น ๆมายังแชท LINE ของเราหรือกลุ่ม LINE ได้ทันที และตลอด 24 ชั่วโมง ที่มีการอัพเดต เรียกได้ว่าแจ้งเตือนกันแบบ Real Time

การใช้งานนั้น ถือว่าไม่ซับซ้อน และง่ายต่อการเชื่อมต่อมาก ๆ เพราะเพียงแค่สมัคร แล้วเข้าสู่ระบบผ่าน LINE ของเรา ก็สามารถเริ่มใช้งานได้ทันที ซึ่งวิธีการสร้าง Line notify สำหรับการแจ้งเตือน มีดังนี้

1.เข้าไปที่เว็บไซต์ https://notify-bot.line.me/th/

2. เข้าสู่ระบบด้วยบัญชี Line ของคุณ

3.คลิกที่เมนู “หน้าของฉัน” มุมขวาบน

4.คลิกที่ปุ่ม “ออก Token”

5.ตั้งชื่อ Token และเลือกประเภทการแจ้งเตือนที่ต้องการ

 6.คลิกที่ปุ่ม “ออก Token”

 7.ระบบจะแสดง Token ของคุณ คัดลอก Token เก็บไว้

5.3 esp_camera.h

ซึ่งเป็นไลบรารีที่ใช้ในเป็นไลบรารี่ที่มีความารถสำหรับให้ ESP32 -CAM ทำงานร่วมกับกล้องพื่อควบคุมกล้องและเข้าถึงภาพถ่ายที่ถูกบันทึกไว้ มีการเชื่อมต่อกับกล้อง โดยใช้ฟังก์ชันที่ช่วยในการเชื่อมต่อกับกล้อง จะมีรายละเอียด เช่น  pin ต่าง ๆ, ความถี่, รูปแบบของรูปภาพ ฯลฯ

รายละเอียดของการกำหนดค่าขาของกล้อง ESP32-CAM ได้ถูกทำไว้ดังนี้:

  • PWDN_GPIO_NUM: ขาที่ใช้ในการควบคุมการทำงานของกล้อง
  • RESET_GPIO_NUM: ขาที่ใช้ในการรีเซ็ตกล้อง (ถูกกำหนดเป็น -1 ซึ่งหมายถึงไม่ได้ใช้)
  • XCLK_GPIO_NUM: ขาที่ใช้เป็นตัวจับเวลาของกล้อง
  • SIOD_GPIO_NUM และ SIOC_GPIO_NUM: ขาที่ใช้ในการสื่อสารแบบ I2C ระหว่าง ESP32 กับกล้อง
  • Y2_GPIO_NUM ถึง Y9_GPIO_NUM: ขาที่ใช้ในการรับข้อมูลจากกล้อง
  • VSYNC_GPIO_NUM, HREF_GPIO_NUM และ PCLK_GPIO_NUM: ขาที่ใช้ในการควบคุมการสั่งโหลดข้อมูลจากกล้อง
#include <WiFi.h>        //เรียกใช้ไลบรารี่ WiFi
#include "esp_camera.h"  //เรียกใช้ไลบรารี่ esp_camera
#include "esp_system.h"  //เรียกใช้ไลบรารี่ esp_system
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"

 “esp_system.h” ไฟล์เฮดเดอร์นี้รวมประกาศฟังก์ชันและตัวแปรที่จำเป็นสำหรับการใช้งานระบบ ESP32-CAM ตัวอย่างเช่น ฟังก์ชันนี้จะใช้เพื่อเริ่มต้นระบบ จัดการหน่วยความจำ และเข้าถึงฮาร์ดแวร์

ส่วน soc/soc.h และ soc/rtc_cntl_reg.h ถูกเรียกใช้เพื่อทำการตั้งค่าเกี่ยวกับการตรวจสอบและการควบคุมของ RTC (Real Time Clock)

 // Init Camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {                            //เช็คว่ากล้องเชื่อต่อได้ไหม ถ้าไม่ได้ก็ให้แสดง ERROR
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

โดยใช้ฟังก์ชัน esp_camera_init() ฟังก์ชันนี้ใช้เพื่อตั้งค่าพารามิเตอร์ต่างๆ ของกล้อง เช่น ความละเอียดของภาพ อัตราเฟรม และรูปแบบไฟล์ ฟังก์ชันนี้จะส่งคืนค่า esp_err_t ซึ่งบ่งชี้ว่าการดำเนินการเสร็จสมบูรณ์หรือไม่

ในบรรทัดโค้ดนี้ ฟังก์ชัน esp_camera_init() จะถูกเรียกโดยใช้อาร์กิวเมนต์ &config ซึ่งชี้ไปยังโครงสร้างข้อมูล esp_camera_config_t โครงสร้างข้อมูลนี้ประกอบด้วยพารามิเตอร์ต่างๆ ของกล้อง เช่น ความละเอียดของภาพ อัตราเฟรม และรูปแบบไฟล์

หากฟังก์ชัน esp_camera_init() เสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด โปรแกรมจะดำเนินการต่อไปยังบรรทัดถัดไป หากฟังก์ชันนี้ล้มเหลว โปรแกรมจะแสดงข้อความข้อผิดพลาดบนพอร์ตอนุกรม

 camera_fb_t * fb = NULL;                //เครียการเก็บข้อมูลรูปภาพให้ว่าง       
  delay(200);
  // Take Picture with Camera
  fb = esp_camera_fb_get();               //ถ่ายรูปแล้วเก็บใว้ใน fb
  
  if (!fb) {                              //เช็ค ถ้าหาก fb มีข้อผิดพลาดก็ให้แสดง Camera capture failed
    Serial.println("Camera capture failed");
    return;
  }

โดยใช้ฟังก์ชัน esp_camera_fb_get() ฟังก์ชันนี้ใช้เพื่อรับข้อมูลภาพจากกล้อง ข้อมูลภาพจะถูกเก็บไว้ในโครงสร้างข้อมูล camera_fb_t ซึ่งประกอบด้วยข้อมูลต่างๆ เช่น ข้อมูลเมตาของภาพ ข้อมูลพิกเซลของภาพ และขนาดของภาพ

ในบรรทัดโค้ดนี้ ฟังก์ชัน esp_camera_fb_get() จะถูกเรียกโดยไม่มีค่าอาร์กิวเมนต์ใดๆ ฟังก์ชันนี้จะใช้ค่าพารามิเตอร์เริ่มต้นที่กำหนดไว้ในโครงสร้างข้อมูล esp_camera_config_t

หากฟังก์ชัน esp_camera_fb_get() เสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด ตัวแปร fb จะถูกตั้งค่าให้ชี้ไปยังโครงสร้างข้อมูล camera_fb_t ซึ่งประกอบด้วยข้อมูลภาพ โปรแกรมสามารถเข้าถึงข้อมูลภาพได้จากตัวแปร fb

หากฟังก์ชัน esp_camera_fb_get() ล้มเหลว ตัวแปร fb จะยังคงมีค่าเป็น NULL โปรแกรมสามารถตรวจสอบค่าตัวแปร fb เพื่อตรวจสอบว่าถ่ายภาพสำเร็จหรือไม่

5.4 Internet of things (IoT)

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

IoT ช่วยให้อุปกรณ์ต่างๆ สามารถสื่อสารและทำงานร่วมกันได้อย่างอัตโนมัติ ซึ่งสามารถนำไปประยุกต์ใช้ได้ในหลากหลายอุตสาหกรรมและกิจกรรมต่างๆ ตัวอย่างการใช้งาน IoT ในปัจจุบัน เช่น

  • บ้านอัจฉริยะ: อุปกรณ์ต่างๆ ภายในบ้าน เช่น หลอดไฟ เครื่องปรับอากาศ ประตูหน้าต่าง สามารถควบคุมและสั่งการได้จากระยะไกล
  • รถยนต์อัจฉริยะ: รถยนต์สามารถเชื่อมต่อกับอินเทอร์เน็ตและอุปกรณ์ต่างๆ บนท้องถนน เพื่อความปลอดภัยและประสิทธิภาพในการขับขี่
  • ระบบขนส่งอัจฉริยะ: ระบบขนส่งสาธารณะสามารถเชื่อมต่อกับอุปกรณ์ต่างๆ เพื่อติดตามสถานะและคาดการณ์ความแออัด
  • การเกษตรอัจฉริยะ: เซ็นเซอร์สามารถตรวจวัดสภาพอากาศ ความชื้น และปริมาณน้ำในดิน เพื่อเพิ่มผลผลิตทางการเกษตร
  • การดูแลสุขภาพระยะไกล: ผู้ป่วยสามารถติดตามสุขภาพของตนเองได้จากที่บ้าน

ดังนั้น ระบบที่ผมสร้างขึ้นผมใช้ความรู้ในส่วนของIoT เข้ามาเพื่อสามารถควบคุมอุปกรณ์ต่างๆของ อิเล็กทรอนิกส์ และสามารถสื่อสารให้ทำงานร่วมกันได้ ดังภาพ

6.ผลการดำเนินการ

Diagramของระบบ เป็นภาพรวมการทำงานของระบบ เพื่อทำให้เข้าใจการทำงานของระบบมากขึ้น

การทำงานของระบบนี้ จะทำงานแยกเป็น 2 ส่วน ดังนี้

ส่วนที่ 1 จะเป็นการทำงานเมื่อกดกริ่ง ส่งสัญญาณ HIGH เพื่อทำการประมวลผลภาพจากกล้อง ESP32-CAM ส่งข้อมูลการรับภาพที่ได้จากการกดกริ่งไปประมวลภาพ เพื่อที่จะส่งผ่าน Line ทำการแจ้งเตือนตามเงื่อนไข

ส่วนที่ 2 การทำงานของการควบคุมประตูจะเป็นของ ESP32 ที่เชื่อมต่อกับ Blynk ที่ทำหน้าที่ใช้คำสั่งในการควบคุมการเปิดปิดประตู ผ่านตัวล็อค solenoid lock door จะทำงานเมื่อได้รับคำสั่งการเปิด-ปิดผ่าน Blynk

โค้ดในส่วนของการทำงานรับรูปภาพภาพและแจ้งเตือนผ่าาน Line ESP32-CAM

#include <WiFi.h>        //เรียกใช้ไลบรารี่ WiFi
#include "esp_camera.h"  //เรียกใช้ไลบรารี่ esp_camera
#include "esp_system.h"  //เรียกใช้ไลบรารี่ esp_system
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"

hw_timer_t *timer = NULL;  //เป็นการเตรีย hw_timer_t ให้ว่าง
void IRAM_ATTR resetModule() {  //ฟังชั่น การรีเซ็ตหรือรีบูตของตัว esp
  ets_printf("reboot\n");
  esp_restart();
}
#include <TridentTD_LineNotify.h>
#define SSID        "POCO F3"        // WiFi name
#define PASSWORD    "0997015275"            // PASSWORD
#define LINE_TOKEN  "2SNn81yzLMQQhUst3ffMXHPgTOBIWtKmXERTkh9kRqD" // TOKEN

// Pin definition for CAMERA_MODEL_AI_THINKER    กำหนดขาของกล้องที่จะใช้ทั้งหมดเลย
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22
#define sw 14                     //ประกาศตัวเเปร sw ให้เป็นขา 12  (ต่อ sw เเบบ Pull down คือถ้ากด sw ก็จะอ่านค่าได้ 1 หรือ HIGH)
int sw1;                          //ประกาศตัวแปร sw1   
const int Led_Flash = 4;          //ประกาศตัวแปร เเฟลซกล้อง
const int Led_run = 13;  
int PIR_Sensor = 12;
boolean startTimer = false;
unsigned long time_now = 0;
int time_capture = 0;

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable detector
  pinMode(sw,INPUT);               //ประกาศสถานะ sw เป็น INPUT
  Serial.begin(115200); 
  while (!Serial) {
    ;
  }
  pinMode(Led_Flash, OUTPUT);              //ประกาศสถานะแฟลซกล้อง เป็น OUTPUT
  pinMode(Led_run, OUTPUT);
  WiFi.begin(SSID, PASSWORD);              //เรียกใช้งาน WiFi ให้เชื่อมต่อ WiFi
  Serial.printf("WiFi connecting to %s\n",  SSID);    //แสดงชื่อ WiFi ที่จะเชื่อมต่อ     
  while (WiFi.status() != WL_CONNECTED) {             //เช็คว่า WiFi ต่อติดหรือไม่ถ้าไม่ติดก็ให้แสดง "."
    Serial.print(".");          
    delay(400);
  }
  Serial.printf("\nWiFi connected\nIP : ");           //เเสดง IP เมื่อเชื่อมต่อได้
  Serial.println(WiFi.localIP());
  LINE.setToken(LINE_TOKEN);

  timer = timerBegin(0, 80, true);                   //timer 0, div 80Mhz
  timerAttachInterrupt(timer, &resetModule, true);
  timerAlarmWrite(timer, 20000000, false);           //set time in us 15s
  timerAlarmEnable(timer);                           //enable interrupt

  camera_config_t config;                            //คำสั่ง config ของกล้อง ทั้งหมดเลย
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;

  if (psramFound()) {
    config.frame_size = FRAMESIZE_VGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  }     else {
    config.frame_size = FRAMESIZE_QQVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // Init Camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {                            //เช็คว่ากล้องเชื่อต่อได้ไหม ถ้าไม่ได้ก็ให้แสดง ERROR
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
}
void loop() {
 
  sw1 = digitalRead(sw);              //อ่านค่า sw ไปเก็บที่ sw1 
  Serial.print("sw = ");              //แสดงค่า sw1 ว่าเป็น 0 หรือ 1 ในเวลานั้น (ถ้าเป็น 1 = sw ถูกกด เเต่ถ้าเป็น 0 = sw ไม่ถูกกด)
  Serial.println(sw1);
  delay(100);

  timerWrite(timer, 0);               //reset timer (feed watchdog)
  long tme = millis();
  if (sw1 == 1 && startTimer != true) {   //เช็ค sw1 ว่าเป็น 1 หรือไม่ เเละนำไปเช็คกับ startTimer
    Camera_capture();                     //คำสั่งให้กล้องทำงาน
    Serial.println("OK");                 //ให้แสดง OK เพื่อดูว่าถ่ายภาพเเล้วหรือยัง
    startTimer = true;                    //เปลียน startTimer ไปเป็น true เพื่อ ไม่ให้วนกลับมาถ่ายรูปใหม่
  } else if (sw1 == 0) {                  //เช็ค sw1 ว่าเป็น 0 หรือไม่
    startTimer = false;                   //เปลียน startTimer ไปเป็น false เพื่อ ไม่ให้วนกลับมาถ่ายรูปใหม่
    time_capture = 0;                     
  }
}

void Camera_capture() {
  digitalWrite(Led_Flash, HIGH);          //สั่งให้เปิด Flash  
  delay(100);                             //หน่วงเวลา
  digitalWrite(Led_Flash, LOW);           //สั่งให้ปิด Flash
  delay(100);                             //หน่วงเวลา
  digitalWrite(Led_Flash, HIGH);          //สั่งให้เปิด Flash
  camera_fb_t * fb = NULL;                //เครียการเก็บข้อมูลรูปภาพให้ว่าง       
  delay(200);
  // Take Picture with Camera
  fb = esp_camera_fb_get();               //ถ่ายรูปแล้วเก็บใว้ใน fb
  
  if (!fb) {                              //เช็ค ถ้าหาก fb มีข้อผิดพลาดก็ให้แสดง Camera capture failed
    Serial.println("Camera capture failed");
    return;
  }
 
  digitalWrite(Led_Flash, LOW);           //สั่งให้ปิด Flash
  esp_camera_fb_return(fb);               //เพื่อคืนบัฟเฟอร์รูปภาพหลังจากใช้งาน
  delay(500);
  Send_line(fb->buf, fb->len);            //เป็นการเรียกฟังก์ชันของ Send_line เพื่อให้ fb ส่งข้อมูลไปยัง buf เเละ len
  
  Serial.println("LOW");                  //แสดง LOW เพื่อให้รู้ว่าคำสั่งข้างบนถูกทำงาน
}

void Send_line(uint8_t *image_data, size_t   image_size) {            //เป็นการเรียกฟังก์ชันของ Send_line เพื่อให้ส่งข้อมูลภาพเเละขนาด
  LINE.notifyPicture("มีคนมา!!", image_data, image_size);     //ให้ไลน์ส่งรูปภาพมาให้เเชท
}

โค้ดในส่วนของการทำงานควบคุมเปิดปิด Solenoid lock door


#define BLYNK_TEMPLATE_ID           "TMPL6vPA9wzzO"
#define BLYNK_TEMPLATE_NAME         "Quickstart Template"
#define BLYNK_AUTH_TOKEN            "9ku5u03AvLKz7j-fZvZ1gYnL--nifN3S"


#define BLYNK_PRINT Serial


#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "POCO F3";
char pass[] = "0997015275";

BlynkTimer timer;

#define SOLENOID_PIN 13


BLYNK_CONNECTED()
{
  
  Blynk.setProperty(V3, "offImageUrl", "https://static-image.nyc3.cdn.digitaloceanspaces.com/general/fte/congratulations.png");
  Blynk.setProperty(V3, "onImageUrl",  "https://static-image.nyc3.cdn.digitaloceanspaces.com/general/fte/congratulations_pressed.png");
  Blynk.setProperty(V3, "url", "https://docs.blynk.io/en/getting-started/what-do-i-need-to-blynk/how-quickstart-device-was-made");
}


void myTimerEvent()
{
  Blynk.virtualWrite(V2, millis() / 1000);
}

void setup()
{
  pinMode(13,INPUT);
  Serial.begin(115200);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  pinMode(SOLENOID_PIN, OUTPUT);
  
  timer.setInterval(1000L, myTimerEvent);
}

void loop()
{
  byte sn = digitalRead(13);
  if(sn == HIGH){
    Serial.println("Solenoid : ON");
  }
  else{
    Serial.println("Solenoid : OFF");
  }
  Blynk.run();
  timer.run();
  
}

การทดลอง

การทดลองที่ 1 ทดลองในส่วนของการแจ้งเตือนรูปภาพไปยังไลน์ โดยการทำงานรับภาพและส่งรูปภาพ โดยการทำการทดลองกดปุ่มกริ่ง 20 ครั้ง เพื่อตรวจสอบกากรทำงานบันทึกการแจ้งเตือนส่งรูปภาพ 20 ครั้ง หลังจากนั้นคิดเป็นร้อยละ

ผลการทดลองที่ได้

การทดลองที่ 2 ทดลองตัวล็อค โดยการทำงานในส่วนของการควบคุมการเปิดปิด ทดลองการกดคำสั่งเปิดปิด 20 ครั้ง เพื่อตรวจสอบการเปิด 20 ครั้ง และปิด 20 ครั้ง

ผลการทดลองที่ได้

7.สรุปผลและข้อเสนอแนะ

1.สรุปผล
จากผลการทดลองระบบกดกริ่งถ่ายรูปแจ้งเตือนผ่านLine และควบคุมเปิดประตูอัตโนมัติผ่าน Blynk ทำงานได้อย่างมีประสิทธิภาพตรงตามเงื่อนไขตามที่ทดลองไว้ กล้องสามารถส่งรูปภาพแบบเรียลไทม์ได้อย่างรวดเร็ว ผลที่ได้คือ มีความถูกต้องการประมวผลภาพ คือ ร้อยละ 95 ในส่วนของการควบคุมตัวล็อคเปิดปิด มีความสเถียรถูกต้อง ผลที่ได้คือ ความถูกต้องของการควบคุมเปิดปิดประตู คือ ร้อยละ 100

2.ข้อเสนอแนะ
2.1 สามารถนำชิ้นงานไปต่อยอด เพื่อเพิ่มความปลอดภัยภายในบ้านหรือภายในอาคาร ในการจัดการเข้าถึงจากบุคคลภายนอก โดยอาจจะเปลี่ยนใช้กล้อง IP Camera ในการรับรูปภาพแทน ESP32-CAM เพื่อให้ได้รูปภาพที่มีคุณภาพมากกว่านี้
2.2 สามารถประยุกต์ใช้งาน ในส่วนควบคุมการเปิดปิดด้วย BOT Line ผ่านตัวกลาง MQTT เป็นโปรโตคอลการส่งข้อความที่อิงตามมาตรฐาน ใช้สำหรับการสื่อสารระหว่างเครื่องต่อเครื่อง

8.ข้อมูลอ้างอิง

8.1 ต้นฉบับ
R. JOSPHINELEELA, D. LEKHA, L. NATRAYAN และ K. C. PUROHIT, “BIOMETRIC AIDED INTELLIGENT SECURITY SYSTEM BUILT USING INTERNET OF THINGS,” 2023 SECOND INTERNATIONAL CONFERENCE ON ELECTRONICS AND RENEWABLE SYSTEMS (ICEARS), TUTICORIN,INDIA,2023,PP.548551,DOI:10.1109/ICEARS56392.2023.10085572. สืบค้นจาก https://ieeexplore.ieee.org/document/10085572

8.2 ESP32-CAM
8.2.1 MagiDIY ( 16 มิถุนายน 2019 ) DIY กดกริ่ง ถ่ายรูปแจ้เตือนไปLine Notify [ Video file]
สืบค้นจาก https://www.youtube.com/watch?v=ZdfAqEL5pHk&t=98s
8.2.2 Kodnatthaphat Uthai ( 06 Aprill 2020 ) ESP 32 CAM
Ultrasonic + Line Notify
สืบค้นจาก https://medium.com/@kungslowjam/esp-32-cam-ultrasonic-line-notify-55e4333d0120

8.3 Solenoid lock door
8.3.1 Pradeep ( 17 กรกฎาคม 2021 ) Smart WiFi Controlled Door Lock system using ESP32
สืบค้นจาก https://www.youtube.com/watch?v=dVWisvdzj5I&t=2s

8.4 Line notify
8.3.1 Tattiphong Wongsawan ( Mar 3, 2020 ) สอนใช้ “LINE Notify” สร้างการแจ้งเตือนส่งตรงถึงแชทคุณ!
สืบค้นจากสอนใช้ “LINE Notify” สร้างการแจ้งเตือนส่งตรงถึงแชทคุณ! | by Tattiphong Wongsawan | Artisan Brain Academy | Medium




วิดีโอนำเสนอการทำงานของระบบกดกริ่งแจ้งเตือนไปยังLine และเปิดปิดประตูอัตโนมัติด้วยคำสั่ง

https://www.youtube.com/watch?v=-F9QPJyL75s

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *