Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Túnel inteligente de desinfección y saneamiento

Componentes y suministros

Arduino UNO
× 1
Cables de puente (genéricos)
× 1
Sensor de movimiento PIR (genérico)
× 2
Relé de potencia de 12 V (4PDT)
× 1
SMPS de 12 voltios
× 1
Seeed Grove - Relé SPDT de 2 canales
× 1
SMPS de 5 voltios
× 1
Interruptor de palanca, (On) -Off- (On)
× 1
Raspberry Pi 3 Modelo B
× 1
Módulo de cámara Raspberry Pi V2
× 1
Tarjeta Micro SD
× 1
Cable micro USB a USB (genérico)
× 1
Disipador de calor
× 1
Bomba de agua de 1 HP
× 1
Tubería de caja de acero
× 1
Tanque de agua (200 L)
× 1
Tubería de plástico de PVC
× 1
Nebulizador de 4 vías
× 1
Banner Flex
× 1
Unión en T
× 1
Tubería de micro tubería
× 1
Lámpara Wall Fix
× 1
Codo
× 1
Sujetacables, doble cara
× 1

Herramientas y máquinas necesarias

Máquina de soldar
Máquina de corte
Soldador (genérico)
Alambre de soldadura, sin plomo
Cortadora láser (genérica)

Aplicaciones y servicios en línea

Arduino IDE
Raspberry Pi Raspbian
OpenCV

Acerca de este proyecto

Introducción

El Túnel Inteligente de Desinfección y Saneamiento es una demostración de cómo ha sido diseñado para brindar la máxima protección a las personas que pasan por el túnel en unos 15 segundos. Lo que puede ayudar a la comunidad a luchar contra el COVID-19.

La idea principal de este proyecto es hacer un túnel que pueda intentar prevenir la propagación de COVID-19.

Este túnel de desinfección y saneamiento está preparado para desinfectar a las personas en 15 segundos de posibles bacterias.

La solución desinfectante utilizada consiste en una combinación de hipoclorito de sodio (NaOCl) y agua (H2O). El desinfectante es no volátil, lo que permite una actividad verídica y bactericida prolongada y desinfecta las superficies.

Entonces, tomé esta iniciativa para hacer este Túnel Inteligente de Desinfección y Saneamiento. Este túnel se realizó en un lapso de tiempo de 12 horas. Puede desinfectar completamente a una persona de la cabeza a los pies en un lapso de solo 15 segundos y la solución utilizada es completamente inofensiva *. El costo total del túnel es de aproximadamente 30.000 o 400 dólares. (Costo revisado)

¿Dónde usarlo?

  • Mercados de alimentos
  • Oficinas
  • Centros comerciales
  • Aeropuertos
  • Paradas de autobús
  • Estaciones de tren
  • Comisarías de policía
  • Universidad
  • Hospitales
  • Colonia

Cómo funciona

Se coloca una bomba de agua de 1HP al costado de cada túnel que toma la solución de 0.4% de solución de hipoclorito de sodio en 100 litros de agua del tanque. Como la máquina es automática, detecta si alguien está entrando en el túnel. Cuando alguien entra en el túnel, la bomba de agua se pone en marcha durante 15 segundos. Para que el usuario pueda pasar por ese túnel y si no hay nadie en el túnel se apagará la bomba para ahorrar agua y electricidad. El spray desinfectante brumoso protege a los ciudadanos de contraer bacterias durante un período de al menos 60 minutos (Aprox. *). Ya que desinfecta el aire, la piel expuesta y la ropa humana.

Un tanque de plástico para 200 litros de solución y una bomba para el sistema de tuberías de alta presión se encuentran en el costado del túnel. Según el cálculo, la solución debería ser suficiente para 8-10 horas. Ya que tiene un sensor de movimiento encima de la entrada para guardar un antiséptico. (Mayo varía según las personas que ingresan al túnel **)

Diagrama de flujo

Configuración de hardware

Coloqué el marco de un perfil de metal, plegable para que pudiera ser transportado de un lugar a otro, y cuando todo haya terminado, guardarlo en caso de un próximo apocalipsis. La cubierta está junto a la pancarta (que se utiliza para publicidad exterior ). La pancarta es fácil de colocar con el perfil de metal con bridas de plástico. Es rápido y no requiere habilidades especiales.

