IMPLEMENTASI METODE DETEKSI WAJAH SEBAGAI
SISTEM MONITORING SECARA REALTIME KEBERADAAN
DAN ABSENSI TENAGA SATUAN KEAMANAN BERBASIS IoT
LAPORAN TUGAS AKHIR
Sebagai Salah Satu Syarat untuk Memperoleh gelar Ahli Madya
Teknik dari Politeknik Negeri Padang
Oleh :
HARIS MARDIAS
BP. 2311019007
PROGRAM STUDI DIV TEKNIK ELEKTRONIKA
JURUSAN TEKNIK ELEKTRO
POLITEKNIK NEGERI PADANG
2025
IMPLEMENTASI METODE DETEKSI WAJAH SEBAGAI
SISTEM MONITORING SECARA REALTIME KEBERADAAN
DAN ABSENSI TENAGA SATUAN KEAMANAN BERBASIS IoT
Oleh:
HARIS MARDIAS
BP. 2311019007
Diperiksa dan disahkan oleh:
Pembimbing 1
Pembimbing 2
Andrizal, ST.,MT
NIP. 19691005 199501 2 001
Dedi Kurniadi, S.ST.,M.Sc
NIP.19681129 199303 2 001
Mengetahui :
Ketua jurusan
Teknik Elektro
Koordinator Program Studi
DIV Teknik Elektronika
Ismail, Ph.D
NIP.19731026 200312 1 001
Anton Hidayat,ST.,MT
NIP.19761025 200501 1 009
ii
HALAMAN PENGESAHAN
Tugas akhir yang berjudul Implementasi metode deteksi wajah sebagai sistem
monitoring secara realtime keberadaan absensi tenaga satuan keamanan berbasin IoT
ini telah disidangkan atau dipertanggungjawabkan di depan tim penguji sebagai
berikut, pada hari tanggal
Di Program Studi DIV Teknik Elektronika Jurusan Teknik Elektro Politeknik Negeri
Padang.
No
Nama
Jabatan
Nama Ketua Penguji
Ketua
Tanda Tangan
1
NIP
2
Nama Sekretaris Penguji
Sekretaris
NIP
3
Nama Anggota Penguji
Anggota
NIP
4
Nama Anggota Penguji
Anggota
NIP
Mengetahui:
Ketua Jurusan Teknik Elektro
Koordinator Program Studi
DIV Teknik Elektro
Nama
Nama
NIP
NIP
iii
IMPLEMENTASI METODE DETEKSI WAJAH SEBAGAI
SISTEM MONITORING SECARA REALTIME KEBERADAAN
DAN ABSENSI TENAGA SATUAN KEAMANAN BERBASIS IoT
Oleh : Haris Mardiah
Pembimbing 1. Andrizal, ST.,MT, Pembimbing 2. Dedi Kurniadi, S.ST.,M.Sc
ABSTRAK
Implementasi efisiensi perusahaan pada era digitalisasi sudah mengedepankan peran
teknologi pada semua ruang lingkup proses bisnisnya. Hal yang paling sering
ditemukan adalah layanan aplikasi menggunakan teknologi pengenalan wajah seperti
otentifikasi sebuah layanan online, analisis data dan lain-lain. Bahkan dalam presensi
juga membutuhkan validasi data yaitu salah satunya dengan metode Face Recognition
maupun Face Detection. Dalam penelitian ini, penulis mencoba mengimplementasikan
2 hal tersebut (Face Recogniton/Face Detection) pada sistem scanning wajah dengan
menggunakan Camera webcam berbasis IoT (Internet of Thing). Implementasi ini
mayoritas dapat diimplemetasikan seperti yang akan penulis terapkan dalam Scanning
Presensi dan Patroli Security (Satpam) di kantor.
Penelitian ini bertujuan untuk mengembangkan sistem pengenalan wajah yang efisien
dan real-time dengan mengimplementasikan perangkat camera webcam dan
mikrokontrol yang berbasis Internet of Things (IoT). Sistem ini dirancang untuk
melakukan monitoring dan evaluasi performa tim security dalam melaksanakan jadwal
piket, patroli keliling, dan mengukur jumlah jam kerja security yang akan berdampak
pada perhitungan jam kerja, gaji dan serta evaluasi SLA (Service Level Agreement)
dengan pihak perusahaan pengadaan jasa terkait.
Kata Kunci:
iv
KATA PENGANTAR
Puji dan syukur penulis ucapkan kehadirat Allah SWT karena atas segala ramat dan
karunia-Nya, penulis telah dapat menyelesaikan laporan tugas akhir ini yang berjudul
“Implementasi Metode Deteksi Wajah Sebagai Sistem Monitoring
Secara Realtime Keberadaan Dan Absensi Tenaga Satuan Keamanan
Berbasis Iot”. Shalawat serta salam semoga selalu Allah SWT curahkan kepada
Ukhuwah dan Quduwah kita, Rasulullah Muhammad SAW beserta para sahabat,
keluarga, dan semua umatnya yang selalu berusaha untuk istiqomah pada jalan-Nya.
Adapun tujuan dari penyusunan laporan tugas akhir ini adalah sebagai persyaratan
dalam kelulusan mahasiswa tingkat akhir agar dapat memperoleh gelar sarjana muda
ahli madya dari Politeknik Negeri Padang. Terlaksananya penyusunan laporan ini
tidak terlepas dari bantuan berbagai pihak. Untuk itu pada kesempatan ini penulis
menyampaikan banyak terima kasih kepada :
1. Kedua Orang Tua, Istri Martina Ningsih, SE serta keluarga tercinta yang telah
memberikan dukungan, do’a dan berbagai motivasi sehingga penulis dapat
menyelesaikan laporan tugas akhir ini.
2. Bapak Surfa Yondri,ST.,MT selaku Direktur Politeknik Negeri Padang.
3. Bapak Ismail,S.ST.,MT selaku Ketua Jurusan Teknik Elektro Politeknik Negeri
Padang.
4. Bapak Anton Hidayat,ST.,MT selaku Ketua Program Studi DIV Teknik
Elektronika Politeknik Negeri Padang.
v
5. Bapak Andrizal ST, MT selaku Pembimbing 1 yang telah memberikan arahan dan
bimbingan dalam penyelesaian tugas akhir ini.
6. Dedi Kurniadi, S.ST.,M.Sc selaku Pembimbing 2 yang telah memberikan arahan
dan bimbingan dalam penyelesaian tugas akhir ini.
7. Seluruh staf pengajar, staf teknisi, dan staf administrasi di Jurusan Teknik Elektro.
8. Seluruh teman-teman seangkatan DIV Alih Kredit angkatan 2023.
9. Semua pihak yang telah membantu penulis sampai laporan ini selesai yang tidak
dapat penulis sebutkan satu persatu.
Penulis berharap semoga laporan tugas akhir ini dapat bermanfaat bagi penulis
khususnya dan bagi pembaca umumnya. Sekiranya ada kesalahan dalam penulisan
laporan ini, penulis mengharapkan masukkan dan saran yang membangun demi
kesempurnaan laporan ini.
Padang, Agustus 2025
Haris Mardias
vi
DAFTAR ISI
KATA PENGANTAR ..............................................................................................V
ABSTRAK ...............................................................................................................IV
DAFTAR ISI............................................................................................................. VI
DAFTAR GAMBAR ................................................................................................ VI
DAFTAR TABEL ................................................................................................... IX
LAMPIRAN ............................................................................................................. 45
BAB I PENDAHULUAN .........................................................................................1
1.1 Latar Belakang .....................................................................................................1
1.2 Rumusan Masalah ................................................................................................2
1.3 Batasan Masalah...................................................................................................3
1.4 Maksud dan Tujuan ..............................................................................................5
1.5 Manfaat Penulisan ................................................................................................7
1.6 Metodologi Penyelesaian Tugas Akhir ................................................................7
1.7 Sistematika Penulisan ..........................................................................................8
BAB II LANDASAN TEORI ..................................................................................7
2.1 Sistem Keamanan .................................................................................................7
2.2 Perangkat dan Sistem ...........................................................................................8
BAB III METODOLOGI PENELITIAN .............................................................. 26
3.1 Metode Perancangan dan Pembuatan Alat .......................................................... 26
3.2 Alat dan Bahan .................................................................................................... 27
3.3 Blok Diagram Sistem Keseluruhan ..................................................................... 27
3.4 Prinsip Kerja Alat ................................................................................................28
3.5 Perancangan dan Pembuatan Perangkat Lunak ..................................................29
3.6 Inisiasi Perancangan ............................................................................................33
3.7 Cara Pengoperasian Alat .....................................................................................34
vii
BAB IV ANALISA DATA ...................................................................................... 36
4.1 Deskripsi dataset dan karakteristik awal .............................................................. 36
4.2 Proses ekstraksi fitur dan keputusan pengenalannya ........................................... 37
4.3 Error analysis: sumber kesalahan dan bukti empiris ...........................................38
4.4 Dampak jadwal shift terhadap klasifikasi status absensi ....................................39
4.5 Integrasi Data Absensi ke Google Spreadsheet dan telegram melalui ESP .........40
BAB V PENUTUP ....................................................................................................43
5.1 Kesimpulan ..........................................................................................................43
5.2 Saran .....................................................................................................................44
DAFTAR PUSTAKAN ............................................................................................45
viii
DAFTAR GAMBAR
Gambar 2.1 Gambar rancangan implementasi metode face detection ...............8
Gambar 2.2 Hasil Proses Face Recognition ...........................................................12
Gambar 2.3 Camera webcam..................................................................................13
Gambar 2. 4 Mikrokontroler ESP 32 .......................................................................16
Gambar 2.5 Aplikasi Arduino.................................................................................16
Gambar 2.6. Konsep IoT .........................................................................................17
Gambar 2.7. Aplikasi Visual Studio Code .............................................................19
Gambar 2.8. Open CV display ................................................................................20
Gambar 3. 1 Blok Diagram Sistem ...........................................................................27
Gambar 3.5.1 Flowchart Sistem ..............................................................................30
Gambar 3.5.2 Blok Diagram Folder .......................................................................31
Gambar 3.6 Inisiasi Perancangan...........................................................................33
Gambar Foto Folder Satpam ..................................................................................37
Gambar snapshoot error .........................................................................................43
Gambar header di Google Spreadsheet ..................................................................40
Gambar code appscript ...........................................................................................42
ix
DAFTAR TABEL
Tabel 4.4 potensi edge-case ......................................................................................39
x
BAB I
PENDAHULUAN
1.1 Latar Belakang
Saat ini hampir semua aspek sudah dikendalikan dan dikontrol secara
digital, mulai dari perbankan, sistem operasi, logistik bahkan sistem keamanan
sebuah perusahaan. Semua aspek tersebut pada masa digitalisasi atau revolusi
4.0 terhubungnya segala kegiatan kita secara digital tentu akan menggeser
beberapa pekerjaan yang bisa digantikan oleh teknologi dan terintegrasi dengan
Jaringan Internet. Seperti tukang tiket yang menjual tiket secara offline kini
hilang sebab kita bisa memesan melalui aplikasi langsung di ponsel pintar kita.
(https://binus.ac.id/character-building/2023/02/akankah-teknologimenggantikan-pekerjaan-manusia), diakses pada 20 Juli 2024.
Sistem keamanan yang maksimal merupakan hal penting yang mutlak
ada pada setiap tempat. Hunian, perkantoran, pabrik, ruko, pusat perbelanjaan,
sekolah, hingga jalanan, semua membutuhkan media pendukung keamanan
karena tindak kejahatan dan berbagai kondisi bahaya lainnya bisa terjadi kapan
saja dan di mana saja. Terlebih untuk tempat-tempat bisnis seperti perkantoran,
pabrik, pusat perbelanjaan dan sebagainya seringkali menjadi sasaran empuk
para oknum jahat untuk mencuri berbagai aset penting di dalamnya.
(https://fingerspot.com/news/pentingnya-realtime-pantau-patroli-securityuntuk-maksimalkan-keamanan-tempat-usaha) diakses tanggal 20 Juli 2024.
Tanpa pengecualian, digitalisasi juga diterapkan dalam pelaksanaan
sistem patroli keamanan. Dimana untuk berjalannya sistem patroli keamanan
yang terukur dan konsisten, diperlukan suatu sistem atau perangkat pendukung
1
agar sistem pengamanan tersebut sesuai dengan ide gagasan.
Penulis mengambil sampling saat ini pengamanan sistem yang ada di
Kantor PLN ULP Tabing, masih sebatas pengamanan dengan pelaporan secara
manual dengan eviden melalui Group Whatsapp namun kegiatan dan tidak
terdokumentasikan secara otomatis dan kontiniu.
1.2 Perumusan Masalah
Berdasarkan latar belakang diatas maka dapat dirumuskan permasalahan
sebagai berikut:
1. Pelaksanaan piket keamanan oleh petugas satpam kurang maksimal
terutama absensi masuk dan keluar tidak termonitor secara detail
disamping itu pelaporan hanya di Whatsapp Group.
2. Penanggung jawab pelaksanaan Piket Satpam diawasi oleh Team Leader
K3L Yan Gan tanpa ada staff dibidang tersebut, sementara mobilisasi
pekerjaan TL K3L yan Gan lebih dominan diluar kantor dan terkadang
tidak termonitor secara update.
3. Merancang sistem absensi satpam yang dapat mendeteksi dan mengenali
wajah menggunakan webcam dengan metode deteksi wajah menggunakan
aplikasi Phython
4. Absensi dapat terkirim otomatis ke Google Spreadsheet dan layanan
Telegram secara Real-Time dengan menggunkan mikrokontroler ESP32.
2
1.3 Batasan Masalah
Didalam penelitian ini penulis menemukan beberapa batasan masalah yang
diuraikan sebagai berikut :
1. Lingkungan operasi
Sistem absensi dengan metode deteksi wajah ini sangat bergantung pada:
- Koneksi internet stabil untuk komunikasi antara ESP32, Python, Google
SpreedSheets, dan Telegram.
- Kualitas pencahayaan yang memadai di area kamera. Pencahayaan
rendah atau kualitas gambar buruk dapat menurunkan akurasi deteksi
dan identifikasi wajah.
2. Perangkat Keras
-
Kamera utama yang digunakan adalah Webcam Logitech 4K.
-
Mikrokontroler jenis ESP32 hanya berfungsi sebagai gateway IoT untuk
pengiriman data notifiksi.
3. Struktur Data dan Konfigurasi
-
Data jadwal shift (SHIFT_SCHEDULE dan SHIFT_TIME_CONFIG)
serta data pribadi satpam (satpam_details) masih bersifat statis dan
hardcode dalam script Python.
-
Perubahan jadwal atau penambahan personel satpam memerlukan
modifikasi manual pada kode program.
-
Jadwal shift belum otomatis di-generate untuk periode panjang
(misalnya sebulan penuh).
3
4. Identifikasi Wajah
-
Sistem hanya bisa mengenali wajah yang sudah terdaftar pada file
encodings.pkl melalui proses registrasi dataset (register_face.py).
-
Wajah baru atau wajah yang belum terdaftar tidak akan tercatat dalam
sistem.
-
Tidak tersedia metode autentikasi seperti fingerprint, RFID, atau PIN.
5. Arsitektur Sistem
-
Terdapat dua komponen utama yang berjalan terpisah:
1. Aplikasi Python di PC/Laptop untuk face recognition,
pencatatan absensi, dan integrasi Google Sheets & Telegram.
2. ESP32 sebagai penghubung IoT.
-
Kedua komponen ini harus berjalan bersamaan dan saling terhubung
melalui jaringan lokal agar sistem berfungsi normal.
6. Penyimpanan Data dan Integrasi
-
Database absensi menggunakan Google Sheets sebagai media
penyimpanan utama.
-
Belum ada integrasi ke database server lokal seperti MySQL/SQLite.
-
Pengiriman notifikasi absensi hanya melalui Telegram Bot, belum
mendukung platform lain (WhatsApp, SMS, email).
4
7. Fungsi Sistem
-
Sistem saat ini hanya mencatat absensi masuk dan keluar berdasarkan
shift yang sudah didefinisikan.
-
Fitur tambahan seperti patroli (patroli_1, patroli_2) masih berupa
placeholder dan belum memiliki logika fungsional.
-
Sistem hanya mendukung 1 lokasi absensi dengan beberapa satpam,
belum mendukung multi-lokasi.
8. Sistem hanya menggunakan metode face detection dan face recognition
berbasis library face_recognition pada Python.
9. Dataset wajah yang digunakan terbatas pada jumlah tertentu sesuai
kebutuhan penelitian.
10. Sistem belum mampu mengantisipasi sepenuhnya kemungkinan kesalahan
pengenalan wajah (false acceptance), yaitu kondisi ketika wajah yang tidak
terdaftar dalam dataset dapat dikenali sebagai wajah yang terdaftar.
1.4 Maksud dan Tujuan
Berdasarkan rumusan masalah diatas, Penulis berkeinginan untuk
melakukan sebuah sistem pengontrol/pengawasan patroli keamanan diperusahaan.
Untuk tahap awal penulis ingin membuat sebuah Prototype. Dimana Prototype ini
merupakan sebuah perancangan sistem yang akan merangkum rumusan masalah
dan juga sangat memungkinkan untuk dikembang oleh perusahaan ke sistem yang
lebih baik dan sempurna. (https://www.gramedia.com/literasi/prototype/ diakses
tanggal 20 Juli 2024)
5
Dari pemikiran tersebut, maka penulis memberikan judul yang disebut
dengan Implementasi Metode Face Detection Sebagai Sistem Monitoring Secara
Realtime Keberadaan/Kehadiran Tenaga Satuan Keamanan Berbasis IoT.
Tujuan dari judul tersebut ada beberapa hal, antara lain :
- Menyempurnakan pengontrolan/pengawasan dari patroli keamanan kantor.
- Sebagai upaya peduli kepada aset dan properti perusahaan dalam bidang
keamanan.
- Dapat melakukan monitoring dan evaluasi performa kinerja Security, dan
selanjutnya akan menjadi tindaklanjut bagi manajemen sebagai dalam
mengukur pencapaian SLA (Service Level Agriment) bagi Vendor Security
terkontrak.
- Mengimplementasikan ilmu pengetahun seperti Mikrokontroler, sensor serta
pemrograman, yang didapat selama masa perkuliahan.
1. Ide gagasan untuk membuat monitoring kedisiplinan petugas satpam dalam
melaksanakan piket, terutama presensi kehadiran dengan metode deteksi
wajah.
2. Monitoring tersebut dapat diketahui secara realtime berbasikan IoT melalui
layanan aplikasi Telegram dan Google Spreedshet.
3. Berdasarkan pemantau tersebut dapat dilkukan evaluasi kinerjanya sehingga
akan menjadi pelaporan Tingkat lanjut ke PLN UP3 Padang maupun ke PLN
UID SUMBAR
6
1.5 Manfaat Penulisan
Adapun manfaat dari pembuatan tugas akhir ini adalah :
1. Membantu pengawasan pelaksanaan piket satpam di Kantor PLN ULP
Tabing, karena Penulis sebagai TL K3L Yan Gan tidak mempunyai Staff
dalam membantu pengawasan tersebut.
2. Menimbulkan kesadaran bagi petugas satpam akan tugas dan tanggung
jawab sebagai satuan pengaman.
3. Mengaplikasikan teknologi dalam keterbatasa SDM dalam bidang K3L Yan
Gan.
1.6 Metodologi Penyelesaian Tugas Akhir
1.
Studi literatur yaitu dengaan mempelajari
terkait teknologi sistem
monitoring yang sudah ada.
2.
Perancangan system yaitu memastikan system apa yang bisa mendukung
terhadap ide dan gagasan.
3.
Implementasi hardware: Mempelajari perangkat yang dibutuhkan sesuai
dengan ide gagasan.
4.
Pengembangan software: Pemrograman yang akan dipilih utntuk
mendukung ide dan gagasan
5.
Uji coba dan evaluasi: Pengujian sistem yag merujuk kepada ide rancangan
7
1.7 Sistematika Penulisan
1. BAB I PENDAHULUAN
Berisi tentang latar belakang masalah, perumusan masalah, batasan
masalah, tujuan, manfaat dan sistematika penulisan tugas akhir.
2. BAB II LANDASAN TEORI
Berisi tentang teori dasar yang digunakan sebagai bahan acuan dalam
pembuatan rancangan tugas akhir, serta komponen yang perlu diketahui
untuk mempermudah dalam memahami sistem kerja alat ini secara
keseluruhan.
3. BAB III PERANCANGAN DAN PEMBUATAN ALAT
Bab ini berisi tentang penjelasan bagaimana perancangan dan pembuatan
sistem monitoring tegangan pada catu daya 48 VDC pada Gardu Induk.
4. BAB IV PENGUJIAN DAN ANALISA
BAB memuat langkah-langkah pengujian, analisa serta hasil yang
diperoleh dari pembuatan alat.
5. BAB V PENUTUP
Bab ini merupakan penutup dari tulisan ini. Dimana dalam bab ini berisikan
kesimpulan dan saran dari seluruh proses pembuatan alat.
6. DAFTAR PUSTAKA
Bagian ini berisi sumber–sumber yang digunakan dalam penyelesaian
penulisan Tugas Akhir.
7. LAMPIRAN
8
BAB II
LANDASAN TEORI
2.1 Sistem Keamanan
A. Pengertian Sistem kemanan.
Sistem keamanan adalah sebuah cara atau metode pengamanan dengan
menggunakan komponen atau perangkat keamanan yang saling bekerja-sama
serta dirancang untuk melindungi aset, informasi, dan individu dari ancaman,
gangguan, atau serangan
yang dapat menyebabkan kerugian atau
bahaya.(https://nawakara.com/id/security-system-definisi-dan-cara-kerja
diakses tanggal 20 Juli 2024)
Sistem keamanan ini dapat diterapkan dalam berbagai konteks, seperti
keamanan fisik, keamanan siber, keamanan informasi, dan keamanan pribadi.
B. Tujuan Sistem Keamanan
Tujuan sistem keamanan meliputi berbagai aspek yang bertujuan untuk
melindungi aset, informasi, dan individu dari berbagai ancaman. Berikut
adalah beberapa tujuan utama dari sistem keamanan:
-
Perlindungan Aset
-
Perlindungan Informasi
-
Pencegahan Kejahatan
-
Respon Insiden
-
Kepatuhan terhadap Regulasi
-
Pengelolaan Risiko
-
Pemulihan Bencana
-
Keamanan Operasional
7
2.2 Perangkat dan sistem
Implementasi metode face detection sebagai sistem monitoring
secara realtime kehadiran/keberadaan tenaga satuan keamanan
berbasis IoT, menggabungkan bebrapa perangkat atau komponen
elektronika dan sistem operasi pemrograman, sehingga dapat
digambarkan seperti dibawah ini.
Webcam + PC/LAPTOP
Petugas Piket
FACE DETECTION
APLIKASI VS CODE/PYTHON
ESP 32 DENGAN ARDUINO
INTERNET CONNECTION
GOOGLE
SPREEDSHEET
NOTIFIKASI TELEGRAM
Gambar 2.1 Gambar rancangan implementasi metode face detection
8
Gambaran dari perangkat diatas terdiri dari beberapa komponen dan
perangkat yang dapat dijelaskan sebagai berikut :
1. Deteksi Wajah (Face Datection)
Face detection atau deteksi wajah adalah teknologi yang digunakan untuk
mengidentifikasi dan menemukan wajah manusia dalam gambar atau video.
Teknologi ini merupakan langkah awal dalam berbagai aplikasi, seperti
pengenalan wajah, keamanan, fotografi, dan manajemen konten. Berikut
beberapa poin penting tentang face detection:
-
Deteksi dan Lokalisasi: Face detection melibatkan pendeteksian adanya
wajah dan menentukan lokasi wajah dalam gambar atau video.
-
Algoritma: Berbagai algoritma, seperti Viola-Jones, Haar cascades, dan
teknik pembelajaran mesin atau deep learning, digunakan untuk
meningkatkan akurasi dan kecepatan deteksi.
-
Aplikasi:
-
Keamanan: Digunakan dalam sistem pengawasan dan kontrol akses.
-
Fotografi: Digunakan dalam kamera untuk auto-focus pada wajah.
-
Pengelolaan Media Sosial: Membantu dalam tag otomatis pada foto.
-
Perangkat Pintar: Digunakan dalam fitur unlock melalui wajah.
Face detection bekerja dengan menganalisis fitur-fitur wajah seperti mata,
hidung, dan mulut, serta menggunakan pola-pola tertentu untuk mengenali wajah
dalam berbagai kondisi pencahayaan dan sudut. Metode deteksi wajah yang bisa
dikenali lewat webcam sebenarnya hampir semua metode sepanjang
dijalankan oleh sistem yang benar dan perangkat mendukung (kamera,
CPU/GPU). Beberapa metode face detection yang umum digunakan anataranya
sebagai berikut:
9
1.
Metode Haar Cascade (Viola-Jones) adalah salah satu algoritma deteksi
wajah tertua dan paling populer, terutama di aplikasi real-time seperti
webcam. Metode ini digunakan oleh banyak aplikasi awal pengenalan wajah
karena kecepatan dan efisiensinya. Fungsi utamanya adalah objek wajah
dalam gambar atau video secara cepat dan real-time. Kelebihannya antara
lain adalah
-
Cepat dan ringan (real-time, bahkan tanpa GPU).
-
Mudah diimplementasikan dengan OpenCV.
-
Cocok untuk perangkat dengan spesifikasi rendah.
Sedangkan metode ini memiliki kekurangan seperti :
2.
-
Kurang akurat untuk wajah dengan sudut miring atau ekspresi berbeda.
-
Rentan terhadap pencahayaan buruk dan background kompleks.
-
Tidak cocok untuk aplikasi dengan kebutuhan akurasi tinggi.
Metode Face Detection dengan HOG (Histogram of Oriented Gradients)
adalah pendekatan klasik yang cukup ringan dan efektif untuk mendeteksi
wajah, terutama wajah yang menghadap ke depan (frontal face). Metode ini
sering digunakan dalam kombinasi dengan SVM (Support Vector
Machine) classifier. Metoe ini bertujuan untuk menangkap bentuk atau
struktur objek (misalnya kontur wajah) dan mengubah wajah menjadi
representasi numerik yang bisa dikenali oleh model klasifikasi. Kelebihan
HOG untuk Deteksi Wajah adalah:
-
Akurat untuk wajah yang menghadap ke depan.
-
Tidak memerlukan GPU.
-
Lebih presisi dibanding Haar Cascade, terutama pada citra berkualitas
10
Sedangkan metode ini memiliki kekurangan seperti :
-
Tidak terlalu baik untuk wajah berpaling (non-frontal).
-
Kurang akurat dibanding metode deep learning modern seperti MTCNN
atau RetinaFace.
-
Bisa lambat jika diterapkan di gambar/video resolusi tinggi.
3. Metode face detection berbasis CNN (Convolutional Neural Network)
adalah salah satu metode paling akurat dan kuat yang digunakan saat ini.
CNN memungkinkan komputer mendeteksi wajah dalam berbagai kondisi,
seperti:
-
Wajah miring
-
Pencahayaan buruk
-
Banyak wajah dalam satu gambar
-
Ekspresi wajah berbeda
-
Sebagian wajah tertutup (occlusion)
Kelebihan Face Detection dengan CNN adalah
-
Jauh lebih akurat disbanding metode Klasik
-
Dapat mendeteksi dengan pose wajah bervarias
-
Mendeteksi posisi wajah dan hidung secara cepat
Sedangkan kelemahan metode ini adalah :
-
Lebih berat dari Haar/HOG (disarankan GPU) sehingga membutuhkan
Sistem operasi komputer yang cepat
-
Butuh pemodelan wajah untuk melatih berulang kali.
11
2. Face Recognition
Face
Recognition adalah
salah
satu
teknik
biometrik
memungkinkan computer untuk mengenal wajah manusia.
yang
Face recognition
(pengenalan wajah) adalah proses mengenali atau mengidentifikasi identitas
seseorang berdasarkan wajahnya. Berbeda dengan face detection yang hanya
mendeteksi keberadaan wajah, face recognition berfokus pada siapa orang tersebut.
Salah satu dari aplikasi dari pengenalan wajah adalah pengenalan banyak
wajah, yaitu pengenalan dari suatu citra yang terdiri dari banyak wajah. Untuk
membedakan beberapa wajah manusia dalam suatu citra sangat sulit bagi sistem
pengenalan wajah, selain itu juga terdapat beberapa masalah pada sistem pengenalan
wajah otomatis, yaitu ekspresi wajah, iluminasi atau pencahayaan dan jarak. Sistem
pengenalan banyak wajah merupakan salah satu dari solusi permasalahan ini..
Pengenalan ini dapat dibagi menjadi dua bagian yaitu : “Dikenali” dan “Tidak
Dikenali”. Setelah dilakukan dengan pola yang sebelumnya disimpan didalam
database. Sistem ini juga harus bisa mengenali objek selain wajah.
Gambar 2.2 Hasil Proses Face Recognition
12
3. Camera webcam
Web camera atau yang biasa dikenal dengan webcam, adalah kamera yang
gambarnya bisa di akses menggunakan world wide web (www), program instant
messaging, atau aplikasi komunikasi dengan tampilan video pada PC. Webcam juga
digambarkan sebagai kamera video digital yang sengaja didesain sebagai kamera
dengan resolusi rendah. webcam dapat digunakan untuk sistem keamanan. Pada
beberapa webcam, ada yang di lengkapi dengan software yang mampu mendeteksi
pergerakan dan suara. Dengan software tersebut, memungkinkan PC yang terhubung
ke kamera untuk mengamati pergerakan dan suara, serta merekamnya ketika
terdeteksi. Hasil rekaman ini bisa disimpan pada komputer, email atau di upload ke
internet Webcam sangat bermanfaat dalam bidang telekomunikasi, bidang keamanan
dan bidang industri. Sebagai contoh webcam digunakan untuk videocall chatting,
surveillience camera, dan sebagai video conference oleh beberapa user
Gambar 2.3 Camera webcam
13
4.
Mikrokontroler ESP 32
ESP32 adalah mikrokontroler yang dikembangkan oleh Espressive
system sebagai penerus ESP8266. Mikrokontroler ini dilengkapi dengan modul WiFi bawaan, sehingga sangat cocok untuk aplikasi Internet of Things (IoT). ESP32
memiliki 34 pin General Purpose Input/Output (GPIO) yang fungsinya dapat diatur
dengan mengkonfigurasi register yang sesuai. GPIO pada ESP32 dibagi menjadi
empat kategori: digital only, analog-enabled, capacitive-touch-enabled. Pin
capacitive-touchenabled dan analog-enabled juga dapat dikonfigurasi sebagai GPIO
digital (Maervita). Menurut Espressif Systems (2023), ESP32 adalah mikrokontroler
dengan modul Wi-Fi dan Bluetooth bawaan yang dikembangkan oleh Espressif
Systems. ESP32 mendukung komunikasi nirkabel, memiliki prosesor dual-core,
ADC, serta GPIO yang dapat digunakan untuk menghubungkan sensor. Berikut
Spesifikasi Utama ESP 32 :
a. Prosesor: Dual-core Tensilica LX6 (hingga 240 MHz).
b. Memori:
-
SRAM internal (520 KB).
-
Flash memory (hingga 16 MB tergantung modul).
c. Komunikasi:
-
Wi-Fi (802.11 b/g/n) → untuk koneksi ke internet / server.
-
Bluetooth 4.2 & BLE (Low Energy) → komunikasi jarak dekat,
hemat daya.
d. Input/Output (I/O):
-
Banyak pin GPIO (General Purpose Input Output).
-
ADC (Analog to Digital Converter) untuk membaca sensor
tegangan/arus.
14
-
DAC (Digital to Analog Converter).
-
SPI, I2C, UART untuk komunikasi dengan sensor/alat lain.
e. Keunggulan: Mendukung Deep Sleep Mode → hemat daya, cocok untuk
monitoring.
5. Fungsi ESP 32
Dalam konteks Sistem Monitoring Tegangan 48 VDC pada Gardu Induk
berbasis IoT, ESP32 berfungsi sebagai:
1. Pengolah Data Sensor
-
Membaca sinyal dari sensor tegangan (misalnya melalui pin
ADC).
-
Mengolah data menjadi nilai tegangan yang bisa ditampilkan.
2. Pengendali Perangkat
-
Mengontrol LCD untuk menampilkan data lokal.
-
Mengatur buzzer sebagai alarm jika tegangan abnormal.
-
Mengendalikan relay atau indikator jika perlu.
3. Konektivitas IoT
-
Mengirim data ke web hosting / server agar bisa dimonitor dari
jarak jauh melalui internet.
-
Bisa menggunakan MQTT, HTTP, atau WebSocket untuk
komunikasi.
4. Fungsi Interaksi
-
Membaca push button untuk reset alarm atau setting.
-
Menyediakan interface konfigurasi (misalnya melalui Wi-Fi).
15
Gambar 2. 4 Mikrokontroler ESP 32
6. IDE ARDUINO
Arduino IDE adalah software yang digunakan untuk membuat sketch
pemrogaman atau dengan kata lain arduino IDE sebagai media untuk
pemrogaman pada board yang ingin diprogram. Arduino IDE ini berguna untuk
mengedit, membuat, meng-upload ke board yang ditentukan, dan meng-coding
program tertentu. Arduino IDE dibuat dari bahasa pemrogaman JAVA, yang
dilengkapi dengan library C/C++(wiring), yang membuat operasi input/output
lebih mudah.
Gambar 2.5 Aplikasi Arduino
16
Menulis Sketch pada Software Arduino IDE
Sketch adalah program yang ditulis dengan menggunakan Arduino IDE.
Sketch yang disimpan akan memiliki ekstensi file .ino. Kemudian dalam penulisan
program
pada
arduino
IDE
ini
ada
beberapa
stuktur
(https://www.kmtech.id/post/mengenal-perangkat-lunak-arduino-ide
dasar.
diakses
tanggal 24 Juli 2024)
7. Konsep IoT
Internet of Things adalah sebuah konsep yang terhubung dengan
perangkat sebagai media komunikasi berbasis internet. Dengan adanya IoT,
seorang user dapat saling terhubung dan berkomunikasi untuk melakukan aktivitas
tertentu, mencari, mengolah, dan mengirimkan informasi secara otomatis. Konsep
ini sepintas hampir serupa dengan M2M (Machine-to-Machine). Akan tetapi,
sebenarnya kedua konsep ini memiliki perbedaan dari segi skala dan lingkup
penggunaannya. (https://www.linknet.id/article/internet-of-things)
Gambar 2.6. Konsep IoT
17
Berikut adalah keuntungan menggunakan IoT :
1. Efisiensi energi
Tujuan dari penggunaan konsep ini salah satunya adalah untuk efisiensi energi.
Hal ini bisa meningkatkan efisiensi aktivitas perusahaan. Dengan kata lain,
seorang user bisa mengatur batas minimal dan maksimal penggunaan sumber
daya atau perangkat agar tidak melebihi kemampuan yang ditentukan.
2. Hemat biaya
Keuntungan lainnya yang diberikan oleh konsep IoT adalah bisa mengurangi
biaya operasional sebuah perusahaan atau bisnis. Konsep ini juga memungkinkan
adanya pemeliharaan perangkat dengan memantau dan menganalisis data
secara real-time.
Selain itu, jaringan IoT juga dapat bantu pekerjaan yang kompleks sehingga bisa
mengurangi pengeluaran biaya SDM.
3. Produktivitas meningkat
Dengan adanya sistem kerja yang kompleks seperti penggunaan sensor, konsep
ini akan memudahkan user untuk memberikan perintah dan melakukan aktivitas.
Proses akses yang diterima dan dihasilkan oleh IoT bekerja dengan cepat dan
tepat sehingga user bisa lebih praktis dalam penggunaannya.
18
8. Aplikasi Visual Studio Code dan Open CV
Dalam penelitian ini, yang menjadi backbone dari sistem metode face
detection ini adalah aplikasi Visual Studio Code. Dimana Visual Studio Code
(disingkat VS Code) adalah aplikasi text editor dan code editor yang
dikembangkan oleh Microsoft, digunakan untuk menulis, mengedit, menjalankan,
dan debug kode program dalam berbagai bahasa pemrograman.
Gambar 2.7. Aplikasi Visual Studio Code
Disamping itu, aplikasi ini juga mempunyai library yang lebih familiar
dikenal dengan Open CV. OpenCV (Open Source Computer Vision Library) adalah
sebuah perpustakaan (library) yang dirancang untuk aplikasi computer vision dan
machine learning. Dikembangkan oleh Intel pada tahun 1999, OpenCV kini menjadi
salah satu tool terpopuler dalam bidang pemrosesan citra. OpenCV bersifat open
source, yang berarti dapat digunakan dan dimodifikasi secara gratis untuk keperluan
pribadi maupun komersial.
19
Perpustakaan ini memiliki lebih dari 2.500 algoritma yang mencakup
berbagai teknik, mulai dari operasi dasar pemrosesan gambar, deteksi objek (seperti
wajah dan kendaraan), hingga analisis video dan pengenalan pola.
Gambar 2.8. Open CV display
20
BAB III
PERANCANGAN DAN PEMBUATAN ALAT
3.1 Metodologi Perancangan dan Pembuatan Alat
Metodologi yang digunakan dalam penelitian ini adalah metodologi perancangan
dan pembuatan alat. Metode ini dipilih karena penelitian tidak hanya berhenti
pada tahap teori, tetapi juga langsung diwujudkan dalam bentuk ujicoba sistem
absensi berbasis pengenalan wajah. Dengan begitu, sistem yang dirancang bisa
diuji dan dievaluasi secara nyata sesuai dengan tujuan penelitian.
Tahapan yang dilakukan dalam metodologi ini meliputi:
1. Studi Literatur
Pada tahap ini dilakukan pengumpulan referensi dari jurnal, buku, maupun
sumber online yang berkaitan dengan pengenalan wajah, sistem absensi, serta
perangkat keras dan perangkat lunak yang mendukung.
2. Analisis Kebutuhan
Menentukan kebutuhan alat, baik dari sisi hardware seperti kamera,
mikrokontroler, dan modul komunikasi, maupun dari sisi software yang
digunakan untuk mengolah data wajah.
3. Perancangan Sistem
Membuat rancangan berupa blok diagram, skema rangkaian, serta alur kerja
program. Tahap ini juga mencakup desain bagaimana hardware dan software
saling terhubung.
4. Pengujian dan Evaluasi
Menguji sistem yang sudah dibuat pada kondisi nyata untuk melihat sejauh
mana alat dapat bekerja secara efektif, reliabel, dan sesuai kebutuhan absensi
tenaga satuan keamanan.
26
3.2 Alat dan Bahan
Berikut alat dan bahan yang diperlukan dalam pembuatan alat ini :
1. WebCam Logitech Brio 4K
2. Mikrokontroler Esp32 (Include Connector kabel USB)
3. PC/ Laptop
3.3 Blok Diagram Sistem Keseluruhan
Ide gagasn dari tugas akhir ini yang merupakan implementasi metode Face
Detection, terlebih dahulu harus dituangkan dalan bentuk diagram, agar logika
algoritma serta tujuan akhir yang diinginkan sesuai dengan harapan. Berikut
merupakan blok diaagram dalam bentuk secara keseluruhan.
.
Gambar 3. 1 Blok Diagram Sistem
Keterangan dari blok diagram keseluruhan :
1. Camera Webcam
Berfungsi sebagai perangkat input utama untuk menangkap gambar atau video
wajah pengguna. Data visual yang ditangkap akan diteruskan ke
mikrokontroler ESP32 untuk diproses.
27
2. Mikrokontroler ESP32
Menjadi pusat kendali sistem. ESP32 menerima input dari kamera webcam,
kemudian melakukan pemrosesan awal data wajah. Selain itu, ESP32 juga
bertugas mengirimkan informasi hasil deteksi ke layanan eksternal, baik berupa
aplikasi Telegram maupun penyimpanan data pada Spreadsheet.
3. Layanan Aplikasi Telegram
Merupakan media komunikasi real-time yang digunakan untuk mengirimkan
notifikasi atau informasi hasil deteksi wajah kepada pengguna atau admin
melalui pesan otomatis. Dengan cara ini, monitoring dapat dilakukan secara
jarak jauh.
4. Spreadsheet Data
Berfungsi sebagai media penyimpanan berbasis cloud untuk mencatat dan
menyimpan hasil deteksi atau data absensi secara otomatis. Dengan penggunaan
spreadsheet, data dapat diakses, dianalisis, dan diolah lebih lanjut kapan saja.
3.4 Prinsip Kerja Alat
Prinsip kerja sistem ini dimulai dari camera webcam yang berfungsi
menangkap citra wajah pengguna secara real-time. Hasil tangkapan kamera
kemudian dikirimkan ke mikrokontroler ESP32 sebagai pusat kendali sistem.
ESP32 bertugas memproses data visual yang diterima serta menghubungkannya
dengan layanan eksternal. Data hasil pengolahan tersebut selanjutnya dikirimkan
ke dua arah, yaitu ke layanan aplikasi Telegram dan Spreadsheet Data. Pada
layanan Telegram, sistem akan mengirimkan notifikasi secara otomatis kepada
pengguna atau admin sehingga proses monitoring dapat dilakukan secara jarak
jauh dan real-time. Sementara itu, pada Spreadsheet Data, sistem akan mencatat
dan menyimpan hasil deteksi wajah sebagai rekaman absensi digital yang dapat
diakses kapan saja.
28
3.5 Perancangan dan Pembuatan Perangkat Lunak (software)
Perancangan perangkat lunak dari alat ini yaitu pembuatan algoritma. Dimana
algoritma merupakan garis besar jalan nya suatu program, salah satu bentuk dari
algoritma bisa dituangkan dalam bentuk flowchart atau diagram alir.
3.5.1 Flowchart (Diagram Alir) dan Blok Diagram Folder
Flowchart adalah diagram yang menampilkan langkah-langkah dan
keputusan untuk melakukan sebuah proses dari suatu program. Setiap langkah
digambarkan dalam bentuk diagram dan dihubungkan dengan garis atau arah
panah. Flowchart berperan penting dalam memutuskan sebuah langkah atau
fungsionalitas dari sebuah proyek pembuatan program yang melibatkan
banyak orang sekaligus. Selain itu dengan menggunakan flowchart dari
sebuah program akan lebih jelas, ringkas, dan mengurangi kemungkinan
untuk salah penafsiran bisa dilihat pada Gambar berikut.
29
Gambar 3.5.1 Flowchart Sistem
30
Gambar 3.5.2 Blok Diagram Folder
3.5.2 Penjelasan Flowchart dan Blok Diagram
a. Flowchart
Proses sistem dimulai ketika program Python dijalankan, kemudian
Python akan mengaktifkan kamera untuk menangkap citra wajah
pengguna secara real-time. Setelah itu, program melakukan deteksi wajah
pada frame kamera sekaligus melakukan encoding, yaitu mengubah citra
wajah menjadi data numerik agar bisa dibandingkan dengan dataset yang
sudah ada.
Selanjutnya, sistem melakukan pencocokan antara encoding wajah
dengan dataset. Jika hasil encoding tidak cocok, maka wajah akan
dianggap tidak dikenal dan proses langsung berhenti tanpa mencatat data
absensi. Namun, jika hasilnya cocok, sistem akan melanjutkan dengan
menentukan identitas pengguna berdasarkan dataset.
Setelah nama dikenali, sistem kemudian menentukan shift kerja dan
status absensi (misalnya hadir, terlambat, atau sesuai jadwal) berdasarkan
waktu absensi. Data yang sudah lengkap berupa nama, waktu, shift, dan
status akan dikemas ke dalam format JSON.
Data JSON tersebut dikirimkan ke ESP32 melalui protokol REST
31
API. ESP32 kemudian bertugas meneruskan data ke Google Sheets
sebagai media penyimpanan database absensi, serta mengirimkan
notifikasi ke Telegram agar admin bisa memantau kehadiran secara
realtime. Jika semua proses berhasil, maka status absensi dinyatakan
“Data Tercatat OK”. Dengan demikian, seluruh rangkaian sistem
berakhir, baik dengan status berhasil tercatat maupun dengan status tidak
dikenal jika wajah tidak sesuai dataset.
b. Blok Diagram Folder
Pada Blok Diagram di atas kita melihat bagaimana folder disusun
untuk Penjelasan blok diagram diatas sebagai berikut :
1. dataset
Folder yang berisi data wajah (gambar) yang digunakan sebagai basis
dataset untuk proses training dan pengenalan wajah.
2. absensi.py
Script utama untuk menjalankan sistem absensi berbasis pengenalan
wajah. File ini membaca data encoding dan mencatat hasil absensi.
3. register_face.py
Script untuk mendaftarkan wajah baru ke dalam sistem. Wajah yang
direkam akan disimpan ke dalam folder dataset, kemudian diubah
menjadi encoding dan disimpan di file encodings.pkl.
4. encodings.pkl
File penyimpanan hasil encoding wajah dalam bentuk vektor numerik.
Digunakan oleh program absensi untuk membandingkan wajah input
dengan dataset yang sudah ada.
5. absen_debug.log
File log yang menyimpan catatan aktivitas dan error selama proses
absensi, berguna untuk debugging dan analisis kinerja sistem.
32
3.6 Inisiasi Perancangan
Perancangan ini bertujuan untuk merencanakan sistem yang akan dibuat agar
sesuai dengan kebutuhan penelitian. Perancangan sistem sangat penting karena
menjadi acuan dalam proses pembuatan alat secara keseluruhan. Hasil
perancangan dapat dilihat pada bagian berikut ini :
Gambar 3.6 Inisiasi Perancangan
33
3.7 Cara Pengoperasian Alat
1. Menjalankan Program
Pengguna terlebih dahulu menjalankan program Python pada perangkat yang
terhubung dengan sistem.
2. Aktivasi Kamera
Setelah program aktif, kamera otomatis menyala untuk menangkap wajah
pengguna secara real-time.
3. Deteksi dan Encoding Wajah
Sistem melakukan deteksi wajah pada frame kamera.
Citra wajah kemudian diubah menjadi data numerik (encoding) untuk
dibandingkan dengan dataset.
4. Proses Pencocokan
Jika hasil encoding tidak sesuai dataset, sistem menampilkan status wajah tidak
dikenal dan proses berhenti.
Jika hasil encoding cocok dengan dataset, sistem melanjutkan ke tahap
berikutnya.
5. Identifikasi dan Penentuan Absensi
Sistem menentukan nama pengguna berdasarkan dataset.
Shift kerja dan status absensi (hadir, terlambat, atau sesuai jadwal) ditentukan
berdasarkan waktu absensi.
6. Pengemasan Data
Data berupa nama, waktu, shift, dan status absensi dikemas dalam format
JSON.
7. Pengiriman Data ke ESP32
Data JSON dikirim ke ESP32 melalui protokol REST API.
34
8. Penyimpanan Data
ESP32 meneruskan data absensi ke Google Sheets sebagai basis data utama.
9. Notifikasi ke Telegram
ESP32 juga mengirimkan notifikasi ke aplikasi Telegram agar admin dapat
memantau absensi secara real-time.
10. Proses Berakhir
Jika data berhasil dikirim, status absensi ditampilkan sebagai Data Tercatat OK.
Jika wajah tidak cocok dengan dataset, status absensi berakhir sebagai Tidak
Dikenal.
35
BAB IV
HASIL DAN ANALISA
Hasil dan analisa merupakan suatu hal penting yang harus dilakukan untuk
mengetahui apakah sistem yang dibuat telah sesuai dengan yang direncanakan, hal
itu dapat dilihat dari hasil-hasil yang diperoleh pada pengujian sistem. Selain itu juga
bertujuan untuk mengetahui kelebihan dan kekurangan dari sistem yang telah dibuat.
4.1 Deskripsi Dataset dan Karekteristik Awal
Dataset terdiri dari folder per individu (satpam), di mana setiap folder berisi
sejumlah gambar wajah yang dipakai oleh register_face.py untuk menghasilkan file
encodings.pkl. Secara ideal, setiap orang memiliki variasi foto di bawah kondisi
pencahayaan, sudut pandang, ekspresi, yang berbeda — variasi ini menentukan
kekayaan fitur (intra-class variability) dan sangat mempengaruhi kestabilan
encoding. Dari skema kode, ID tiap person diset statis (mis. "101" untuk
satpam_dodi), sehingga setiap record hasil pengenalan mereferensikan ID tersebut.
Struktur data yang dikirim ke endpoint ESP32 berisi kolom penting seperti id, nama,
shift, jam_masuk, jam_keluar, keterangan, dan status_waktu. Dalam praktiknya,
seandainya distribusi jumlah gambar per orang tidak , maka model akan memiliki
bias performa: orang dengan banyak gambar cenderung lebih mudah dikenali (lower
FRR), sedangkan yang sedikit foto rawan false reject.
36
4.1 Foto Folder Satpam
4.2 Proses Ekstraksi Fitur dan Keputusan Pengenalannya
Proses pengenalan memakai face_recognition (dlib-based) untuk mendeteksi
lokasi wajah (face_locations) dan mengekstrak encoding (vektor 128-dim). Sistem
menggunakan model hog untuk face detection (cepat pada CPU) dan menghitung
face_distance antara encoding terdeteksi dan daftar encoding yang tersimpan;
keputusan identifikasi berdasar argmin(distance) dengan threshold tetap (< 0.6).
Selanjutnya ada mekanisme temporal smoothing: dalam jangka waktu validasi
(DEFAULT VALIDATION_DURATION = 4s), hasil deteksi disimpan ke
recognized_detections dan ketika window validasi selesai sistem memilih nama yang
paling sering muncul (majority voting). Mekanisme ini mengurangi noise singleframe dan menurunkan false positives spurious—tetapi juga memperkenalkan latensi
minimal. Setelah identifikasi, logika menentukan keterangan masuk/keluar
berdasarkan histori harian (attendance_status) dan SHIFT_SCHEDULE, lalu
compute_absen_status mengklasifikasikan hasil sebagai Tepat Waktu, Terlambat,
Pulang Tepat Waktu, Pulang Lebih Awal, Diluar Jam Absensi, atau OFF sesuai
aturan waktu shift yang telah didefinisikan.
37
4.3 Error Analisis Sumber Kesalahan dan Bukti Empiris
Berdasarkan arsitektur, kesalahan (false accept/false reject) biasanya muncul
dari beberapa penyebab:
1. Ketidakmampuan model mendeteksi wajah (missed detection) akibat
pencahayaan buruk atau occlusion.
2.
Jarak encoding terlalu besar karena pose ekstrem atau kualitas
kamera rendah.
3. Label noise di dataset (foto tersimpan di folder yang salah) yang
menyebabkan encoding “terkontaminasi”.
4. Multiple faces dalam frame yang menyebabkan majority voting
memilih nama yang salah bila frame berisi banyak orang.
4.3 Gambar snapshoot error
38
4.4 Dampak Jadwal Shift Terhadap Klasifikasi Status Absensi
Logika fungsi compute_absen_status pada sistem telah dirancang untuk
menangani skenario shift yang melewati tengah malam, khususnya pada shift Malam,
dengan aturan khusus untuk absensi pulang. Meskipun demikian, adanya rentang
waktu shift yang saling bersinggungan serta aturan pulang yang tidak sepenuhnya
simetris menimbulkan potensi inkonsistensi pada klasifikasi status absensi.
Selain itu, mekanisme penentuan keterangan masuk atau keluar yang hanya
bergantung pada keberadaan catatan sebelumnya dalam satu hari juga menyimpan
potensi kesalahan. Contohnya, apabila seorang Satpam lupa melakukan absen masuk
pada pagi hari, kemudian melakukan absensi pada sore hari, sistem dapat salah
mengklasifikasikan catatan tersebut sebagai "masuk". Dalam kasus seperti ini,
diperlukan aturan tambahan atau rekonsiliasi manual, misalnya menetapkan bahwa
absensi pertama setelah pukul 12:00 hanya dapat dianggap sebagai "keluar" apabila
terdapat bukti absensi sebelumnya.
Jam Absen
Jam Absen
Masuk
Keluar
01/08/25 Satpam_salman Pagi
08:00
15:00
True
True
01/08/25 Satpam_ismail Malam
21:00
07:05
True
False
14:20
False
True
Tanggal
Nama
Shift
Masuk Keluar
02/08/25 Satpam_salman Pagi -
4.4 Tabel potensi edge-case
39
4.5 Integrasi Data Absensi Ke Google Spreadsheet dan Telegram melalui ESP
Integrasi data absensi pada sistem ini bekerja dengan memanfaatkan ESP32
sebagai gateway komunikasi antara Python (deteksi wajah), Google Spreadsheet, dan
Telegram. Data absensi yang berisi ID, nama, shift, jam masuk, jam keluar, patroli,
keterangan, serta status waktu pertama kali dikirim Python dalam format JSON ke
endpoint lokal /absen yang dijalankan ESP32. Setelah data diterima, ESP32
melakukan parsing JSON lalu mencetak informasi tersebut di serial monitor untuk
kebutuhan debugging. Selanjutnya, ESP32 mengirimkan data ke Google Spreadsheet
menggunakan HTTP POST dengan format application/x-www-form-urlencoded
agar dapat diterima oleh Google Apps Script dan langsung disimpan ke dalam baris
baru spreadsheet. Setelah data berhasil dicatat, ESP32 mengirimkan pesan notifikasi
ke Telegram Bot API menggunakan HTTP POST dengan header application/json. Isi
pesan Telegram disusun secara dinamis sesuai dengan keterangan (masuk, patroli 1,
patroli 2, keluar) sehingga setiap aktivitas satpam terekam dan dikirim ke grup/akun
Telegram secara real-time. Dengan arsitektur ini, sistem memastikan absensi satpam
tidak hanya tercatat di Spreadsheet sebagai arsip, tetapi juga langsung diinformasikan
ke
pihak
terkait
melalui
4.5.1 Gambar header di Google Spreadsheet
40
Telegram.
41
4.5.2 Gambar code appscript
42
BAB V
PENUTUP
5.1 Kesimpulan
Berdasarkan hasil penelitian dan implementasi sistem absensi berbasis Face
Recognition, ESP32, Google Spreadsheet, dan notifikasi Telegram, maka dapat
diambil beberapa kesimpulan sebagai berikut:
1. Sistem absensi yang dibangun mampu mendeteksi dan mengenali wajah
pegawai secara real-time menggunakan library face_recognition pada
Python, sehingga proses absensi dapat dilakukan lebih cepat dan efisien
dibanding metode manual.
2. Data absensi berhasil dikirim dan tersimpan secara otomatis ke Google
Spreadsheet, sehingga memudahkan proses rekapitulasi dan pengelolaan data
kehadiran.
3. Integrasi dengan Telegram Bot berjalan dengan baik, di mana setiap
aktivitas absensi menghasilkan notifikasi yang dapat dipantau secara
langsung oleh admin maupun pihak terkait.
4. Implementasi pembagian shift kerja (pagi, sore, malam) telah berjalan
sesuai ketentuan. Sistem dapat memberikan status kehadiran yang akurat,
seperti Tepat Waktu, Terlambat, Pulang Awal, dan Tidak Hadir.
5. Secara keseluruhan, sistem absensi berbasis pengenalan wajah ini dapat
menjadi alternatif solusi yang lebih efektif, efisien, dan modern untuk
meningkatkan kedisiplinan kehadiran pegawai, khususnya pada sistem kerja
dengan pembagian shift.
43
5.2 Saran
Agar penelitian dan sistem absensi ini dapat dikembangkan lebih baik di masa
depan, beberapa saran yang dapat diberikan antara lain:
1. Peningkatan Kamera dan Perangkat
Menggunakan kamera dengan resolusi lebih tinggi serta perangkat
komputasi yang lebih kuat (misalnya Raspberry Pi atau server mini) agar
sistem dapat berjalan lebih stabil dengan akurasi deteksi wajah yang lebih
baik.
2. Penggunaan Database yang Lebih Terstruktur
Selain Google Spreadsheet, sistem dapat dikembangkan menggunakan
database SQL atau Firebase agar lebih fleksibel, terintegrasi dengan sistem
informasi perusahaan, dan mendukung jumlah data yang lebih besar.
3. Peningkatan Keamanan Data
Menambahkan fitur enkripsi data absensi serta autentikasi multi-level pada
aplikasi agar informasi kehadiran tidak mudah disalahgunakan.
4. Pengujian dengan Skala Lebih Besar
Perlu dilakukan uji coba dengan jumlah pegawai yang lebih banyak dan
dalam jangka waktu lebih lama, untuk mendapatkan data performa sistem
yang lebih representatif.
44
DAFTAR PUSTAKA
[1] Munafi, I Lakif & Komang Somawirata. Michael Ardita, A. (2022). Sistem Portal
Otomatis Berbasis Mask Detection Menggunakan Esp32-Cam. Diakses tanggal 2
Desember 2024, dari Institut Teknologi Nasional, Malang, Indonesia.
[2] Rianto, Agus. (2024). Penerapan Pengenalan Wajah dengan Algoritma Viola-Jones
Artificial Intelegence Berbasis Internet of Things menggunakan ESP32-CAM.
Journal of Fortech, 48-53.
[3] Indriawan H Muhammad., Fildzah Shabrina, Akalily Mardiyya (2022). Sistem
Keamanan Pintu Rumah Berbasis Face Recognition. Diakses tanggal 7 Desember
2024. Jurnal dari Penerapan Ilmu-ilmu Komputer (JUPITER), 34-42.
[4] Putra, D Redo., & Riki Mukaiyar. (2022). Perancangan Sistem Pemantau
Keamanan Rumah Dengan Sensor Pir dan Kamera Berbasis Mikrokontroler dan
Internet Of Things (Iot). Diakses tanggal 2 Desember 2024. Jurnal dari
Ranahresearch, 201- 209.
[5] Salamah, Irma., Emilia Hesti, Nadia Oktavia. (2023). Implementasi ESP32-CAM
pada Sistem Identifikasi Pengunjung Perpustakaan Menggunakan QR Code
Berbasiskan Internet of Things. Diakses tanggal 2 Desember 2024. Jurnal dari
Teknologi Sistem Informasi dan Aplikasi Universitas Pamulang, 223- 228.
45
LAMPIRAN
1. Foto fisik alat
2. Proses absensi
3. Proses deteksi wajah
4. Notifikasi Telegram
5. Notifikasi Spreedsheet
6. Listing Program Visual Studio Code
7. Listing Program Arduino
46
1. Bentuk Fisik Peralatan
2. Proses Absensi
47
3. Proses Pendeteksian wajah
48
4. Notifikasi Telegram
5. Notifikasi Spreedsheet
49
6. Listing Program Visual Studio Code
import cv2
import face_recognition
import pickle
import os
import time
import threading
import json
import requests
import sys
import traceback
import numpy as np
from collections import Counter
from datetime import datetime, time as dtime
# ---------- Konfigurasi ---------ENCODINGS_FILE = "encodings.pkl"
ESP32_URL = "http://10.223.138.17/absen"
COOLDOWN = 20
# detik
VALIDATION_DURATION = 4
# detik
LOGFILE = "absen_debug.log"
CAM_INDEX = 0
# ---------- JADWAL SHIFT HARIAN --------# Pola shift berulang setiap 4 hari
50
# Pagi: 07:00-08:00 (ontime), 08:00-09:00 (late), 15:00 (pulang ontime)
# Sore: 14:00-15:00 (ontime), 15:00-16:00 (late), 21:00 (pulang ontime)
# Malam: 20:00-21:00 (ontime), 21:00-22:00 (late), 08:00 (pulang ontime)
# Shift diluar jam tersebut adalah "Diluar Jam Absensi"
# Absen pulang lebih awal jika sebelum jam pulang ontime
SHIFT_SCHEDULE = {
# Format: "YYYY-MM-DD": {"Pagi": [nama1, nama2], "Sore": [nama3,
nama4], "Malam": [nama5, nama6]}
"2025-08-27": {"Pagi": ["satpam_dodi", "satpam_salman"], "Sore":
["satpam_erizon",
"satpam_tedi"],
"Malam":
["satpam_jonikasman",
"satpam_yuhendri"]},
"2025-08-28": {"Pagi": ["satpam_erizon", "satpam_tedi"], "Sore":
["satpam_jonikasman", "satpam_yuhendri"], "Malam": ["satpam_ismail",
"satpam_yulmanedi"]},
"2025-08-29": {"Pagi": ["satpam_jonikasman", "satpam_yuhendri"], "Sore":
["satpam_ismail",
"satpam_yulmanedi"],
"Malam":
["satpam_dodi",
"satpam_salman"]},
"2025-08-30": {"Pagi": ["satpam_ismail", "satpam_yulmanedi"], "Sore":
["satpam_dodi",
"satpam_salman"],
"Malam":
["satpam_erizon",
"satpam_tedi"]},
"2025-08-31": {"Pagi": ["satpam_dodi", "satpam_salman"], "Sore":
["satpam_erizon",
"satpam_tedi"],
"Malam":
["satpam_jonikasman",
"satpam_yuhendri"]},
# Tambahkan jadwal untuk bulan September dan seterusnya jika diperlukan
"2025-09-01": {"Pagi": ["satpam_erizon", "satpam_tedi"], "Sore":
["satpam_jonikasman", "satpam_yuhendri"], "Malam": ["satpam_ismail",
"satpam_yulmanedi"]},
"2025-09-02": {"Pagi": ["satpam_jonikasman", "satpam_yuhendri"], "Sore":
["satpam_ismail",
"satpam_yulmanedi"],
"Malam":
["satpam_dodi",
"satpam_salman"]},
"2025-09-03": {"Pagi": ["satpam_ismail", "satpam_yulmanedi"], "Sore":
["satpam_dodi",
"satpam_salman"],
"Malam":
["satpam_erizon",
"satpam_tedi"]},
51
"2025-09-04": {"Pagi": ["satpam_dodi", "satpam_salman"], "Sore":
["satpam_erizon",
"satpam_tedi"],
"Malam":
["satpam_jonikasman",
"satpam_yuhendri"]},
"2025-09-05": {"Pagi": ["satpam_erizon", "satpam_tedi"], "Sore":
["satpam_jonikasman", "satpam_yuhendri"], "Malam": ["satpam_ismail",
"satpam_yulmanedi"]},
}
SHIFT_TIME_CONFIG = {
"Pagi": {
"start": dtime(7,0,0), "end": dtime(9,0,0), "ontime_until": dtime(8,0,0),
"pulang_start": dtime(14,0,0), "pulang_ontime": dtime(15,0,0)
},
"Sore": {
"start": dtime(14,0,0), "end": dtime(16,0,0), "ontime_until": dtime(15,0,0),
"pulang_start": dtime(20,0,0), "pulang_ontime": dtime(21,0,0)
},
"Malam": {
# Jam masuk dan pulang shift malam
"start": dtime(20,0,0), "end": dtime(22,0,0), "ontime_until": dtime(21,0,0),
"pulang_start": dtime(7,0,0), "pulang_ontime": dtime(8,0,0),
# Jam patroli shift malam
"patroli_1_start": dtime(2,0,0), "patroli_1_end": dtime(3,0,0),
"patroli_2_start": dtime(3,0,0), "patroli_2_end": dtime(4,0,0)
},
}
52
# ---------- Logging sederhana ---------def log(msg):
ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
line = f"{ts} {msg}"
print(line)
try:
with open(LOGFILE, "a", encoding="utf-8") as f:
f.write(line + "\n")
except Exception:
pass
# ---------- Global exception hook ---------def excepthook(exc_type, exc, tb):
log("[UNCAUGHT
EXCEPTION]
"".join(traceback.format_exception(exc_type, exc, tb)))
"
+
sys.excepthook = excepthook
# ---------- Send to ESP32 (background thread) ---------def send_to_esp32_thread(data):
def worker(d):
try:
headers = {'Content-Type': 'application/json'}
r = requests.post(ESP32_URL, data=json.dumps(d), headers=headers,
timeout=26)
if r.status_code == 200:
log(f"[INFO] Sent to ESP32 OK: id={d.get('id')}")
else:
53
log(f"[WARN] ESP32 returned status {r.status_code}")
except Exception as e:
log(f"[ERROR] send_to_esp32_thread exception: {e}")
threading.Thread(target=worker, args=(data,), daemon=True).start()
# ---------- Validate required files ---------if not os.path.exists(ENCODINGS_FILE):
log(f"[FATAL] Encodings file not found: {ENCODINGS_FILE}")
sys.exit(1)
# ---------- Load encodings ---------log("[INFO] Loading encodings...")
with open(ENCODINGS_FILE, "rb") as f:
all_persons_data = pickle.load(f)
encodings_known, names_known, ids_known = [], [], []
person_map = {} # Map nama ke detail
for p in all_persons_data:
name = p.get("name")
if not name: continue
person_map[name] = p
for e in p.get("encodings", []):
encodings_known.append(e)
names_known.append(name)
54
ids_known.append(p.get("id"))
# ---------- Camera helper ---------def open_camera(idx=CAM_INDEX):
return cv2.VideoCapture(idx, cv2.CAP_DSHOW)
cap = open_camera(CAM_INDEX)
if not cap.isOpened():
log("[WARN] Camera not opened, retrying once...")
time.sleep(1)
cap = open_camera(CAM_INDEX)
if not cap.isOpened():
log("[FATAL] Cannot open camera. Check driver or other app using
camera.")
sys.exit(1)
log("[INFO] Camera opened OK.")
# ---------- State ---------recognized_detections = []
start_time = time.time()
is_cooldown_active = False
cooldown_end_time = 0
last_recognized_name = ""
last_absen_status = ""
attendance_status = {} # {person_id: {"last_masuk": date, "last_keluar": date,
"patroli_1": date, "patroli_2": date}}
55
# ---------- Helpers ---------def get_current_shift(name):
# ... kode yang sudah ada
today = datetime.now().strftime("%Y-%m-%d")
schedule = SHIFT_SCHEDULE.get(today, {})
for shift, names in schedule.items():
if name in names:
return shift
return "OFF"
def compute_absen_status(name, keterangan):
shift = get_current_shift(name)
if shift == "OFF":
return "OFF"
conf = SHIFT_TIME_CONFIG.get(shift)
now = datetime.now()
now_time = now.time()
if keterangan == "masuk":
if conf["start"] <= now_time <= conf["end"]:
if now_time <= conf["ontime_until"]:
return "Tepat Waktu"
else:
return "Terlambat"
else:
56
return "Diluar Jam Absensi"
elif keterangan == "keluar":
# Gunakan logika absensi pulang yang lebih cerdas untuk shift Malam
if shift == "Malam":
# Skenario 1: Absen di malam hari yang sama (misal 20:00 - 23:59)
# Ini dianggap "Pulang Lebih Awal" karena sebelum jam 08:00 keesokan
harinya
# Kita bandingkan dengan jam 20:00 agar tidak salah jika ada yang absen
pukul 07:00 pagi.
if now_time > dtime(20,0,0) and now.hour >= 20:
return "Pulang Lebih Awal"
# Skenario 2: Absen di pagi hari berikutnya (setelah tengah malam, tapi
sebelum 08:00)
elif now_time < conf["pulang_ontime"]: # Jika absen sebelum jam 08:00
pagi
return "Pulang Lebih Awal"
# Skenario 3: Absen tepat pada atau setelah jam pulang ontime (08:00)
else:
return "Pulang Tepat Waktu"
else:
# Logika standar untuk shift Pagi dan Sore (tidak melewati tengah
malam)
if now_time < conf["pulang_ontime"]:
return "Pulang Lebih Awal"
else:
return "Pulang Tepat Waktu"
elif "patroli" in keterangan:
57
# Patroli tidak ada status ontime/late, jadi selalu "Tepat Waktu"
# Kecuali jika di luar jam patroli
now_time = datetime.now().time()
patrol_start = conf[f"{keterangan}_start"]
patrol_end = conf[f"{keterangan}_end"]
# Logika untuk patroli shift malam yang melewati tengah malam (00:00)
if patrol_start > patrol_end: # Ini berarti melewati tengah malam, misalnya
21:00-02:00
# Waktu sekarang di antara start malam itu atau waktu sekarang sebelum
end keesokan harinya
if now_time >= patrol_start or now_time <= patrol_end:
return "Tepat Waktu"
else:
return "Diluar Jam Absensi"
else: # Normal, tidak melewati tengah malam
if patrol_start <= now_time <= patrol_end:
return "Tepat Waktu"
else:
return "Diluar Jam Absensi"
return "Status Tidak Diketahui"
# ---------- Main loop ---------log("[INFO] Starting main loop. Press q to quit.")
try:
while True:
if not cap.isOpened():
58
log("[WARN] Camera not opened, attempting reopen...")
try: cap.release()
except Exception: pass
time.sleep(1)
cap = open_camera(CAM_INDEX)
time.sleep(0.2)
continue
ret, frame = cap.read()
if not ret or frame is None:
log("[WARN] Empty frame read, retrying...")
time.sleep(0.05)
continue
try:
current_detected_name = "Tidak Dikenal"
boxes = []
if not is_cooldown_active:
small = cv2.resize(frame, (0,0), fx=0.25, fy=0.25)
rgb = cv2.cvtColor(small, cv2.COLOR_BGR2RGB)
boxes = face_recognition.face_locations(rgb, model="hog")
encs = face_recognition.face_encodings(rgb, boxes)
if time.time() - start_time < VALIDATION_DURATION:
59
for enc in encs:
if len(encodings_known) == 0: continue
dists = face_recognition.face_distance(encodings_known, enc)
best_idx = int(np.argmin(dists)) if len(dists) else -1
if best_idx >= 0 and dists[best_idx] < 0.6:
name_match = names_known[best_idx]
recognized_detections.append(name_match)
current_detected_name = name_match
else:
if recognized_detections:
counts = Counter(recognized_detections)
most_common, _ = counts.most_common(1)[0]
details = person_map.get(most_common)
if details:
pid = details["id"]
name = details["name"]
shift = get_current_shift(name)
now = datetime.now()
nowstr = now.strftime("%H:%M:%S")
# --- LOGIKA PENENTUAN KETERANGAN ABSENSI
BARU --keterangan = "Diluar Jam Absensi"
# Tentukan keterangan absensi (masuk/patroli/keluar)
last_check_status = attendance_status.get(pid, {})
60
current_date = now.strftime("%Y-%m-%d")
if shift == "Malam":
conf = SHIFT_TIME_CONFIG["Malam"]
patroli_1_done = last_check_status.get("patroli_1") ==
current_date
patroli_2_done = last_check_status.get("patroli_2") ==
current_date
# Cek untuk absensi masuk
if not last_check_status.get("masuk") == current_date and
conf["start"] <= now.time() <= conf["end"]:
keterangan = "masuk"
# Cek untuk patroli 1
elif not patroli_1_done and conf["patroli_1_start"] <=
now.time() <= conf["patroli_1_end"]:
keterangan = "patroli_1"
# Cek untuk patroli 2
elif not patroli_2_done and conf["patroli_2_start"] <=
now.time() <= conf["patroli_2_end"]:
keterangan = "patroli_2"
# Cek untuk absensi keluar
elif (last_check_status.get("masuk") == current_date and
(patroli_1_done or not conf["patroli_1_start"] <=
now.time() <= conf["patroli_1_end"]) and # pastikan patroli 1 sudah dilakukan
atau jamnya sudah lewat
(patroli_2_done or not conf["patroli_2_start"] <=
now.time() <= conf["patroli_2_end"]) and # pastikan patroli 2 sudah dilakukan
atau jamnya sudah lewat
now.time() >= conf["pulang_start"]): # cek jam pulang
keterangan = "keluar"
61
else:
keterangan = "Diluar Jam Absensi"
else: # Logika untuk shift Pagi/Sore
if not last_check_status.get("masuk") == current_date:
keterangan = "masuk"
elif last_check_status.get("masuk") == current_date:
keterangan = "keluar"
if keterangan == "Diluar Jam Absensi":
# Tambahan logika untuk status OFF
if shift == "OFF":
log(f"[INFO] {name} sedang OFF, tidak bisa absen.")
last_absen_status = "OFF"
else:
log(f"[INFO] {name} mencoba absen di luar jam shift
({shift}). Ignored.")
last_absen_status = "Diluar Jam Absensi"
last_recognized_name = name
is_cooldown_active = True
cooldown_end_time = time.time() + 5
recognized_detections = []
start_time = time.time()
continue
62
absen_status = compute_absen_status(name, keterangan)
# Siapkan payload
payload = {
"id": pid,
"nama": name,
"shift": shift,
"jam_masuk": "" if keterangan != "masuk" else nowstr,
"jam_keluar": "" if keterangan != "keluar" else nowstr,
"patroli_1": "" if keterangan != "patroli_1" else nowstr,
"patroli_2": "" if keterangan != "patroli_2" else nowstr,
"keterangan": keterangan,
"status_waktu": absen_status
}
log(f"[ABSENSI]
{name}
({keterangan})
-
{absen_status}")
# Update status terakhir
attendance_status[pid] = last_check_status
attendance_status[pid][keterangan] = current_date
# Set cooldown
is_cooldown_active = True
cooldown_end_time = time.time() + COOLDOWN
last_recognized_name = name
last_absen_status = absen_status
63
Status:
recognized_detections = []
start_time = time.time()
send_to_esp32_thread(payload)
else:
log("[WARN] Detected name not found in details")
recognized_detections = []
start_time = time.time()
else:
recognized_detections = []
start_time = time.time()
#
=====================
=====================
UI
overlay
if is_cooldown_active:
remaining = max(0, int(cooldown_end_time - time.time()))
color = (0,255,0)
if last_absen_status in ["Diluar Jam Absensi", "OFF"]:
color = (0,0,255)
cv2.putText(frame,
last_absen_status,
cv2.FONT_HERSHEY_SIMPLEX, 1.0, color, 2)
(20,40),
else:
cv2.putText(frame,
"ABSENSI
cv2.FONT_HERSHEY_SIMPLEX, 1.0, color, 2)
BERHASIL",
(20,40),
cv2.putText(frame, f"Nama: {last_recognized_name}",
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,255,255), 2)
(20,80),
cv2.putText(frame,
f"Status:
{last_absen_status}",
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,255,255), 2)
(20,110),
64
if remaining <= 0:
is_cooldown_active = False
recognized_detections = []
start_time = time.time()
log("[INFO] Cooldown finished.")
else:
for (top,right,bottom,left) in boxes:
top *= 4; right *= 4; bottom *= 4; left *= 4
cv2.rectangle(frame, (left,top), (right,bottom), (255,0,0), 2)
cv2.putText(frame, current_detected_name, (left, top-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,0,0), 2)
remval = max(0, int(VALIDATION_DURATION - (time.time() start_time)))
cv2.putText(frame, f"Validasi: {remval}s", (10, frame.shape[0]-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (240,240,240), 2)
cv2.imshow("Absensi Satpam", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
log("[INFO] exit by user")
break
except Exception as inner_e:
log(f"[ERROR] Exception inner loop: {inner_e}")
log(traceback.format_exc())
try:
cv2.imwrite("snapshot_error.jpg", frame)
65
log("[INFO] snapshot_error.jpg saved")
except Exception as e:
log(f"[ERROR] failed save snapshot: {e}")
time.sleep(0.2)
continue
except KeyboardInterrupt:
log("[INFO] KeyboardInterrupt received, exiting...")
finally:
try: cap.release()
except Exception: pass
cv2.destroyAllWindows()
log("[INFO] Program ended.")
7. Listing Program Arduino
#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>
#include <ArduinoJson.h>
#include "time.h"
// ======================================
// PENGATURAN KONEKSI
// ======================================
const char* ssid = "V29e";
const char* password = "Pln12345";
String
googleScriptURL
=
"https://script.google.com/macros/s/AKfycbw8OlpAReRQhsE4XzaxenIbZz1upn0iGoq2kwTtTyVMamZwvJXWhCx1YEiJrQCmeT8/exec";
// ======================================
// PENGATURAN TELEGRAM BOT
// ======================================
const
String
telegramBotToken
"8252078421:AAHk1n4h8TPQR01R_ZeNbzx--vBwCtcY1nE";
const String telegramChatId = "8123269109";
66
=
WebServer server(80);
// ======================================
// FUNGSI UNTUK MENGIRIM PESAN KE TELEGRAM
// ======================================
void sendTelegramMessage(String message) {
HTTPClient http;
String telegramUrl = "https://api.telegram.org/bot" + telegramBotToken +
"/sendMessage";
http.begin(telegramUrl);
http.setTimeout(15000);
http.addHeader("Content-Type", "application/json");
String payload = "{\"chat_id\":\"" + telegramChatId + "\",\"text\":\"" + message
+ "\"}";
Serial.println("[INFO] Mengirim notifikasi ke Telegram...");
int httpCode = http.POST(payload);
if (httpCode > 0) {
String response = http.getString();
Serial.println("[SUCCESS] Notifikasi Telegram terkirim!");
Serial.println("Telegram Response: " + response);
} else {
Serial.println("[ERROR] Gagal mengirim notifikasi Telegram.");
Serial.print("Kode HTTP: ");
Serial.println(httpCode);
String response = http.getString();
Serial.println("Telegram Response: " + response);
}
http.end();
}
void handleAbsen() {
if (server.hasArg("plain")) {
String body = server.arg("plain");
StaticJsonDocument<512> doc;
DeserializationError error = deserializeJson(doc, body);
if (!error) {
String id = doc["id"];
String nama = doc["nama"];
String shift = doc["shift"];
String jam_masuk = doc["jam_masuk"];
String jam_keluar = doc["jam_keluar"];
String patroli_1 = doc["patroli_1"];
String patroli_2 = doc["patroli_2"];
String keterangan = doc["keterangan"];
String statusAbsen = doc["status_waktu"]; // Menerima status dari Python
// Ambil tanggal saat ini
struct tm timeinfo;
67
if (!getLocalTime(&timeinfo)) {
Serial.println("[ERROR] Gagal mendapatkan waktu.");
server.send(400, "application/json", "{\"status\":\"error\",\"msg\":\"Waktu
tidak tersedia\"}");
return;
}
char date[11];
strftime(date, 11, "%d/%m/%Y", &timeinfo);
Serial.println("========== DATA DARI PYTHON ==========");
Serial.println("ID
: " + id);
Serial.println("Nama
: " + nama);
Serial.println("Shift
: " + shift);
Serial.println("Jam Masuk : " + jam_masuk);
Serial.println("Jam Keluar : " + jam_keluar);
Serial.println("Patroli 1 : " + patroli_1);
Serial.println("Patroli 2 : " + patroli_2);
Serial.println("Keterangan : " + keterangan);
Serial.println("Status : " + statusAbsen); // Cetak status yang diterima
Serial.println("======================================");
// Kirim ke Google Sheets (POST)
HTTPClient http;
http.begin(googleScriptURL);
http.setTimeout(15000);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
String postData = "id=" + id + "&nama=" + nama + "&shift=" + shift +
"&jam_masuk=" + jam_masuk + "&jam_keluar=" + jam_keluar
+
"&patroli_1=" + patroli_1 + "&patroli_2=" + patroli_2 +
"&keterangan=" + keterangan + "&status=" + statusAbsen;
Serial.println("[INFO] Mengirim data ke Google Sheets...");
int httpCodeSheets = http.POST(postData);
if (httpCodeSheets > 0) {
String responseSheets = http.getString();
Serial.println("[SUCCESS] Data berhasil terkirim ke Spreadsheet!");
Serial.println("Sheets Response: " + responseSheets);
// ======================================
// KIRIM NOTIFIKASI KE TELEGRAM
// ======================================
String telegramMessage = "";
if (keterangan == "masuk") {
telegramMessage = "✅ ABSENSI MASUK\n" +
String("------------------------------\n") +
"👤 Nama: " + nama + "\n" +
"🆔 ID: " + id + "\n" +
"➡ Shift: " + shift + "\n" +
68
"⏰ Jam: " + jam_masuk + "\n" +
"🗓 Tanggal: " + String(date) + "\n" +
"ℹ Status: " + statusAbsen;
} else if (keterangan == "patroli_1") {
telegramMessage = "🚨 PATROLI 1 SHIFT MALAM\n" +
String("------------------------------\n") +
"👤 Nama: " + nama + "\n" +
"🆔 ID: " + id + "\n" +
"➡ Shift: " + shift + "\n" +
"⏰ Jam: " + patroli_1 + "\n" +
"🗓 Tanggal: " + String(date) + "\n" +
"ℹ Status: " + statusAbsen;
} else if (keterangan == "patroli_2") {
telegramMessage = "🚨 PATROLI 2 SHIFT MALAM\n" +
String("------------------------------\n") +
"👤 Nama: " + nama + "\n" +
"🆔 ID: " + id + "\n" +
"➡ Shift: " + shift + "\n" +
"⏰ Jam: " + patroli_2 + "\n" +
"🗓 Tanggal: " + String(date) + "\n" +
"ℹ Status: " + statusAbsen;
} else if (keterangan == "keluar") {
telegramMessage = "⛔ ABSENSI KELUAR\n" +
String("------------------------------\n") +
"👤 Nama: " + nama + "\n" +
"🆔 ID: " + id + "\n" +
"➡ Shift: " + shift + "\n" +
"⏰ Jam: " + jam_keluar + "\n" +
"🗓 Tanggal: " + String(date) + "\n" +
"ℹ Status: " + statusAbsen;
}
sendTelegramMessage(telegramMessage);
} else {
Serial.println("[ERROR] Gagal mengirim ke Spreadsheet.");
Serial.print("Kode HTTP: ");
Serial.println(httpCodeSheets);
String responseSheets = http.getString();
Serial.println("Sheets Response: " + responseSheets);
}
http.end();
server.send(200, "application/json", "{\"status\":\"ok\"}");
} else {
Serial.println("[ERROR] Gagal parsing JSON dari Python!");
Serial.println(error.c_str());
server.send(400, "application/json", "{\"status\":\"error\",\"msg\":\"JSON
error\"}");
}
} else {
69
Serial.println("[ERROR] Tidak ada data diterima dari Python!");
server.send(400,
"application/json",
"{\"status\":\"error\",\"msg\":\"No
Data\"}");
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n[INFO] Terhubung ke WiFi!");
Serial.print("IP ESP32: ");
Serial.println(WiFi.localIP());
configTime(7 * 3600, 0, "pool.ntp.org");
Serial.println("\n[INFO] Mengatur waktu NTP...");
time_t now = time(nullptr);
while (now < 100000) {
delay(500);
now = time(nullptr);
}
server.on("/absen", HTTP_POST, handleAbsen);
server.begin();
Serial.println("[INFO] Server berjalan di port 80");
}
void loop() {
server.handleClient();
}
70
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )