Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Tunnel intelligent de désinfection et d'assainissement

Composants et fournitures

Arduino UNO
× 1
Câbles de raccordement (générique)
× 1
Capteur de mouvement PIR (générique)
× 2
Relais de puissance 12V (4PDT)
× 1
12 Volt SMPS
× 1
Seed Grove - Relais SPDT 2 canaux
× 1
SMPS 5 volts
× 1
Interrupteur à bascule, (On)-Off-(On)
× 1
Raspberry Pi 3 Modèle B
× 1
Module de caméra Raspberry Pi V2
× 1
Carte Micro SD
× 1
Câble Micro-USB vers USB (Générique)
× 1
Dissipateur thermique
× 1
Pompe à eau 1 HP
× 1
Tuyau en acier
× 1
Réservoir d'eau (200 L)
× 1
Tuyau en plastique PVC
× 1
Brumisateur à 4 voies
× 1
Banner Flex
× 1
Joint en T
× 1
Tube Micro
× 1
Lampe murale
× 1
Coude
× 1
Attache de câble, double face
× 1

Outils et machines nécessaires

Machine à souder
Tronçonneuse
Fer à souder (générique)
Fil à souder, sans plomb
Coupe laser (générique)

Applications et services en ligne

Arduino IDE
Raspberry Pi Raspbian
OpenCV

À propos de ce projet

Présentation

Le tunnel intelligent de désinfection et d'assainissement est une démonstration de la façon dont il a été conçu pour offrir une protection maximale aux personnes passant dans le tunnel en 15 secondes environ. Ce qui peut aider la communauté à lutter contre le COVID-19.

L'idée principale de ce projet est de créer un tunnel qui peut essayer d'empêcher la propagation de COVID-19.

Ce tunnel de désinfection et d'assainissement est préparé afin de désinfecter les personnes en 15 secondes de toute bactérie possible.

La solution désinfectante utilisée est constituée d'une combinaison d'hypochlorite de sodium (NaOCl) et d'eau (H2O). Le désinfectant est non volatil, permettant ainsi une activité véridique et bactéricide prolongée et désinfectant les surfaces.

J'ai donc pris cette initiative pour réaliser ce tunnel intelligent de désinfection et d'assainissement. Ce tunnel a été réalisé dans un laps de temps de 12 heures. Il peut désinfecter complètement une personne de la tête aux pieds en seulement 15 secondes et la solution utilisée est totalement inoffensive*. Le coût total du tunnel est d'environ 30 000 ou 400 $. (Coût révisé)

Où utiliser ?

  • Marchés alimentaires
  • Bureaux
  • Centres commerciaux
  • Aéroports
  • Arrêts de bus
  • Gares ferroviaires
  • Commissariats de police
  • Collège
  • Hôpitaux
  • Colonie

Comment ça marche

Une machine à pompe à eau 1HP est placée sur le côté de chaque tunnel qui prend la solution de 0,4% de solution d'hypochlorite de sodium dans 100 litres d'eau du réservoir. Comme la machine est automatique, elle détecte si quelqu'un entre dans le tunnel. Lorsque quelqu'un entre dans le tunnel, la pompe à eau démarre pendant 15 secondes. Pour que l'utilisateur puisse traverser ce tunnel et s'il n'y a personne dans le tunnel, la pompe sera arrêtée pour économiser l'eau et l'électricité. Le spray désinfectant brumeux protège les citoyens contre la capture de bactéries pendant une période d'au moins 60 minutes (environ*). Comme il désinfecte l'air, la peau exposée et les vêtements humains.

Un réservoir en plastique pour 200 litres de solution et une pompe pour le système de canalisation haute pression sont situés sur le côté du tunnel. Selon le calcul, la solution devrait être suffisante pour 8 à 10 heures. Puisqu'il a un détecteur de mouvement au-dessus de l'entrée afin d'économiser un antiseptique. (Peut varier selon les personnes entrant dans le tunnel**)

Organigramme

Configuration du matériel

J'ai posé le cadre sur un profilé métallique, pliable pour qu'il puisse être transporté d'un endroit à l'autre, et quand tout est fini, ranger en cas de prochaine apocalypse. Le revêtement se fait par la bannière (qui est utilisée pour la publicité extérieure pour l'habillage ). La bannière est facile à attacher avec le profilé métallique avec attaches en plastique. C'est rapide et ne nécessite pas de compétences particulières.

Découvrez le modèle - https://skfb.ly/6RGvZ

Un réservoir en plastique pour 200 litres de solution et une pompe pour le système de tuyauterie haute pression sont situés sur le côté du tunnel qui est connecté à un assemblage de brumisateur à 4 voies.

Des micro-tubulures ont été utilisées dans tout le tunnel pour fournir la solution au brumisateur.

À l'intérieur, il y a une canalisation haute pression avec 4 brumisateurs à 4 voies qui peuvent être connectés. Le brouillard ne laisse aucune trace sur les vêtements, tout en enveloppant complètement la personne entrante et détruit le virus même dans les plis de vêtements difficiles à atteindre et protège pendant un certain temps après la sortie.

Comme solution, une solution certifiée est utilisée dans ce projet. (Certificat joint ci-dessous)

Brumisateur à 4 voies

  • Taux de décharge :30 LPH/0,5 LPM (pour 1 brumisateur)
  • Pression recommandée :45-60 psi
  • Taille moyenne des gouttelettes :65 microns (à 55-60 psi)
  • Filtration requise :130 microns (120 mailles)
  • Pompe nécessaire :40 à 45 mètres de hauteur

Autres accessoires utilisés

Préparez l'Arduino

La pompe à eau fonctionne en fait en détectant les rayons infrarouges. Chaque fois que le corps humain s'approche d'un capteur de mouvement de sorte que le corps humain reflète les rayons infrarouges, le capteur de mouvement détecte ces rayons infrarouges et il nous donne un signal ÉLEVÉ via la broche de sortie. Ce signal HAUT est ensuite lu par l'Arduino. Donc, si Arduino lit un signal HAUT, il donnera un signal HAUT au module de relais, ce qui signifie que le relais s'allumera, et par conséquent le relais d'alimentation s'allumera et il allumera la pompe à eau pendant 15 secondes (peut être changé). De même, si l'Arduino lit un signal FAIBLE, la broche de relais sera FAIBLE et, par conséquent, la pompe à eau restera éteinte.

Dans ce cas, j'avais utilisé 2 capteurs PIR pour le rendre plus précis si l'un d'entre eux détecte le mouvement, puis le relais s'allumera pendant 15 secondes (peut être modifié).

Nous ne pouvons pas utiliser le relais 5V directement avec la pompe à eau car dans mon cas, la pompe à eau que j'avais utilisée dans ce projet a une valeur nominale d'ampère (A) de 16ampères et le relais 5V a une charge maximale de 10ampères afin de contrôler la pompe à eau J'ai utilisé un autre relais avec un module de relais 5V. qui est un relais d'alimentation 12V.

Code :

/*
* Tunnel intelligent de désinfection et d'assainissement
*/

int relayPin =12 ; // choisissez la broche pour la broche de relais

int inputPin =2; // choisissez la broche d'entrée (pour le capteur PIR)
int inputPin2 =3; // choisissez la broche d'entrée (pour le capteur PIR 02)

int pirState =LOW; // au démarrage, en supposant qu'aucun mouvement n'est détecté
int val =0 ; // variable pour lire l'état de la broche
int val2 =0; // variable pour lire l'état de la broche


configuration void() {
pinMode(relayPin, OUTPUT); // déclarer le relais comme sortie
pinMode(inputPin, INPUT); // déclarer le capteur comme entrée
pinMode(inputPin2, INPUT);
Serial.begin(9600);
}

boucle vide(){
val =digitalRead(inputPin); // lecture de la valeur d'entrée
val2 =digitalRead(inputPin2); // lit la valeur d'entrée
if (val ==HIGH || val2 ==HIGH) { // vérifie si l'entrée est HIGH
digitalWrite(relayPin, HIGH); // activer le relais
if (pirState ==LOW) {
// activé
Serial.println("Mouvement détecté !");
// délai de 15 secondes
delay (15000);
pirState =HIGH;
}
} else {
digitalWrite(relayPin, 0); // désactiver le relais
if (pirState ==HIGH){
// désactivé
Serial.println("Motion terminée!");
pirState =LOW;
}
}

}

Le câblage final du projet semble un peu désordonné mais a très bien fonctionné.

Une fois que tout a été câblé, je l'ai simplement testé avec une détection de base, puis j'ai vérifié que le relais fonctionnait.

Préparez le Raspberry Pi 3 (facultatif)

Ceci est facultatif. Au cas où vous auriez besoin de faire une analyse des données et de compter précisément le nombre de personnes utilisant ce tunnel. Vous pouvez implémenter cette partie.

Bien qu'il existe de nombreuses façons de compter cela avec certains capteurs physiques comme le capteur PIR et le capteur à ultrasons, j'ai trouvé cela plus précis en pensant à toutes les cotes.

Il existe un modèle d'apprentissage automatique qui détecte le corps humain à l'aide d'OpenCV en Python et stocke le journal dans le fichier qui peut être traité pour afficher les données dans l'application.

Connectez la caméra Pi

  • Éteignez le Raspberry Pi
  • Localisez le module de caméra, entre le module USB et les modules HDMI.
  • Déverrouillez le clip en plastique noir en tirant (doucement) vers le haut
  • Insérez le câble plat du module caméra (connecteurs métalliques tournés vers l'extérieur depuis les ports Ethernet / USB sur un Raspberry Pi 4)
  • Verrouillez le clip en plastique noir

Activer la caméra Pi

  • Exécuter
sudo raspi-config 
  • Sélectionnez les options d'interfaçage (c'est-à-dire la 4e option) dans le menu principal de l'outil de configuration du logiciel Raspberry Pi. Appuyez sur ENTRÉE.
  • Sélectionnez le Activer la caméra (c'est-à-dire 5ème option) option de menu et appuyez sur ENTER.
  • Dans le menu suivant, utilisez la touche fléchée droite pour mettre en surbrillance ACTIVER et appuyez sur ENTER.

Tester la caméra Pi

Ensuite, vérifiez que la caméra Pi est correctement installée en démarrant la superposition d'aperçu de la caméra. La superposition s'affichera à l'écran.

  • Connectez-vous au Raspberry Pi à l'aide de la visionneuse VNC.
  • Exécutez la commande suivante :
raspistill -v -o test.jpg 

Si vous avez correctement installé la caméra Pi, vous devriez voir les images de la caméra rendues sur votre écran.

Installation d'OpenCV

Veuillez suivre ce lien pour installer OpenCV

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

Code

Exécutez la commande suivante pour créer et ouvrir un nouveau fichier de script :

cd Desktop
sudo nano main.py

Copiez le script, puis collez-le dans le nouveau fichier que vous avez créé.

importer cv2.cv en tant que cv
depuis datetime import datetime
import time
import sys
import datetime
count=0
class MotionDetector() :
def onChange(self, val) :#callback lorsque l'utilisateur modifie le plafond
self.ceil =val
def __init__(self,ceil=8, doRecord=True, showWindows=True) :
self.writer =None
self.font =None
self.doRecord=doRecord #Enregistrer ou non l'objet en mouvement
self.show =showWindows # Afficher ou non les 2 fenêtres
self.frame =None
self.capture=cv.CaptureFromCAM(0)
self.frame =cv.QueryFrame(self.capture) #Prendre un cadre pour initialiser l'enregistreur
if doRecord :
self.initRecorder()
self.frame1gray =cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) #Gray frame à t-1
cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY)
#Contiendra le résultat seuillé
self.res =cv.CreateMat(self.frame. hauteur, self.frame.width, cv.CV_8U)
self.frame2gray =cv.CreateMat(self.fra me.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 #Conserver l'horodatage de la dernière détection
if showWindows :
cv.NamedWindow("Image")
#cv.CreateTrackbar("Mytrack", "Image", self.ceil, 100, self.onChange)
def initRecorder(self):#Créer l'enregistreur
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 défini sur 15 car cela semble être le fps de ma caméra mais devrait être ajusté à vos besoins
self.font =cv.InitFont (cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) #Crée une police
def run(self):
compte global
started =time.time()
while True :
curframe =cv.QueryFrame(self.capture)
instant =time.time() #Obtenir l'horodatage du cadre
self.processImage(curframe) #Traiter l'image
si ce n'est pas self.isRecording :
si self.somethingHasMoved() :
self.trigger_time =instant #Mettre à jour le trigger_time
si instantané> commencé +5 :#Attendez 5 secondes après le démarrage de la webcam pour régler la luminosité, etc.
imprimer "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 =('Horodatage :{:%Y-%b-%d %H:%M:%S }'.format(datetime.datetime.now()))
print(timestampc+' Saisie du journal :1')
sys.stdout =orig_stdout
f.close()
if self.doRecord :#set isRecording=True uniquement si on enregistre une vidéo
self.isRecording =True
else :
if instant>=self.trigger_time +10 :#Enregistrement pendant 10 secondes
imprime "Stop enregistrement"
self.isRecording =False
else :
cv.PutText(curframe,datetime.now().strftime("%b %d, %H:%M:%S" ), (25,30),self.font, 0) #Mettre la date sur le cadre
cv.WriteFrame(self.writer, curframe) #Ecrire le cadre
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 ou c ==1048603 :#Break si l'utilisateur entre 'Esc'.
break
def processImage(self, frame):
cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY)
#Absdiff pour faire la différence entre les cadres
cv.AbsDiff(self.frame1gray, self.frame2gray, self.res)
#Supprimer le bruit et faire le seuil
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, Aucun, Aucun, cv.CV_MOP_CLOSE)
cv.Thresho ld(self.res, self.res, 10, 255, cv.CV_THRESH_BINARY_INV)
def quelquechoseHasMoved(self) :
nb=0 #Contiendra le nombre de pixels noirs
pour y dans range(self.height):#Itérer l'image du trou
pour x in range(self.width):
if self.res[y,x] ==0.0:#Si le pixel est noir garder it
nb +=1
avg =(nb*100.0)/self.nb_pixels #Calculez la moyenne des pixels noirs dans l'image
#print "Average:",avg, "%\ r",
if avg> self.ceil :#Si au-dessus du plafond déclenche l'alarme
retourne True
else :
retourne False
if __name__=="__main__ " :
detect =MotionDetector(doRecord=False)
detect.run()