Consulte el modelo:https://skfb.ly/6RGvZ

" /> Un tanque de plástico para 200 litros de solución y una bomba para el sistema de tubería de alta presión están ubicados en el costado del túnel que está conectado con el conjunto nebulizador de 4 vías.

Se han utilizado microtubos en todo el túnel para suministrar la solución al nebulizador.

En el interior, hay una tubería de alta presión con 4 nebulizadores de 4 vías que se pueden conectar. La niebla no deja marcas en la ropa, mientras envuelve completamente a la persona entrante y destruye el virus incluso en pliegues de ropa difíciles de alcanzar y protege durante algún tiempo después de la salida.

Como solución, en este proyecto se utiliza una solución certificada. (Certificado adjunto a continuación)

" />

Nebulizador de 4 vías

  • Tasa de descarga:30 LPH / 0.5 LPM (para 1 nebulizador)
  • Presión recomendada:45-60 psi
  • Tamaño promedio de gota:65 micrones (a 55-60 psi)
  • Se requiere filtración:130 micrones (malla 120)
  • Bomba requerida:40 a 45 metros de altura

Otros accesorios utilizados

Prepare el Arduino

La bomba de agua realmente funciona detectando los rayos infrarrojos. Siempre que el cuerpo humano se acerca a un sensor de movimiento para que refleje los rayos infrarrojos, el sensor de movimiento detecta estos rayos infrarrojos y nos da una señal ALTA a través del pin de salida. Esta señal ALTA es luego leída por Arduino. Entonces, si Arduino lee una señal ALTA, le dará una señal ALTA al módulo de relé, lo que significa que el relé se encenderá y, como resultado, el relé de potencia se encenderá y encenderá la bomba de agua durante 15 segundos (puede ser cambiado). De manera similar, si el Arduino lee una señal BAJA, hará que el pin del relé esté BAJO y, como resultado, la bomba de agua permanecerá apagada.

En esto, usé 2 sensores PIR para hacerlo más preciso si alguno de ellos detecta el movimiento, entonces el relé se encenderá durante 15 segundos (se puede cambiar).

No podemos usar el relé de 5 V directamente con la bomba de agua porque en mi caso, la bomba de agua que había usado en este proyecto tiene una clasificación de amperios (A) de 16 amperios y el relé de 5 V tiene una carga máxima de 10 amperios para controlar la bomba de agua. Usé un relé más con el módulo de relé de 5V. que es un relé de potencia de 12V.

Código:

  / * 
* Túnel inteligente de desinfección y saneamiento
* /

int relayPin =12; // elija el pin para el Pin de relé

int inputPin =2; // elige el pin de entrada (para sensor PIR)
int inputPin2 =3; // elija el pin de entrada (para el sensor PIR 02)

int pirState =LOW; // al inicio, asumiendo que no se detecta movimiento
int val =0; // variable para leer el estado del pin
int val2 =0; // variable para leer el estado del pin


void setup () {
pinMode (relayPin, OUTPUT); // declara Relay como salida
pinMode (inputPin, INPUT); // declara el sensor como entrada
pinMode (inputPin2, INPUT);
Serial.begin (9600);
}

bucle vacío () {
val =digitalRead (inputPin); // leer el valor de entrada
val2 =digitalRead (inputPin2); // leer el valor de entrada
if (val ==HIGH || val2 ==HIGH) {// comprobar si la entrada es HIGH
digitalWrite (relayPin, HIGH); // enciende el relé
if (pirState ==LOW) {
// enciende
Serial.println ("¡Movimiento detectado!");
// retardo de 15 segundos
delay (15000);
pirState =HIGH;
}
} else {
digitalWrite (relayPin, 0); // apaga el relé
if (pirState ==HIGH) {
// apaga
Serial.println ("¡Movimiento finalizado!");
pirState =LOW;
}
}

}

El cableado final del proyecto se ve un poco desordenado pero funcionó bien.

>

Después de que todo estuvo cableado, simplemente lo probé con detección básica y luego procedí a verificar que el relé estaba disparando.

Prepare la Raspberry Pi 3 (opcional)

Esto es opcional. En caso de que necesite hacer algún análisis de los datos y contar con precisión el número de personas que utilizan este túnel. Puede implementar esta parte.

Aunque, hay muchas formas de contar eso con algunos sensores físicos como el sensor PIR y el sensor ultrasónico, pero encontré esto más preciso al pensar en todas las probabilidades.

Existe un modelo de aprendizaje automático que detecta el cuerpo humano usando OpenCV en Python y almacena el registro en el archivo que se puede procesar para mostrar los datos en la aplicación.

Conecta la cámara Pi

  • Apague la Raspberry Pi
  • Ubique el módulo de la cámara, entre el módulo USB y los módulos HDMI.
  • Desbloquee el clip de plástico negro tirando (suavemente) hacia arriba
  • Inserte el cable plano del módulo de la cámara (conectores metálicos orientados hacia afuera desde los puertos Ethernet / USB en una Raspberry Pi 4)
  • Bloquear el clip de plástico negro
" />

Habilita la cámara Pi

  • Ejecutar
  sudo raspi-config  
  • Seleccione Opciones de interfaz (es decir, cuarta opción) en el menú principal de la Herramienta de configuración del software Raspberry Pi. Presione ENTER.
  • Seleccione Habilitar cámara (es decir, quinta opción) opción de menú y presione ENTER.
  • En el siguiente menú, use la tecla de flecha derecha para resaltar ENABLE y presione ENTER.

Probar la cámara Pi

A continuación, verifique que la cámara Pi esté instalada correctamente iniciando la superposición de vista previa de la cámara. La superposición se mostrará en la pantalla.

  • Conéctese a Raspberry Pi mediante VNC Viewer.
  • Ejecute el siguiente comando:
  raspistill -v -o test.jpg  

Si instaló la cámara Pi correctamente, debería ver las imágenes de la cámara renderizadas en su pantalla.

Instalación de OpenCV

Siga este enlace para instalar OpenCV

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

Código

Ejecute el siguiente comando para crear y abrir un nuevo archivo de secuencia de comandos:

  cd Desktop 
sudo nano main.py

Copie el script y luego péguelo en el nuevo archivo que creó.

  importar cv2.cv como cv 
de datetime import datetime
import time
import sys
import datetime
count =0
class MotionDetector ():
def onChange (self, val):#callback cuando el usuario cambia el ceil
self.ceil =val
def __init __ (self, ceil =8, doRecord =True, showWindows =True):
self.writer =None
self.font =None
self.doRecord =doRecord # Grabar o no el objeto en movimiento
self.show =showWindows # Mostrar o no las 2 ventanas
self.frame =None
self.capture =cv.CaptureFromCAM (0)
self.frame =cv.QueryFrame (self.capture) #Tomar un marco para iniciar la grabadora
si doRecord:
self.initRecorder ()
self.frame1gray =cv.CreateMat (self.frame.height, self.frame.width, cv.CV_8U) #Gray frame en t-1
cv.CvtColor (self.frame, self.frame1gray, cv.CV_RGB2GRAY)
# Mantendrá el resultado umbral
self.res =cv.CreateMat (self.frame. altura, 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 #Mantenga la marca de tiempo de la última detección
if showWindows :
cv.NamedWindow ("Imagen")
# cv.CreateTrackbar ("Mytrack", "Imagen", self.ceil, 100, self.onChange)
def initRecorder (self):#Crear la grabadora
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 ", códec, 15, cv.GetSize (self.frame), 1)
#FPS establecido en 15 porque parece ser el fps de mi cámara pero debe ajustarse a sus necesidades
self.font =cv.InitFont (cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) # Crea una fuente
def run (self):
conteo global
iniciado =time.time ()
while True:
curframe =cv.QueryFrame (self.capture)
instant =time.time () #Obtener la marca de tiempo del marco
self.processImage (curframe) #Procesar la imagen
si no es self.isRecording:
if self.somethingHasMoved ():
self.trigger_time =instant #Actualice el trigger_time
si instant> comenzó +5:#Espere 5 segundos después del inicio de la cámara web para ajustar la luminosidad, etc.
imprima "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 ()
# registro de marca de tiempo
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 +' Entrada de registro:1 ')
sys.stdout =orig_stdout
f.close ()
if self.doRecord:#set isRecording =True solo si grabamos un video
self.isRecording =True
else:
if instant> =self.trigger_time +10:#Record durante 10 segundos
imprimir "Detener grabando "
self.isRecording =False
else:
cv.PutText (curframe, datetime.now (). strftime ("% b% d,% H:% M:% S " ), (25,30), self.font, 0) #Poner fecha en el marco
cv.WriteFrame (self.writer, curframe) #Escribir el marco
if self.show:
cv.ShowImage ("Imagen", curframe)
# cv.ShowImage ("Res", self.res)
cv.Copy (self.frame2gray, self.frame1gray)
c =cv.WaitKey (1)
if c ==27 o c ==1048603:#Break si el usuario ingresa 'Esc'.
break
def processImage (self, frame):
cv.CvtColor (frame, self.frame2gray, cv.CV_RGB2GRAY)
#Absdiff para obtener la diferencia entre los marcos
cv.AbsDiff (self.frame1gray, self.frame2gray, self.res)
# Elimina el ruido y haz el umbral
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, Ninguno, Ninguno, cv.CV_MOP_CLOSE)
cv.Thresho ld (self.res, self.res, 10, 255, cv.CV_THRESH_BINARY_INV)
def somethingHasMoved (self):
nb =0 # Mantendrá el número de píxeles negros
durante y en range (self.height):#Itere la imagen del agujero
para x en el rango (self.width):
if self.res [y, x] ==0.0:#Si el píxel es negro, mantenga it
nb + =1
avg =(nb * 100.0) /self.nb_pixels #Calcular el promedio de píxeles negros en la imagen
#print "Average:", avg, "% \ r ",
if avg> self.ceil:#Si sobre el techo dispara la alarma
return True
else:
return False
if __name __ ==" __ main__ ":
detect =MotionDetector (doRecord =False)
detect.run ()

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

