Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Intelligenter Desinfektions- und Hygienetunnel

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
Jumper (generisch)
× 1
PIR-Bewegungssensor (generisch)
× 2
12-V-Leistungsrelais (4PDT)
× 1
12 Volt SMPS
× 1
Seeed Grove - 2-Kanal-SPDT-Relais
× 1
5 Volt SMPS
× 1
Kippschalter (Ein)-Aus-(Ein)
× 1
Raspberry Pi 3 Model B
× 1
Raspberry Pi Kameramodul V2
× 1
Micro-SD-Karte
× 1
Mikro-USB-auf-USB-Kabel (generisch)
× 1
Kühlkörper
× 1
1 PS Wasserpumpe
× 1
Stahlkastenrohr
× 1
Wassertank (200 L)
× 1
PVC-Kunststoffrohr
× 1
4-Way Fogger
× 1
Banner Flex
× 1
T-Stück
× 1
Mikroschlauchleitung
× 1
Wandleuchte
× 1
Ellbogen
× 1
Kabelbinder, doppelseitig
× 1

Notwendige Werkzeuge und Maschinen

Schweißgerät
Abschneidemaschine
Lötkolben (generisch)
Lötdraht, bleifrei
Laserschneider (generisch)

Apps und Onlinedienste

Arduino-IDE
Raspberry Pi Raspbian
OpenCV

Über dieses Projekt

Einführung

Der Smart Disinfection and Sanitation Tunnel ist eine Demonstration dafür, wie Er entworfen wurde, um Personen, die den Tunnel in etwa 15 Sekunden passieren, maximalen Schutz zu bieten. Was der Community helfen kann, gegen COVID-19 zu kämpfen.

Die Hauptidee dieses Projekts besteht darin, einen Tunnel zu bauen, der die Ausbreitung von COVID-19 verhindern kann.

Dieser Desinfektions- und Hygienetunnel ist vorbereitet, um Personen innerhalb von 15 Sekunden von möglichen Bakterien zu desinfizieren.

Die verwendete Desinfektionslösung besteht aus einer Kombination von Natriumhypochlorit (NaOCl) und Wasser (H2O). Das Desinfektionsmittel ist nicht flüchtig und ermöglicht so eine verlängerte veridische und bakterizide Wirkung sowie eine Desinfektion der Oberflächen.

Also habe ich diese Initiative ergriffen, um diesen intelligenten Desinfektions- und Hygienetunnel zu bauen. Dieser Tunnel wurde in einer Zeitspanne von 12 Stunden gebaut. Es kann eine Person in nur 15 Sekunden vollständig von Kopf bis Fuß desinfizieren und die verwendete Lösung ist völlig unbedenklich*. Die Gesamtkosten des Tunnels betragen ungefähr 30.000 oder 400 Dollar. (Überarbeitete Kosten)

Wo verwenden?

  • Lebensmittelmärkte
  • Büros
  • Einkaufszentren
  • Flughäfen
  • Bushaltestellen
  • Bahnhöfe
  • Polizeistationen
  • Hochschule
  • Krankenhäuser
  • Kolonie

Wie es funktioniert

An der Seite jedes Tunnels befindet sich eine 1HP-Wasserpumpe, die die Lösung von 0,4% Natriumhypochloritlösung in 100 Liter Wasser aus dem Tank aufnimmt. Da die Maschine automatisch ist, erkennt sie, ob jemand in den Tunnel eindringt. Wenn jemand den Tunnel betritt, wird die Wasserpumpe für 15 Sekunden gestartet. Damit der Benutzer diesen Tunnel passieren kann und sich niemand im Tunnel aufhält, wird die Pumpe ausgeschaltet, um Wasser und Strom zu sparen. Das neblige Desinfektionsspray schützt Bürger für einen Zeitraum von mindestens 60 Minuten (ca.*) vor der Ansteckung mit Bakterien. Da es die Luft, exponierte Haut und menschliche Kleidung desinfiziert.

An der Seite des Tunnels befindet sich ein Kunststofftank für 200 Liter Lösung und eine Pumpe für das Hochdruckrohrsystem. Laut Berechnung sollte die Lösung für 8-10 Stunden reichen. Da es über dem Eingang einen Bewegungssensor hat, um ein Antiseptikum zu sparen. (Der Mai variiert je nach Personen, die den Tunnel betreten**)

Flussdiagramm

Hardware-Setup

