Terowirus Disinfeksi Cerdas: Sanitasi Otomatis untuk Area Ramai
Komponen dan Perlengkapan
- Arduino UNO — 1 unit
- Kawat jumper (generic) — 1 set
- PIR Motion Sensor (generic) — 2 unit
- 12V Power Relay (4PDT) — 1 unit
- 12 Volt SMPS — 1 unit
- Seeed Grove - 2-Channel SPDT Relay — 1 unit
- 5 Volt SMPS — 1 unit
- Toggle Switch, (On)-Off-(On) — 1 unit
- Raspberry Pi 3 Model B — 1 unit
- Raspberry Pi Camera Module V2 — 1 unit
- Micro SD card — 1 unit
- Micro-USB to USB Cable (Generic) — 1 unit
- Heat sink — 1 unit
- 1 HP Water Pump — 1 unit
- Steel Box Pipe — 1 unit
- Water Tank (200 L) — 1 unit
- PVC Plastic Pipe — 1 unit
- 4-Way Fogger — 1 unit
- Banner Flex — 1 unit
- Tee Joint — 1 unit
- Micro Tubing Pipe — 1 unit
- Wall Fix lamp — 1 unit
- Elbow — 1 unit
- Cable Tie, Double Sided — 1 unit
Alat dan Mesin yang Diperlukan
- Welding Machine
- Cut-Off Machine
- Soldering iron (generic)
- Solder Wire, Lead Free
- Laser cutter (generic)
Aplikasi dan Layanan Online
- Arduino IDE
- Raspberry Pi Raspbian
- OpenCV
Tentang Proyek Ini
Pendahuluan
Terowirus Disinfeksi dan Sanitasi Cerdas adalah demonstrasi bagaimana itu telah dirancang untuk memberikan perlindungan maksimal bagi orang yang melewati terowirus dalam sekitar 15 detik. Yang dapat membantu komunitas untuk melawan COVID-19.
Ide utama proyek ini adalah untuk membuat terowirus yang dapat mencoba dan mencegah penyebaran COVID-19.
Terowirus disinfeksi dan sanitasi ini disiapkan untuk membersihkan orang dalam 15 detik dari bakteri yang mungkin saja.
Larutan disinfektan yang digunakan terdiri dari kombinasi hipoklorit natrium (NaOCl) dan air (H2O). Disinfektan tidak mudah menguap, sehingga memungkinkan aktivitas veridikal dan bakterisidal yang berkelanjutan dan membersihkan permukaan.
Jadi, saya mengambil inisiatif ini untuk membuat Terowirus Disinfeksi dan Sanitasi Cerdas ini. Terowirus ini dibuat dalam waktu 12 jam. Itu dapat membersihkan seorang penuh dari kepala hingga kaki dalam waktu hanya 15 detik dan larutan yang digunakan sepenuhnya tidak berbahaya*. Biaya total terowirus sekitar ₹30.000 atau $400. (Biaya yang direvisi)
Di Mana Digunakan?
- Pasar makanan
- Kantor
- Mall perbelanjaan
- Bandara
- Halte bus
- Stasiun kereta api
- Kantor polisi
- Kampus
- Rumah sakit
- Perumahan
Bagaimana Cara Kerjanya
Sebuah mesin pompa air 1 HP ditempatkan di sisi setiap terowirus yang mengambil larutan 0,4% dari hipoklorit natrium dalam 100 Liter air dari tangki. Karena mesin otomatis ia merasakan apakah ada orang yang masuk ke terowirus. Saat seseorang masuk ke terowirus pompa air menyala selama 15 detik. Sehingga pengguna dapat melewati terowirus itu dan jika tidak ada orang di terowirus pompa akan mati untuk menghemat air dan listrik. Sprei disinfektan berkabut melindungi warga dari tertular bakteri selama periode paling tidak 60 menit (Perkiraan*). Karena itu membersihkan udara, kulit yang terbuka, dan pakaian manusia.
Sebuah tangki plastik untuk 200 liter larutan dan pompa untuk sistem pipa tekanan tinggi terletak di sisi terowirus. Menurut perhitungan larutan seharusnya cukup untuk 8-10 jam. Karena memiliki sensor gerakan di atas pintu masuk untuk menghemat antiseptik. (Bisa bervariasi sesuai orang yang masuk ke terowirus**)
Diagram Alur
Gambar diagram alur tersedia sebagai referensi.
Pengaturan Hardware
Saya menata bingkai dari profil logam, yang dapat dilipat sehingga dapat diangkut dari tempat ke tempat, dan setelah semuanya selesai, disimpan untuk kiamat berikutnya. Penutupannya menggunakan banner (yang digunakan untuk iklan papan pengumuman luar ruangan). Banner mudah dilekatkan dengan profil logam menggunakan ikat plastik. Ini cepat dan tidak memerlukan keterampilan khusus.
Lihat model - https://skfb.ly/6RGvZ
Sebuah tangki plastik untuk 200 liter larutan dan pompa untuk sistem pipa tekanan tinggi terletak di sisi terowirus yang terhubung dengan Assembly Fogger 4-Way.
Pipa mikro telah digunakan di seluruh terowirus untuk menyuplai larutan ke fogger.
Di dalam, ada pipa tekanan tinggi dengan 4 Fogger 4-Way yang dapat dihubungkan. Kabut tidak memberi noda pada pakaian, sambil sepenuhnya meliputi orang yang masuk dan menghancurkan virus bahkan dalam lipatan pakaian yang sulit dijangkau dan melindungi untuk beberapa waktu setelah keluar.
Sebagai larutan, larutan sertifikat digunakan dalam proyek ini. (Sertifikat Dilampirkan di bawah)
4 Way Fogger
- Discharge Rate : 30 LPH/0.5 LPM (untuk 1 fogger)
- Tekanan yang Direkomendasikan: 45-60 psi
- Ukuran Titik Rata-rata: 65 mikron (pada 55-60 psi)
- Filtrasi Diperlukan: 130 Mikron (120 mesh)
- Pompa yang diperlukan: 40 hingga 45 meter Head
Aksesoris Lain yang Digunakan
Siapkan Arduino
Pompa air sebenarnya bekerja dengan mendeteksi sinar inframerah. Setiap kali tubuh manusia mendekati sensor gerakan sehingga tubuh manusia memantulkan sinar inframerah, sensor gerakan mendeteksi sinar inframerah ini dan memberi kita sinyal HIGH melalui pin output. Sinyal HIGH ini kemudian dibaca oleh Arduino. Jadi jika Arduino membaca sinyal HIGH, itu akan memberi sinyal HIGH ke modul relais yang berarti relais akan menyala, dan sebagai hasilnya Power relay akan menyala dan akan menyala Pompa Air selama 15 detik (Dapat diubah). Sebaliknya jika Arduino membaca sinyal LOW, itu akan membuat pin relais LOW dan sebagai hasilnya Pompa Air akan tetap mati.
Dalam ini saya telah menggunakan 2 sensor PIR untuk membuatnya lebih presisi jika salah satunya merasakan gerakan maka relais akan menyala selama 15 detik (Dapat diubah).
Kami tidak dapat menggunakan Relais 5V secara langsung dengan Pompa Air karena Dalam kasus saya, pompa air yang saya gunakan dalam proyek ini memiliki rating Ampere(A) sebesar 16Ampere dan Relais 5V memiliki beban maksimal 10Ampere jadi untuk mengontrol pompa air saya menggunakan satu relais lagi dengan Modul Relais 5V. yang merupakan Relais Daya 12V.
Kode:
/*
* Smart Disinfection and Sanitation Tunnel
*/
int relayPin = 12; // pilih pin untuk Pin Relais
int inputPin = 2; // pilih pin input (untuk sensor PIR)
int inputPin2 = 3; // pilih pin input (untuk sensor PIR 02)
int pirState = LOW; // pada awalnya, asumsi tidak ada gerakan terdeteksi
int val = 0; // variabel untuk membaca status pin
int val2 = 0; // variabel untuk membaca status pin
void setup() {
pinMode(relayPin, OUTPUT); // deklarasi Relais sebagai output
pinMode(inputPin, INPUT); // deklarasi sensor sebagai input
pinMode(inputPin2, INPUT);
Serial.begin(9600);
}
void loop(){
val = digitalRead(inputPin); // baca nilai input
val2 = digitalRead(inputPin2); // baca nilai input
if (val == HIGH || val2 == HIGH) { // periksa apakah input HIGH
digitalWrite(relayPin, HIGH); // nyalakan Relais
if (pirState == LOW) {
// baru menyala
Serial.println("Motion detected!");
// penundaan 15 detik
delay(15000);
pirState = HIGH;
}
} else {
digitalWrite(relayPin, 0); // matikan Relais
if (pirState == HIGH){
// baru mati
Serial.println("Motion ended!");
pirState = LOW;
}
}
}
Pemasangan akhir untuk proyek ini terlihat sedikit acak tetapi bekerja dengan baik.
Siapkan Raspberry Pi 3 (Opsional)
Ini opsional. Jika Anda perlu melakukan analisis data dan untuk menghitung jumlah orang yang menggunakan terowirus ini dengan tepat. Anda dapat menerapkan bagian ini.
Meskipun, ada banyak cara untuk menghitungnya dengan beberapa sensor fisik seperti Sensor PIR dan Sensor Ultrasonik tetapi saya menemukan ini lebih presitif sambil memikirkan semua Risiko.
Ada model pembelajaran mesin yang mendeteksi tubuh manusia menggunakan OpenCV dalam Python dan menyimpan log dalam file yang dapat diproses untuk menampilkan data dalam aplikasi.
Konektifkan Kamera Pi
- Matikan Raspberry Pi
- Cari Modul Kamera, di antara Modul USB dan modul HDMI.
- Buka klip plastik hitam dengan (pelan-pelan) menarik ke atas
- Masukkan kabel pita Modul Kamera (konektor logam menghadap jauh dari port Ethernet / USB pada Raspberry Pi 4)
- Kunci klip plastik hitam
Aktifkan Kamera Pi
sudo raspi-config
- Pilih Opsi Interfacing (opsi ke 4) dari menu utama Alat Konfigurasi Perangkat Lunak Raspberry Pi. Tekan ENTER.
- Pilih opsi menu
Enable Camera (opsi ke 5) dan tekan ENTER.
- Dalam menu berikutnya, gunakan tombol panah kanan untuk menyorot
ENABLE dan tekan ENTER.
Uji Kamera Pi
Selanjutnya, verifikasi bahwa Kamera Pi diinstal dengan benar dengan memulai pratinjau overlay kamera. Overlay akan dirender pada layar.
- Terhubung ke Raspberry Pi menggunakan VNC Viewer.
- Jalankan perintah berikut:
raspistill -v -o test.jpg
Jika Anda menginstal Kamera Pi dengan benar, Anda harus melihat gambar dari kamera dirender ke layar Anda.
Menginstal OpenCV
Silakan ikuti tautan ini untuk menginstal OpenCV
https://www.learnopencv.com/install-opencv-4-on-raspberry-pi/
Kode
Jalankan perintah berikut untuk membuat dan membuka file skrip baru:
cd Desktop
sudo nano main.py
Salin skrip lalu tempelkan di file baru yang Anda buat.
import cv2.cv as cv
from datetime import datetime
import time
import sys
import datetime
count=0
class MotionDetector():
def onChange(self, val): #callback when the user change the ceil
self.ceil = val
def __init__(self,ceil=8, doRecord=True, showWindows=True):
self.writer = None
self.font = None
self.doRecord=doRecord #Either or not record the moving object
self.show = showWindows #Either or not show the 2 windows
self.frame = None
self.capture=cv.CaptureFromCAM(0)
self.frame = cv.QueryFrame(self.capture) #Take a frame to init recorder
if doRecord:
self.initRecorder()
self.frame1gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) #Gray frame at t-1
cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY)
#Will hold the thresholded result
self.res = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U)
self.frame2gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) #Gray frame at t
self.width = self.frame.width
self.height = self.frame.height
self.nb_pixels = self.width * self.height
self.ceil = ceil
self.isRecording = False
self.trigger_time = 0 #Hold timestamp of the last detection
if showWindows:
cv.NamedWindow("Image")
def initRecorder(self): #Create the recorder
codec = cv.CV_FOURCC('D', 'I', 'V', 'X')
self.writer=cv.CreateVideoWriter(datetime.now().strftime("%b-%d_%H:%M:%S")+".avi", codec, 15, cv.GetSize(self.frame), 1)
self.font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8)
def run(self):
global count
started = time.time()
while True:
curframe = cv.QueryFrame(self.capture)
instant = time.time()
self.processImage(curframe)
if not self.isRecording:
if self.somethingHasMoved():
self.trigger_time = instant
if instant > started +5:
print "Human Detected"
count += 1
print(count/2)
orig_stdout = sys.stdout
f = open('out.txt', 'a+')
sys.stdout = f
print(count/2)
sys.stdout = orig_stdout
f.close()
orig_stdout = sys.stdout
f = open('log.txt', 'a+')
sys.stdout = f
timestampc =('Timestamp: {:%Y-%b-%d %H:%M:%S}'.format(datetime.datetime.now()))
print(timestampc+' Log Entry : 1')
sys.stdout = orig_stdout
f.close()
if self.doRecord:
self.isRecording = True
else:
if instant >= self.trigger_time +10:
print "Stop recording"
self.isRecording = False
else:
cv.PutText(curframe,datetime.now().strftime("%b %d, %H:%M:%S"), (25,30),self.font, 0)
cv.WriteFrame(self.writer, curframe)
if self.show:
cv.ShowImage("Image", curframe)
cv.Copy(self.frame2gray, self.frame1gray)
c=cv.WaitKey(1)
if c==27 or c == 1048603:
break
def processImage(self, frame):
cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY)
cv.AbsDiff(self.frame1gray, self.frame2gray, self.res)
cv.Smooth(self.res, self.res, cv.CV_BLUR, 5,5)
element = cv.CreateStructuringElementEx(5*2+1, 5*2+1, 5, 5, cv.CV_SHAPE_RECT)
cv.MorphologyEx(self.res, self.res, None, None, cv.CV_MOP_OPEN)
cv.MorphologyEx(self.res, self.res, None, None, cv.CV_MOP_CLOSE)
cv.Threshold(self.res, self.res, 10, 255, cv.CV_THRESH_BINARY_INV)
def somethingHasMoved(self):
nb=0
for y in range(self.height):
for x in range(self.width):
if self.res[y,x] == 0.0:
nb += 1
avg = (nb*100.0)/self.nb_pixels
if avg > self.ceil:
return True
else:
return False
if __name__=="__main__":
detect = MotionDetector(doRecord=False)
detect.run()
Unduh - https://www.hackster.io/code_files/438321/download
Setelah selesai, cukup simpan file dengan mengetik "CTRL+X", lalu Y, dan lalu ENTER. Skrip dapat dijalankan dengan mengetik perintah berikut:
python main.py
Anda seharusnya dapat melihat gambar pada layar dan silakan tonton video untuk memverifikasi, jika diperlukan dan ada jumlah orang yang dihitung oleh program di terminal.
Saya baru saja membuat enclosure dengan lembar MDF untuk Arduino dan Raspberry Pi 3
Membuat Dasbor untuk Desktop/App
Langkah 1: Instal Apache
Instal paket apache2 dengan perintah ini:
sudo apt install apache2 -y
Langkah 2: Instal PHP
Untuk mengizinkan server Apache Anda memproses file PHP, Anda perlu menginstal versi terbaru PHP dan modul PHP untuk Apache. Ketik perintah berikut untuk menginstal ini:
sudo apt install php libapache2-mod-php -y
Sekarang unduh Dashboard.zip :
cd /var/www/html
wget "https://hacksterio.s3.amazonaws.com/uploads/attachments/1097966/Dashboard.zip"
dan Instal unzip:
sudo apt-get install unzip
ekstrak file dari file ZIP:
unzip Dashboard.zip
Sekarang simpan dan segarkan browser Anda. Anda seharusnya melihat
Mengatur Raspberry Pi sebagai Titik Akses Nirkabel
Silakan ikuti tautan ini https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
Catat: Namai Titik Akses Nirkabel sebagai SanitizingTunnel
interface=wlan0
driver=nl80211
ssid=SanitizingTunnel
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=SecretPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
Sekarang mari kita mulai membangun aplikasi.
Aplikasi Android:
Prasyarat: Android Studio
Anda dapat dengan mudah mengunduh kode secara langsung dari sini.
Dan ubah kredensial Anda seperti Alamat IP Raspberry Pi Anda sesuai kebutuhan.
Aplikasi iOS:
Prasyarat: XCode
Anda dapat dengan mudah mengunduh kode secara langsung dari sini.
Dan ubah kredensial Anda seperti Alamat IP Raspberry Pi Anda sesuai kebutuhan.
Larutan Kimia yang Digunakan
Terowirus disinfeksi memiliki 0,4% larutan hipoklorit natrium dalam 100 liter air.
Update - Saya telah melihat banyak komentar yang mengatakan bahwa Anda menggunakan kimia berbahaya.
Jadi, saya hanya mengumpulkan informasi dari penjual yang menyuplai saya dengan kimia ini. Jadi dia memberitahu saya bahwa kimia yang saya gunakan dalam terowirus ini berasal dari Raman & Weil Pvt. Ltd dan mereka memiliki "Declaration" dari Bode Chemie Germany, tentang keberhasilan terhadap COVID-19.
Tautan Resmi - https://ramanweil.com/pdf/Declaration%20from%20Bode%20Chemie%20Germany%20on%20efficacy%20against%20COVID%2019.pdf
Menggabungkan Semua
Akhirnya, saatnya untuk menyalakan Terowirus dan memeriksa semua rutinitas dan aplikasi bekerja sesuai rencana.
Biaya
Tautan - https://docs.google.com/spreadsheets/d/1jt-hy8N8IwuQnaLYt-25BywdlREkEhp5zjAfYC6eGqw/edit?usp=sharing
Kode
- Kode Arduino Terowirus
- main.py
- File Dasbor
- Kode Sumber Android Sanitation-Tunnel
- Aplikasi Android Sanitation-Tunnel
- Kode Sumber iOS Sanitation-Tunnel
Kode Arduino TerowirusC/C++
/* * Smart Disinfection and Sanitation Tunnel */ int relayPin = 12; // choose the pin for the Relay Pin int inputPin = 2; // choose the input pin (for PIR sensor) int inputPin2 = 3; // choose the input pin (for PIR sensor 02) int pirState = LOW; // we start, assuming no motion detected int val = 0; // variable for reading the pin status int val2 = 0; // variable for reading the pin status void setup() { pinMode(relayPin, OUTPUT); // declare Relay as output pinMode(inputPin, INPUT); // declare PIR sensor as input pinMode(inputPin2, INPUT); Serial.begin(9600); } void loop(){ val = digitalRead(inputPin); // read input value val2 = digitalRead(inputPin2); // read input value if (val == HIGH || val2 == HIGH) { // check if the input is HIGH digitalWrite(relayPin, HIGH); // turn Relay ON if (pirState == LOW) { // we have just turned on Serial.println("Motion detected!"); // 15 sec delay delay(15000); // We only want to print on the output change, not state pirState = HIGH; } } else { digitalWrite(relayPin, 0); // turn Relay OFF if (pirState == HIGH){ // we have just turned of Serial.println("Motion ended!"); // We only want to print on the output change, not state pirState = LOW; } } }
main.pyPython
import cv2.cv as cv from datetime import datetime import time import sys import datetime count=0 class MotionDetector(): def onChange(self, val): #callback when the user change the ceil self.ceil = val def __init__(self,ceil=8, doRecord=True, showWindows=True): self.writer = None self.font = None self.doRecord=doRecord self.show = showWindows self.frame = None self.capture=cv.CaptureFromCAM(0) self.frame = cv.QueryFrame(self.capture) if doRecord: self.initRecorder() self.frame1gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY) self.res = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) self.frame2gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) self.width = self.frame.width self.height = self.frame.height self.nb_pixels = self.width * self.height self.ceil = ceil self.isRecording = False self.trigger_time = 0 if showWindows: cv.NamedWindow("Image") def initRecorder(self): codec = cv.CV_FOURCC('D', 'I', 'V', 'X') self.writer=cv.CreateVideoWriter(datetime.now().strftime("%b-%d_%H:%M:%S")+".avi", codec, 15, cv.GetSize(self.frame), 1) self.font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) def run(self): global count started = time.time() while True: curframe = cv.QueryFrame(self.capture) instant = time.time() self.processImage(curframe) if not self.isRecording: if self.somethingHasMoved(): self.trigger_time = instant if instant > started +5: print "Human Detected" count += 1 print(count/2) orig_stdout = sys.stdout f = open('out.txt', 'a+') sys.stdout = f print(count/2) sys.stdout = orig_stdout f.close() orig_stdout = sys.stdout f = open('log.txt', 'a+') sys.stdout = f timestampc =('Timestamp: {:%Y-%b-%d %H:%M:%S}'.format(datetime.datetime.now())) print(timestampc+' Log Entry : 1') sys.stdout = orig_stdout f.close() if self.doRecord: self.isRecording = True else: if instant >= self.trigger_time +10: print "Stop recording" self.isRecording = False else: cv.PutText(curframe,datetime.now().strftime("%b %d, %H:%M:%S"), (25,30),self.font, 0) cv.WriteFrame(self.writer, curframe) if self.show: cv.ShowImage("Image", curframe) cv.Copy(self.frame2gray, self.frame1gray) c=cv.WaitKey(1) if c==27 or c == 1048603: break def processImage(self, frame): cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY) cv.AbsDiff(self.frame1gray, self.frame2gray, self.res) cv.Smooth(self.res, self.res, cv.CV_BLUR, 5,5) element = cv.CreateStructuringElementEx(5*2+1, 5*2+1, 5, 5, cv.CV_SHAPE_RECT) cv.MorphologyEx(self.res, self.res, None, None, cv.CV_MOP_OPEN) cv.MorphologyEx(self.res, self.res, None, None, cv.CV_MOP_CLOSE) cv.Threshold(self.res, self.res, 10, 255, cv.CV_THRESH_BINARY_INV) def somethingHasMoved(self): nb=0 for y in range(self.height): for x in range(self.width): if self.res[y,x] == 0.0: nb += 1 avg = (nb*100.0)/self.nb_pixels if avg > self.ceil: return True else: return False if __name__=="__main__": detect = MotionDetector(doRecord=False) detect.run()
Dashboard FilesPHP
Tidak ada pratinjau (hanya unduhan).
Sanitation-Tunnel Android Source CodeJava
Tidak ada pratinjau (hanya unduhan).
Sanitation-Tunnel Android AppJava
Demo App
Tidak ada pratinjau (hanya unduhan).
Sanitation-Tunnel iOS Source CodeSwift
Tidak ada pratinjau (hanya unduhan).
Smart Disinfection and Sanitation Tunnel
https://github.com/yugn27/Smart-Disinfection-and-Sanitation-Tunnel
Bagian dan Enclosure Kustom
smart_disinfection_and_sanitation_tunnel_prlFu8ZRXO.3mf
Skematik
Diagram Rangkaian - file fritzing smart_disinfection_and_sanitation_tunnel_Zkb20Q5S2B.fzz