Una vez hecho esto, simplemente guarde el archivo escribiendo "CTRL + X", luego Y y luego ENTER. El script se puede ejecutar escribiendo el siguiente comando:

  python main.py  

Debería poder ver una imagen en la pantalla y ver el video para verificar, si es necesario, y hay un recuento humano por parte del programa en la terminal.

Acabo de crear un gabinete con hoja MDF para Arduino y Raspberry Pi 3

" />

Creación de un panel para escritorio / aplicación

Paso 1:instale Apache

Instale el apache2 paquete con este comando:

  sudo apt install apache2 -y  

Paso 2:instala PHP

Para permitir que su servidor Apache procese archivos PHP, deberá instalar la última versión de PHP y el módulo PHP para Apache. Escriba el siguiente comando para instalarlos:

  sudo apt install php libapache2-mod-php -y  

Ahora descargue el Dashboard.zip :

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

e instalar descomprimir:

  sudo apt-get install unzip  

extraer los archivos de un archivo ZIP:

  descomprimir Dashboard.zip  

Ahora guarde y actualice su navegador. Debería ver

Configuración de una Raspberry Pi como punto de acceso inalámbrico

Siga este enlace https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

Nota:Nombre el punto de acceso inalámbrico como 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

Ahora comencemos a crear la aplicación.

Aplicación de Android:

Requisito previo:Android Studio

Simplemente puede descargar el código directamente desde aquí.

Y cambie sus credenciales como la dirección IP de su raspberry pi según sus necesidades.

Aplicación para iOS:

Requisito previo:XCode

Simplemente puede descargar el código directamente desde aquí.

Y cambie sus credenciales como la dirección IP de su raspberry pi según sus necesidades.

Solución química utilizada

El túnel de desinfección tiene 0,4% de solución de hipoclorito de sodio en 100 litros de agua.

" />

Actualizar - Había visto muchos comentarios que decían que está utilizando productos químicos nocivos.

Entonces, solo recopilo la información del proveedor que me estaba suministrando este químico. Entonces me dijo que el químico que estoy usando en este túnel es de Raman &Weil Pvt. Ltd y tienen " Declaración "de Bode Chemie Alemania , sobre la eficacia contra COVID-19 .

Enlace oficial:http://ramanweil.com/pdf/Declaration%20from%20Bode%20Chemie%20Germany%20on%20efficacy%20against%20COVID%2019.pdf