Den Rahmen habe ich aus einem Metallprofil gelegt, zusammenklappbar, damit er von Ort zu Ort transportiert und, wenn alles vorbei ist, für den Fall der nächsten Apokalypse aufbewahrt werden kann. Die Abdeckung erfolgt durch das Banner (das für Außenwerbung verwendet wird ). Das Banner ist mit dem Metallprofil mit Kunststoffbändern einfach zu befestigen. Es ist schnell und erfordert keine besonderen Fähigkeiten.

Schauen Sie sich das Modell an - https://skfb.ly/6RGvZ

An der Seite des Tunnels befindet sich ein Kunststofftank für 200 Liter Lösung und eine Pumpe für das Hochdruckrohrsystem, die mit der 4-Way Fogger Assembly verbunden ist.

Im gesamten Tunnel wurden Mikro-Tübbing-Rohre verwendet, um die Lösung an die Nebelmaschine zu liefern.

Im Inneren befindet sich eine Hochdruckleitung mit 4 anschließbaren 4-Way Foggern. Der Nebel hinterlässt keine Spuren auf der Kleidung, während er die ankommende Person vollständig einhüllt und das Virus auch in schwer zugänglichen Kleidungsfalten vernichtet und noch einige Zeit nach dem Verlassen schützt.

Als Lösung wird in diesem Projekt eine zertifizierte Lösung verwendet. (Zertifikat unten beigefügt)

4-Wege-Nebelgerät

  • Entladerate:30 LPH/0,5 LPM (für 1 Nebelgerät)
  • Empfohlener Druck:45-60 psi
  • Durchschnittliche Tröpfchengröße:65 Mikrometer (bei 55-60 psi)
  • Erforderliche Filtrierung:130 Mikron (120 mesh)
  • Pumpe erforderlich:40 bis 45 Meter Förderhöhe

Anderes verwendetes Zubehör

Bereiten Sie das Arduino vor

Die Wasserpumpe funktioniert tatsächlich, indem sie die Infrarotstrahlen erkennt. Immer wenn der menschliche Körper in die Nähe eines Bewegungssensors kommt, so dass der menschliche Körper Infrarotstrahlen reflektiert, erkennt der Bewegungssensor diese Infrarotstrahlen und gibt uns ein HIGH-Signal über den Ausgangsstift. Dieses HIGH-Signal wird dann vom Arduino gelesen. Wenn Arduino also ein HIGH-Signal liest, gibt es ein HIGH-Signal an das Relaismodul, was bedeutet, dass das Relais einschaltet und als Ergebnis das Power-Relais einschaltet und die Wasserpumpe für 15 Sekunden einschaltet (Can verändert sein). Wenn der Arduino ein LOW-Signal liest, wird der Relaisstift auf LOW gesetzt und die Wasserpumpe bleibt daher ausgeschaltet.

In diesem hatte ich 2 PIR-Sensoren verwendet, um es genauer zu machen, wenn einer von ihnen die Bewegung erkennt, dann schaltet sich das Relais für 15 Sekunden ein (kann geändert werden).

Wir können das 5V-Relais nicht direkt mit der Wasserpumpe verwenden, da in meinem Fall die Wasserpumpe, die ich in diesem Projekt verwendet hatte, eine Ampere (A)-Bewertung von 16 Ampere hat und das 5 V-Relais eine maximale Last von 10 Ampere hat, um die Wasserpumpe zu steuern Ich habe ein weiteres Relais mit 5V-Relaismodul verwendet. das ist ein 12-V-Leistungsrelais.

Code:

/*
* Intelligenter Desinfektions- und Hygienetunnel
*/

int relayPin =12; // Wählen Sie den Pin für den Relais-Pin

int inputPin =2; // Wählen Sie den Eingangspin (für PIR-Sensor)
int inputPin2 =3; // Wählen Sie den Eingangspin (für PIR-Sensor 02)

int pirState =LOW; // beim Start, vorausgesetzt, keine Bewegung erkannt
int val =0; // Variable zum Lesen des Pin-Status
int val2 =0; // Variable zum Lesen des Pin-Status


void setup () {
pinMode (relayPin, OUTPUT); // Relais als Ausgang deklarieren
pinMode(inputPin, INPUT); // Sensor als Eingang deklarieren
pinMode (inputPin2, INPUT);
Serial.begin(9600);
}

void loop(){
val =digitalRead(inputPin); // Eingabewert lesen
val2 =digitalRead (inputPin2); // Eingangswert lesen
if (val ==HIGH || val2 ==HIGH) {// prüfen, ob der Eingang HIGH ist
digitalWrite (relayPin, HIGH); // Relais einschalten
if (pirState ==LOW) {
// eingeschaltet
Serial.println ("Bewegung erkannt!");
// 15 Sek. Verzögerung
delay(15000);
pirState =HIGH;
}
} else {
digitalWrite(relayPin, 0); // Relais ausschalten
if (pirState ==HIGH){
// ausgeschaltet
Serial.println("Bewegung beendet!");
pirState =LOW;
}
}

}

Die endgültige Verkabelung für das Projekt sieht etwas unordentlich aus, hat aber gut funktioniert.

Nachdem alles verkabelt war, teste ich es einfach mit der grundlegenden Erfassung und überprüfte dann, ob das Relais zündete.

Bereiten Sie den Raspberry Pi 3 vor (optional)

Dies ist optional. Falls Sie eine Analyse der Daten durchführen und die Anzahl der Personen, die diesen Tunnel benutzen, genau zählen müssen. Sie können diesen Teil implementieren.

Obwohl es bei einigen physikalischen Sensoren wie PIR-Sensor und Ultraschallsensor viele Möglichkeiten gibt, dies zu zählen, fand ich dies genauer, als ich an alle Chancen dachte.

Es gibt ein Modell für maschinelles Lernen, das den menschlichen Körper mithilfe von OpenCV in Python erkennt und das Protokoll in der Datei speichert, die verarbeitet werden kann, um die Daten in der App anzuzeigen.

Schließen Sie die Pi-Kamera an

  • Schalten Sie den Raspberry Pi aus
  • Suchen Sie das Kameramodul zwischen dem USB-Modul und den HDMI-Modulen.
  • Entriegeln Sie den schwarzen Plastikclip, indem Sie ihn (sanft) nach oben ziehen
  • Führen Sie das Flachbandkabel des Kameramoduls ein (Metallstecker nach außen zeigend von den Ethernet-/USB-Ports eines Raspberry Pi 4)
  • Verriegeln Sie den schwarzen Plastikclip

Aktivieren Sie die Pi-Kamera

  • Laufen
sudo raspi-config 
  • Wählen Sie Schnittstellenoptionen (dh 4. Option) aus dem Hauptmenü des Raspberry Pi Software Configuration Tools. Drücken Sie ENTER.
  • Wählen Sie Kamera aktivieren (dh 5. Option) Menüoption und drücken Sie ENTER.
  • Verwenden Sie im nächsten Menü die rechte Pfeiltaste, um AKTIVIEREN . hervorzuheben und drücken Sie ENTER.

Pi-Kamera testen

Überprüfen Sie als Nächstes, dass die Pi-Kamera richtig installiert ist, indem Sie das Vorschau-Overlay der Kamera starten. Das Overlay wird auf dem Bildschirm gerendert.

  • Mit dem VNC Viewer eine Verbindung zu Raspberry Pi herstellen.
  • Führen Sie den folgenden Befehl aus:
raspistill -v -o test.jpg 

Wenn Sie die Pi-Kamera richtig installiert haben, sollten Sie auf Ihrem Bildschirm gerendertes Filmmaterial von der Kamera sehen.

OpenCV installieren

Bitte folgen Sie diesem Link, um OpenCV zu installieren

https://www.learnopencv.com/install-opencv-4-on-raspberry-pi/

Code

Führen Sie den folgenden Befehl aus, um eine neue Skriptdatei zu erstellen und zu öffnen:

cd Desktop
sudo nano main.py

Kopiere das Skript und füge es dann in die neu erstellte Datei ein.