Télécharger - https://www.hackster.io/code_files/438321/download

Une fois cela fait, enregistrez simplement le fichier en tapant "CTRL+X", puis Y, puis ENTRÉE. Le script peut être exécuté en tapant la commande suivante :

python main.py 

Vous devriez pouvoir voir une image à l'écran et veuillez regarder la vidéo pour vérifier, si nécessaire et il y a le décompte humain par le programme dans le terminal.

Je viens de créer un enclos avec une feuille MDF pour l'Arduino et le Raspberry Pi 3

Création d'un tableau de bord pour Desktop/App

Étape 1 :Installez Apache

Installez apache2 package avec cette commande :

sudo apt install apache2 -y 

Étape 2 :Installez PHP

Pour permettre à votre serveur Apache de traiter les fichiers PHP, vous devrez installer la dernière version de PHP et le module PHP pour Apache. Tapez la commande suivante pour les installer :

sudo apt install php libapache2-mod-php -y 

Téléchargez maintenant le Dashboard.zip :

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

et installez décompressez :

sudo apt-get install unzip 

extraire les fichiers d'un fichier ZIP :

décompressez Dashboard.zip 

Maintenant, enregistrez et actualisez votre navigateur. Vous devriez voir

Configuration d'un Raspberry Pi en tant que point d'accès sans fil