Poniéndolo todo junto

Finalmente, llegó el momento de encender el túnel y comprobar que todas las rutinas y la aplicación funcionan según el plan.

" />

" />

Costo

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

Código

  • Túnel de código Arduino
  • main.py
  • Archivos de panel
  • Código fuente de Android Sanitation-Tunnel
  • Aplicación de Android Sanitation-Tunnel
  • Código fuente de iOS de Sanitation-Tunnel
Túnel de código Arduino C / C ++
 / * * Túnel inteligente de desinfección y saneamiento * / int relayPin =12; // elige el pin para el Pinint del relé inputPin =2; // elige el pin de entrada (para sensor PIR) int inputPin2 =3; // elija el pin de entrada (para el sensor PIR 02) int pirState =LOW; // empezamos, asumiendo que no se detecta movimientoint val =0; // variable de lectura del pin statusint val2 =0; // variable para leer el estado del pin void setup () {pinMode (relayPin, OUTPUT); // declara Relay como salida pinMode (inputPin, INPUT); // declara el sensor PIR como entrada pinMode (inputPin2, INPUT); Serial.begin (9600);} bucle vacío () {val =digitalRead (inputPin); // leer valor de entrada val2 =digitalRead (inputPin2); // lee el valor de entrada if (val ==HIGH || val2 ==HIGH) {// comprueba si la entrada es HIGH digitalWrite (relayPin, HIGH); // enciende el relé if (pirState ==LOW) {// acabamos de encender Serial.println ("¡Movimiento detectado!"); // Retardo de retardo de 15 segundos (15000); // Solo queremos imprimir en el cambio de salida, no en el estado pirState =HIGH; }} else {digitalWrite (relayPin, 0); // apaga el relé if (pirState ==HIGH) {// acabamos de apagar Serial.println ("¡Movimiento finalizado!"); // Solo queremos imprimir en el cambio de salida, no en el estado pirState =LOW; }}} 
main.py Python
 importar cv2.cv como cv de datetime import datetimeimport timeimport sysimport datetimecount =0class MotionDetector ():def onChange (self, val):#callback cuando el usuario cambia el ceil self.ceil =val def __init __ (self, ceil =8 , doRecord =True, showWindows =True):self.writer =Ninguno self.font =Ninguno self.doRecord =doRecord # Grabar o no el objeto en movimiento self.show =showWindows # Mostrar o no mostrar las 2 ventanas self.frame =Ninguno self.capture =cv.CaptureFromCAM (0) self.frame =cv.QueryFrame (self.capture) #Tome un marco para iniciar la grabadora si 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) # Mantendrá el resultado umbral 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) # Marco gris en 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 #Mantenga la marca de tiempo de la última detección si 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
 Sin vista previa (solo descarga). 
Sanitation-Tunnel Android Source CodeJava
 Sin vista previa (solo descarga). 
Sanitation-Tunnel Android AppJava
Demo App
No preview (download only).
Sanitation-Tunnel iOS Source CodeSwift
 Sin vista previa (solo descarga). 
Smart Disinfection and Sanitation Tunnel
https://github.com/yugn27/Smart-Disinfection-and-Sanitation-Tunnel

Piezas y carcasas personalizadas

smart_disinfection_and_sanitation_tunnel_prlFu8ZRXO.3mf

Esquemas

Circuit Diagram - fritzing file smart_disinfection_and_sanitation_tunnel_Zkb20Q5S2B.fzz

Proceso de manufactura

  1. Beneficios de IoT en la agricultura y la agricultura inteligente
  2. Registrador de datos de temperatura y humedad
  3. IOT - Smart Jar usando ESP8266, Arduino y sensor ultrasónico
  4. Sistema de seguridad y automatización del hogar inteligente con 1Sheeld
  5. Zapatos inteligentes (autoajuste y generación de electricidad)
  6. Feliz cumpleaños:luces y sonidos
  7. Coche robot inteligente de seguimiento facial
  8. Brazo robótico simple e inteligente con Arduino
  9. ¡Púa de velocidad de guitarra y pedal Stomp!
  10. Smart Manufacturing:qué es y sus ventajas
  11. Industria 4.0 e Hidráulica