cv2.cv als cv importieren
from datetime import datetime
import time
import sys
import datetime
count=0
class MotionDetector():
def onChange(self, val):#callback wenn der Benutzer die ceil ändert
self.ceil =val
def __init__(self,ceil=8, doRecord=True, showWindows=True):
self.writer =None
self.font =None
self.doRecord=doRecord #Entweder das sich bewegende Objekt aufzeichnen oder nicht
self.show =showWindows # Entweder die 2 Fenster anzeigen oder nicht
self.frame =None
self.capture=cv.CaptureFromCAM(0)
self.frame =cv.QueryFrame(self.capture) #Take a frame Rekorder initieren
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)
#Hält das Schwellenergebnis auf
self.res =cv.CreateMat(self.frame. Höhe, self.frame.width, cv.CV_8U)
self.frame2gray =cv.CreateMat(self.fra me.height, self.frame.width, cv.CV_8U) #Grauer Rahmen bei 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 #Zeitstempel der letzten Erkennung halten
if showWindows :
cv.NamedWindow("Image")
#cv.CreateTrackbar("Mytrack", "Image", self.ceil, 100, self.onChange)
def initRecorder(self):#Erstelle den Rekorder
codec =cv.CV_FOURCC('D', 'I', 'V', 'X')
#codec =cv.CV_FOURCC("D", "I", " B", " ")
self.writer=cv.CreateVideoWriter(datetime.now().strftime("%b-%d_%H:%M:%S")+".avi", codec, 15, cv.GetSize(self.frame), 1)
#FPS auf 15 gesetzt, weil es die FPS meiner Cam zu sein scheint, aber an Ihre Bedürfnisse angepasst werden sollte
self.font =cv.InitFont (cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) #Erstellt eine Schriftart
def run(self):
global count
started =time.time()
while True:
curframe =cv.QueryFrame(self.capture)
instant =time.time() #Zeitstempel des Frames abrufen
self.processImage(curframe) #Verarbeiten des Bildes
wenn nicht self.isRecording:
if self.somethingHasMoved():
self.trigger_time =instant #Aktualisieren Sie die trigger_time
if instant> started +5:#Warten Sie 5 Sekunden nach dem Start der Webcam, um die Helligkeit anzupassen usw..
Drucken Sie "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()
#timestamp log
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:#set isRecording=True nur wenn wir ein Video aufnehmen
self.isRecording =True
else:
if instant>=self.trigger_time +10:#Aufnahme während 10 Sekunden
Druck "Stopp Aufnahme"
self.isRecording =False
else:
cv.PutText(curframe,datetime.now().strftime("%b %d, %H:%M:%S" ), (25,30),self.font, 0) #Setze Datum in den Rahmen
cv.WriteFrame(self.writer, curframe) #Schreibe den Rahmen
if self.show:
cv.ShowImage("Image", curframe)
#cv.ShowImage("Res", self.res)
cv.Copy(self.frame2gray, self.frame1gray)
c=cv.WaitKey(1)
if c==27 oder c ==1048603:#Break, wenn der Benutzer 'Esc' eingibt.
break
def processImage(self, frame):
cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY)
#Absdiff um den Unterschied zwischen den Frames zu erhalten
cv.AbsDiff(self.frame1gray, self.frame2gray, self.res)
#Entferne das Rauschen und setze den Schwellenwert
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.Thresho ld(self.res, self.res, 10, 255, cv.CV_THRESH_BINARY_INV)
def etwasHasMoved(self):
nb=0 #Hält die Anzahl der schwarzen Pixel
für y in range(self.height):#Iteriere das Lochbild
für x in range(self.width):
if self.res[y,x] ==0.0:#Wenn das Pixel schwarz ist, behalte it
nb +=1
avg =(nb*100.0)/self.nb_pixels #Berechnen Sie den Durchschnitt der schwarzen Pixel im Bild
#print "Average:",avg, "%\ r",
if avg> self.ceil:#If over the creil trigger the alarm
return True
else:
return False
if __name__=="__main__ ":
detect =MotionDetector(doRecord=False)
detect.run()

Herunterladen - https://www.hackster.io/code_files/438321/download

Sobald dies erledigt ist, speichern Sie die Datei einfach, indem Sie "STRG+X", dann Y und dann die EINGABETASTE eingeben. Das Skript kann durch Eingabe des folgenden Befehls ausgeführt werden:

python main.py 

Sie sollten in der Lage sein, ein Bild auf dem Bildschirm zu sehen und sich das Video bei Bedarf anzusehen, um die Anzahl der Personen durch das Programm im Terminal zu überprüfen.

Ich habe gerade ein Gehäuse mit MDF-Blatt für den Arduino und Raspberry Pi 3 erstellt

Erstellen eines Dashboards für Desktop/App

Schritt 1:Apache installieren

Installiere den apache2 Paket mit diesem Befehl:

sudo apt install apache2 -y 

Schritt 2:PHP installieren

Damit Ihr Apache-Server PHP-Dateien verarbeiten kann, müssen Sie die neueste Version von PHP und das PHP-Modul für Apache installieren. Geben Sie den folgenden Befehl ein, um diese zu installieren:

sudo apt install php libapache2-mod-php -y 

Laden Sie jetzt die Dashboard.zip herunter :

cd /var/www/html
wget "https://hacksterio.s3.amazonaws.com/uploads/attachments/1097966/Dashboard.zip"

und installieren entpacken:

sudo apt-get install entpacken 

Extrahieren Sie die Dateien aus einer ZIP-Datei:

Dashboard.zip entpacken 

Speichern und aktualisieren Sie nun Ihren Browser. Sie sollten sehen

Einrichten eines Raspberry Pi als Wireless Access Point

Bitte folgen Sie diesem Link https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

Hinweis:Benennen Sie den Wireless Access Point als 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

Beginnen wir nun mit der Entwicklung der App.

Android-App:

Voraussetzung:Android Studio

Du kannst den Code einfach hier direkt herunterladen.

Und ändern Sie Ihre Zugangsdaten wie die IP-Adresse Ihres Himbeer-Pi nach Ihren Bedürfnissen.

iOS-App:

Voraussetzung:XCode

Du kannst den Code einfach hier direkt herunterladen.

Und ändern Sie Ihre Zugangsdaten wie die IP-Adresse Ihres Himbeer-Pi nach Ihren Bedürfnissen.

Verwendete chemische Lösung

Der Desinfektionstunnel enthält 0,4% Natriumhypochloritlösung in 100 Liter Wasser.

Aktualisierung - Ich hatte viele Kommentare gesehen, die besagten, dass Sie schädliche Chemikalien verwenden.

Also sammle ich nur die Informationen des Verkäufers ein, der mich mit dieser Chemikalie beliefert hat. Also sagte er mir, dass die Chemikalie, die ich in diesem Tunnel verwende, von Raman &Weil Pvt. Ltd und sie haben "Erklärung " von Bode Chemie Deutschland , zur Wirksamkeit gegen COVID-19 .

Offizieller Link - http://ramanweil.com/pdf/Declaration%20from%20Bode%20Chemie%20Germany%20on%20efficacy%20against%20COVID%2019.pdf

Alles zusammenfügen

Schließlich war es an der Zeit, den Tunnel einzuschalten und zu überprüfen, ob alle Routinen und die App wie geplant funktionieren.

Kosten

Link – https://docs.google.com/spreadsheets/d/1jt-hy8N8IwuQnaLYt-25BywdlREkEhp5zjAfYC6eGqw/edit?usp=sharing

Code

  • Arduino-Code-Tunnel
  • main.py
  • Dashboard-Dateien
  • Sanitärtunnel für Android-Quellcode
  • Sanitärtunnel-Android-App
  • Sanitärtunnel iOS-Quellcode