Veuillez suivre ce lien https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

Remarque :Nommez le point d'accès sans fil comme 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

Commençons maintenant à créer l'application.

Application Android :

Prérequis :Android Studio

Vous pouvez simplement télécharger le code directement à partir d'ici.

Et modifiez vos informations d'identification comme l'adresse IP de votre raspberry pi en fonction de vos besoins.

Application iOS :

Prérequis :XCode

Vous pouvez simplement télécharger le code directement à partir d'ici.

Et modifiez vos informations d'identification comme l'adresse IP de votre raspberry pi en fonction de vos besoins.

Solution chimique utilisée

Le tunnel de désinfection contient 0,4% de solution d'hypochlorite de sodium dans 100 litres d'eau.

Mise à jour - J'ai vu beaucoup de commentaires disant que vous utilisez des produits chimiques nocifs.

Donc, je recueille juste les informations du vendeur qui me fournissait ce produit chimique. Alors il m'a dit que le produit chimique que j'utilise dans ce tunnel vient de Raman &Weil Pvt. Ltd et ils ont "Déclaration " de Bode Chemie Allemagne , sur l'efficacité contre le COVID-19 .

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

Tout mettre ensemble

Enfin, il était temps de mettre le tunnel sous tension et de vérifier que toutes les routines et l'application fonctionnent conformément au plan.

Coût

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