Arduino-Code-TunnelC/C++
/* * Intelligenter Desinfektions- und Hygienetunnel */ int relayPin =12; // Wählen Sie den Pin für das Relais Pinint inputPin =2; // Wählen Sie den Eingangspin (für PIR-Sensor)int inputPin2 =3; // Wählen Sie den Eingangspin (für PIR-Sensor 02)int pirState =LOW; // wir beginnen, vorausgesetzt, keine Bewegung erkanntint val =0; // Variable zum Lesen des Pins statusint val2 =0; // Variable zum Lesen des Pin-Status Void setup () { PinMode (relayPin, OUTPUT); // Relais als Ausgang deklarieren pinMode (inputPin, INPUT); // PIR-Sensor als Eingang deklarieren pinMode (inputPin2, INPUT); Serial.begin (9600);} Void Schleife () { val =digitalRead (inputPin); // Eingangswert lesen val2 =digitalRead (inputPin2); // Eingangswert lesen if (val ==HIGH || val2 ==HIGH) {// prüfen, ob der Eingang HIGH ist digitalWrite (relayPin, HIGH); // Relais einschalten, wenn (pirState ==LOW) {// wir haben gerade Serial.println eingeschaltet ("Bewegung erkannt!"); // 15 Sek. Verzögerung Verzögerung (15000); // Wir wollen nur auf die Ausgabeänderung drucken, nicht auf den Zustand pirState =HIGH; } } Else { DigitalWrite (RelayPin, 0); // Relais ausschalten, wenn (pirState ==HIGH) {// wir haben gerade Serial.println ausgeschaltet ("Bewegung beendet!"); // Wir wollen nur auf die Ausgabeänderung drucken, nicht auf den Zustand pirState =LOW; } } }
main.pyPython
import cv2.cv as cvfrom datetime import datetimeimport timeimport sysimport datetimecount=0class MotionDetector():def onChange(self, val):#callback wenn der Benutzer die ceil ändert self.ceil =val def __init__(self,ceil=8 , doRecord=True, showWindows=True):self.writer =Keine self.font =Keine self.doRecord=doRecord #Entweder das sich bewegende Objekt aufzeichnen self.show =showWindows #Entweder die 2 Fenster anzeigen self.frame =Keine self.capture=cv.CaptureFromCAM(0) self.frame =cv.QueryFrame(self.capture) #Nehmen Sie einen Frame zum Initialisieren des Recorders, wenn doRecord:self.initRecorder() self.frame1gray =cv.CreateMat(self.frame. height, self.frame.width, cv.CV_8U) #Grauer Rahmen bei t-1 cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY) #Hält das Schwellenwertergebnis an 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) #Grauer Rahmen bei t self.width =self. frame.width self.height =self.frame.height self.nb_p ixels =self.width * self.height self.ceil =ceil self.isRecording =False self.trigger_time =0 #Hold Timestamp der letzten Erkennung if showWindows:cv.NamedWindow("Image") #cv.CreateTrackbar("Mytrack" , "Image", self.ceil, 100, self.onChange) def initRecorder(self):#Create the recorder codec =cv.CV_FOURCC('D', 'I', 'V', 'X') #codec =cv.CV_FOURCC("D", "I", "B", " ") self.writer=cv.CreateVideoWriter(datetime.now().strftime("%b-%d_%H:%M:%S" )+".avi", codec, 15, cv.GetSize(self.frame), 1) #FPS set at 15 because it seems to be the fps of my cam but should be ajusted to your needs self.font =cv. InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) #Creates a font def run(self):global count started =time.time() while True:curframe =cv.QueryFrame(self.capture) instant =time.time() #Get timestamp o the frame self.processImage(curframe) #Process the image if not self.isRecording:if self.somethingHasMoved():self.trigger_time =instant #Update the trigger_time if instant> started +5:#Wa it 5 second after the webcam start for luminosity adjusting etc.. 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() #timestamp log 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:#set isRecording=True only if we record a video self.isRecording =True else:if instant>=self.trigger_time +10:#Record during 10 seconds print "Stop recording" self.isRecording =False else:cv.PutText(curframe,datetime.now().strftime("%b %d, %H:%M:%S"), (25,30),self.font, 0) #Put date on the frame cv.WriteFrame(self.writer, curframe) #Write the frame if self.show:cv.ShowImage("Image", curframe) #cv.ShowImage("Res", self.res) cv.Copy(self.frame2gray, self.frame1gray) c=cv.WaitKey(1) if c==27 or c ==10 48603:#Break if user enters 'Esc'. break def processImage(self, frame):cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY) #Absdiff to get the difference between to the frames cv.AbsDiff(self.frame1gray, self.frame2gray, self.res) #Remove the noise and do the threshold 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 #Will hold the number of black pixels for y in range(self.height):#Iterate the hole image for x in range(self.width):if self.res[y,x] ==0.0:#If the pixel is black keep it nb +=1 avg =(nb*100.0)/self.nb_pixels #Calculate the average of black pixel in the image #print "Average:",avg, "%\r", if avg> self.ceil:#If over the ceil trigger the alarm return True else:return Falseif __name__=="__main__":de tect =MotionDetector(doRecord=False) detect.run()
Dashboard FilesPHP
Keine Vorschau (nur Download).
Sanitation-Tunnel Android Source CodeJava
Keine Vorschau (nur Download).
Sanitation-Tunnel Android AppJava
Demo App
No preview (download only).
Sanitation-Tunnel iOS Source CodeSwift
Keine Vorschau (nur Download).
Smart Disinfection and Sanitation Tunnel
https://github.com/yugn27/Smart-Disinfection-and-Sanitation-Tunnel

Kundenspezifische Teile und Gehäuse

smart_disinfection_and_sanitation_tunnel_prlFu8ZRXO.3mf

Schaltpläne

Circuit Diagram - fritzing file smart_disinfection_and_sanitation_tunnel_Zkb20Q5S2B.fzz

Herstellungsprozess

  1. Vorteile des IoT in der Landwirtschaft und intelligenten Landwirtschaft
  2. Temperatur- und Feuchtigkeitsdatenlogger
  3. IOT - Smart Jar mit ESP8266, Arduino und Ultraschallsensor
  4. Smart Home Automation und Sicherheitssystem mit 1Sheeld
  5. Smarte Schuhe (automatische Schnürung und Stromerzeugung)
  6. Alles Gute zum Geburtstag:Lichter und Klänge
  7. Smart Face Tracking Roboterauto
  8. Guitar Speed ​​Pick and Stomp Pedal!
  9. Smart Manufacturing:was es ist und seine Vorteile
  10. Industrie 4.0 und Hydraulik