Code

  • Tunnel de code Arduino
  • main.py
  • Fichiers de tableau de bord
  • Code source Android du tunnel d'assainissement
  • Application Android Sanitation-Tunnel
  • Code source iOS du tunnel d'assainissement
Tunnel de code ArduinoC/C++
/* * Tunnel intelligent de désinfection et d'assainissement */ int relayPin =12; // choisissez la broche pour le relais Pinint inputPin =2; // choisissez la broche d'entrée (pour le capteur PIR)int inputPin2 =3; // choisissez la broche d'entrée (pour le capteur PIR 02)int pirState =LOW; // nous commençons, en supposant qu'aucun mouvement n'est détectéint val =0; // variable pour lire la broche statusint val2 =0; // variable pour lire l'état de la broche void setup() { pinMode(relayPin, OUTPUT); // déclarer Relay comme sortie pinMode(inputPin, INPUT); // déclarer le capteur PIR comme entrée pinMode(inputPin2, INPUT); Serial.begin(9600);} void loop(){ val =digitalRead(inputPin); // lecture de la valeur d'entrée val2 =digitalRead(inputPin2); // lit la valeur d'entrée if (val ==HIGH || val2 ==HIGH) { // vérifie si l'entrée est HIGH digitalWrite(relayPin, HIGH); // activer le relais if (pirState ==LOW) { // nous venons d'activer Serial.println ("Motion detected!"); // 15 secondes de retard (15000); // Nous voulons seulement imprimer sur le changement de sortie, pas state pirState =HIGH; } } else { digitalWrite(relayPin, 0); // désactiver le relais if (pirState ==HIGH){ // nous venons de désactiver Serial.println("Motion terminée!"); // Nous voulons seulement imprimer sur le changement de sortie, pas state pirState =LOW; } } }
main.pyPython
import cv2.cv as cvfrom datetime import datetimeimport timeimport sysimport datetimecount=0class MotionDetector():def onChange(self, val):#callback lorsque l'utilisateur change le plafond self.ceil =val def __init__(self,ceil=8 , doRecord=True, showWindows=True) :self.writer =Aucun self.font =Aucun self.doRecord=doRecord #Enregistre ou non l'objet en mouvement self.show =showWindows #Affiche ou non les 2 fenêtres self.frame =Aucun self.capture=cv.CaptureFromCAM(0) self.frame =cv.QueryFrame(self.capture) #Prenez une image pour initialiser l'enregistreur si doRecord :self.initRecorder() self.frame1gray =cv.CreateMat(self.frame. hauteur, self.frame.width, cv.CV_8U) #Gray frame at t-1 cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY) #Contiendra le résultat seuillé 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_p ixels =self.width * self.height self.ceil =ceil self.isRecording =False self.trigger_time =0 #Conserver l'horodatage de la dernière détection si showWindows :cv.NamedWindow("Image") #cv.CreateTrackbar("Mytrack" , "Image", self.ceil, 100, self.onChange) def initRecorder(self):#Créer le codec de l'enregistreur =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
Aucun aperçu (téléchargement uniquement).
Sanitation-Tunnel Android Source CodeJava
Aucun aperçu (téléchargement uniquement).
Sanitation-Tunnel Android AppJava
Demo App
No preview (download only).
Sanitation-Tunnel iOS Source CodeSwift
Aucun aperçu (téléchargement uniquement).
Smart Disinfection and Sanitation Tunnel
https://github.com/yugn27/Smart-Disinfection-and-Sanitation-Tunnel

Pièces et boîtiers personnalisés

smart_disinfection_and_sanitation_tunnel_prlFu8ZRXO.3mf

Schémas

Circuit Diagram - fritzing file smart_disinfection_and_sanitation_tunnel_Zkb20Q5S2B.fzz

Processus de fabrication

  1. Avantages de l'IoT dans l'agriculture et l'agriculture intelligente
  2. Enregistreur de données de température et d'humidité
  3. IOT - Smart Jar utilisant ESP8266, Arduino et capteur à ultrasons
  4. Système de domotique et de sécurité intelligent utilisant 1Sheeld
  5. Chaussures intelligentes (laçage automatique et génération d'électricité)
  6. Joyeux anniversaire :lumières et sons
  7. Pédale de vitesse et pédale pour guitare !
  8. Smart Manufacturing :qu'est-ce que c'est et ses avantages
  9. Industrie 4.0 et Hydraulique