Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Componentes e Materiais

Componente Quantidade
Arduino UNO 1
Fios Jumper (genéricos) 1
Sensor de Movimento PIR (genérico) 2
Relé de Potência 12V (4PDT) 1
Fonte Chaveada 12 Volts (SMPS) 1
Relé SPDT 2 Canais Seeed Grove 1
Fonte Chaveada 5 Volts (SMPS) 1
Chave Seletora, (On)-Off-(On) 1
Raspberry Pi 3 Model B 1
Módulo Câmera Raspberry Pi V2 1
Cartão Micro SD 1
Cabo Micro-USB para USB (Genérico) 1
Dissipador de Calor 1
Bomba d'Água 1 HP 1
Tubo de Aço Caixa 1
Tanque de Água (200 L) 1
Tubo PVC 1
Nebulizador 4 Vias (4-Way Fogger) 1
Banner Flex 1
Conexão em T (Tee Joint) 1
Micro Tubo 1
Lâmpada de Fixação na Parede 1
Cotovelo (Elbow) 1
Abraçadeira de Cabo, Dupla Face 1

Ferramentas e Máquinas Necessárias

Aplicativos e Serviços Online

Sobre o Projeto

Introdução

O Túnel Inteligente de Desinfecção e Sanitização é uma demonstração de como foi projetado para fornecer proteção máxima às pessoas que passam pelo túnel em cerca de 15 segundos. O que pode ajudar a comunidade a combater o COVID-19.

A ideia principal deste projeto é criar um túnel que possa tentar prevenir a propagação do COVID-19.

Este túnel de desinfecção e sanitização foi preparado para higienizar pessoas em 15 segundos de quaisquer bactérias possíveis.

A solução desinfetante usada consiste em uma combinação de hipoclorito de sódio (NaOCl) e água (H2O). O desinfetante não é volátil, permitindo atividade viricida e bactericida prolongada e higienizando as superfícies.

Então, tomei a iniciativa de fazer este Túnel Inteligente de Desinfecção e Sanitização. Este túnel foi feito em um período de 12 horas. Pode desinfetar uma pessoa completamente da cabeça aos pés em apenas 15 segundos e a solução usada é completamente inofensiva*. O custo total do túnel é aproximadamente ₹30.000 ou $400. (Custo revisado)

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Onde Usar?

Como Funciona

Uma máquina de Bomba d'Água 1HP é colocada ao lado de cada túnel, que pega a solução de 0.4% de hipoclorito de sódio em 100 Litros de água do tanque. Como a máquina é automática, ela detecta se alguém está entrando no túnel. Quando alguém entra no túnel, a Bomba d'Água é ligada por 15 segundos. Para que o usuário possa passar pelo túnel e, se não houver ninguém no túnel, a bomba será desligada para economizar água e eletricidade. O spray desinfetante nebulizado protege os cidadãos de pegar bactérias por um período de pelo menos 60 minutos (Aprox*). Pois desinfeta o ar, a pele exposta e a roupa humana.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Um tanque plástico para 200 litros de solução e uma bomba para o sistema de tubulação de alta pressão está localizado ao lado do túnel. Conforme cálculo, a solução deve ser suficiente para 8-10 horas. Como tem um sensor de movimento acima da entrada para economizar antisséptico. (Pode variar de acordo com as pessoas entrando no túnel**)

Diagrama de Fluxo

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Configuração do Hardware

Montei a estrutura com perfil metálico, dobrável para que pudesse ser transportado de lugar para lugar, e quando tudo acabar, guardado para o próximo apocalipse. A cobertura é pelo banner (usado para publicidade externa em outdoors). O banner é fácil de prender ao perfil metálico com abraçadeiras plásticas. É rápido e não requer habilidades especiais.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Confira o modelo - https://skfb.ly/6RGvZ

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Um tanque plástico para 200 litros de solução e uma bomba para o sistema de tubulação de alta pressão está localizado ao lado do túnel, conectado com a Montagem do Nebulizador 4 Vias.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Micro tubos foram usados em todo o túnel para fornecer a solução ao nebulizador.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Dentro, há uma tubulação de alta pressão com 4 Nebulizadores 4 Vias que podem ser conectados. A névoa não deixa marcas nas roupas, enquanto envolve completamente a pessoa que entra e destrói o vírus mesmo em dobras de difícil acesso da roupa e protege por algum tempo após a saída.

Como solução, uma solução certificada é usada neste projeto. (Certificado anexado abaixo)

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Especificações do Nebulizador 4 Vias

Outros Acessórios Usados

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Prepare o Arduino

A bomba d'água funciona detectando raios infravermelhos. Sempre que o corpo humano se aproxima de um sensor de movimento, o corpo humano reflete raios infravermelhos, o sensor de movimento detecta estes raios infravermelhos e nos dá um sinal HIGH através do pino de saída. Este sinal HIGH é então lido pelo Arduino. Então, se o Arduino lê um sinal HIGH, ele dará um sinal HIGH para o módulo relé, o que significa que o relé ligará, e como resultado o Relé de Potência ligará e ligará a Bomba d'Água por 15 segundos (Pode ser alterado). Similarmente, se o Arduino lê um sinal LOW, ele tornará o pino do relé LOW e como resultado a Bomba d'Água permanecerá desligada.

Neste projeto, usei 2 sensores PIR para torná-lo mais preciso: se qualquer um deles detectar movimento, o relé ligará por 15 segundos (Pode ser alterado).

Não podemos usar Relé 5V diretamente com a Bomba d'Água porque, no meu caso, a bomba d'água que usei neste projeto tem uma classificação de Ampere(A) de 16 Ampere e o Relé 5V tem carga máxima de 10 Ampere, então para controlar a bomba d'água usei mais um relé com o Módulo Relé 5V, que é o Relé de Potência 12V.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Código do Arduino:

/*
 * Túnel Inteligente de Desinfecção e Sanitização
 */

int relayPin = 12; // escolhe o pino para o Pino do Relé

int inputPin = 2; // escolhe o pino de entrada (para sensor PIR)
int inputPin2 = 3; // escolhe o pino de entrada (para sensor PIR 02)

int pirState = LOW; // no início, assumindo nenhum movimento detectado
int val = 0; // variável para ler o status do pino
int val2 = 0; // variável para ler o status do pino

void setup() {
  pinMode(relayPin, OUTPUT); // declara Relé como saída
  pinMode(inputPin, INPUT);  // declara sensor como entrada
  pinMode(inputPin2, INPUT); 
  Serial.begin(9600);
}

void loop(){
  val = digitalRead(inputPin);  // lê valor de entrada
  val2 = digitalRead(inputPin2); // lê valor de entrada
  if (val == HIGH || val2 == HIGH) { // verifica se a entrada é HIGH
    digitalWrite(relayPin, HIGH); // liga Relé
    if (pirState == LOW) {
      // acabou de ligar
      Serial.println("Movimento detectado!");
      // delay de 15 seg
      delay(15000);
      pirState = HIGH;
    }
  } else {
    digitalWrite(relayPin, 0); // desliga Relé
    if (pirState == HIGH){
      // acabou de desligar
      Serial.println("Movimento encerrado!");
      pirState = LOW;
    }
  }
}

A fiação final do projeto parece um pouco bagunçada, mas funcionou perfeitamente.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Depois que tudo foi conectado, apenas testei com detecção básica e depois verifiquei se o relé estava disparando.

Prepare o Raspberry Pi 3 (Opcional)

Esta parte é opcional. Caso você precise fazer alguma análise dos dados e contar precisamente o número de pessoas usando este túnel. Você pode implementar esta parte.

Embora existam muitas maneiras de contar isso com sensores físicos como Sensor PIR e Sensor Ultrassônico, achei esta mais precisa ao considerar todos os cenários.

Existe um modelo de machine learning que detecta o corpo humano usando OpenCV em Python e armazena o log no arquivo que pode ser processado para mostrar os dados no app.

Conecte a Câmera Pi

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Ative a Câmera Pi

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Teste a Câmera Pi

Em seguida, verifique se a Câmera Pi está instalada corretamente iniciando a sobreposição de visualização da câmera. A sobreposição será renderizada na tela.

raspistill -v -o test.jpg

Se você instalou a Câmera Pi corretamente, deve ver imagens da câmera renderizadas na sua tela.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Instalando OpenCV

Siga este link para instalar OpenCV:

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

Código Python (main.py)

import cv2.cv as cv
from datetime import datetime
import time
import sys
import datetime
count=0

class MotionDetector():
  def onChange(self, val): #callback quando o usuário muda o teto
    self.ceil = val

  def __init__(self,ceil=8, doRecord=True, showWindows=True):
    self.writer = None
    self.font = None
    self.doRecord=doRecord #Gravar ou não o objeto em movimento
    self.show = showWindows #Mostrar ou não as 2 janelas
    self.frame = None
    self.capture=cv.CaptureFromCAM(0)
    self.frame = cv.QueryFrame(self.capture) #Pega um frame para iniciar gravador
    if doRecord:
      self.initRecorder()
    self.frame1gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) #Frame cinza em t-1
    cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY)
    #Guardará o resultado thresholded
    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) #Frame cinza em 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 #Guarda timestamp da última detecção
    if showWindows:
      cv.NamedWindow("Image")
      #cv.CreateTrackbar("Mytrack", "Image", self.ceil, 100, self.onChange)

  def initRecorder(self): #Cria o gravador
    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 definido em 15 porque parece ser o fps da minha cam mas deve ser ajustado às suas necessidades
    self.font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) #Cria uma fonte

  def run(self):
    global count
    started = time.time()
    while True:
      curframe = cv.QueryFrame(self.capture)
      instant = time.time() #Pega timestamp do frame
      self.processImage(curframe) #Processa a imagem
      if not self.isRecording:
        if self.somethingHasMoved():
          self.trigger_time = instant #Atualiza trigger_time
          if instant > started +5:#Espera 5 segundos após início da webcam para ajuste de luminosidade etc..
            print "Humano Detectado"
            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()
            #log de timestamp
            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: #define isRecording=True apenas se gravarmos vídeo
              self.isRecording = True
      else:
        if instant >= self.trigger_time +10: #Grava durante 10 segundos
          print "Parar gravação"
          self.isRecording = False
        else:
          cv.PutText(curframe,datetime.now().strftime("%b %d, %H:%M:%S"), (25,30),self.font, 0) #Coloca data no frame
          cv.WriteFrame(self.writer, curframe) #Escreve o 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 == 1048603: #Break se usuário pressionar 'Esc'.
        break

  def processImage(self, frame):
    cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY)
    #Absdiff para obter a diferença entre os frames
    cv.AbsDiff(self.frame1gray, self.frame2gray, self.res)
    #Remove ruído e faz 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 #Guardará o número de pixels pretos
    for y in range(self.height): #Itera toda a imagem
      for x in range(self.width):
        if self.res[y,x] == 0.0: #Se o pixel é preto, mantém
          nb += 1
    avg = (nb*100.0)/self.nb_pixels #Calcula a média de pixels pretos na imagem
    #print "Average: ",avg, "%\r",
    if avg > self.ceil:#Se acima do teto, dispara alarme
      return True
    else:
      return False

if __name__=="__main__":
  detect = MotionDetector(doRecord=False)
  detect.run()

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

Uma vez feito, simplesmente salve o arquivo digitando "CTRL+X", depois Y, e depois ENTER. O script pode ser executado digitando o seguinte comando:

python main.py

Você deve ser capaz de ver uma imagem na tela e por favor veja o vídeo para verificar, se necessário, e há a contagem de humanos pelo programa no terminal.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Criei apenas um gabinete com chapa MDF para o Arduino e Raspberry Pi 3

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Criando um Dashboard para App Desktop

Passo 1: Instalar Apache

Instale o pacote apache2 com este comando:

sudo apt install apache2 -y

Passo 2: Instalar PHP

Para permitir que seu servidor Apache processe arquivos PHP, você precisará instalar a versão mais recente do PHP e o módulo PHP para Apache. Digite o seguinte comando para instalar estes:

sudo apt install php libapache2-mod-php -y

Agora baixe o Dashboard.zip:

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

e instale unzip:

sudo apt-get install unzip

extraia os arquivos de um arquivo ZIP:

unzip Dashboard.zip

Agora salve e atualize seu navegador. Você deve ver

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Configurando um Raspberry Pi como Ponto de Acesso Sem Fio

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

Nota: Nomeie o Ponto de Acesso Sem Fio 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
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Agora Vamos Começar a Construir o App

App Android:

Pré-requisito: Android Studio

Você pode simplesmente baixar o código diretamente daqui.

E altere suas credenciais como Endereço IP do seu Raspberry Pi de acordo com suas necessidades.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

App iOS:

Pré-requisito: XCode

Você pode simplesmente baixar o código diretamente daqui.

E altere suas credenciais como Endereço IP do seu Raspberry Pi de acordo com suas necessidades.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Solução Química Usada

O túnel de desinfecção tem 0.4% de solução de hipoclorito de sódio em 100 litros de água.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Atualização - Vi muitos comentários dizendo que você está usando produtos químicos nocivos.

Então, coletei informações do fornecedor que me fornecia este químico. Ele me disse que o químico que estou usando neste túnel é da Raman & Weil Pvt. Ltd e eles têm "Declaração" da Bode Chemie Germany, sobre eficácia contra COVID-19.

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

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Juntando Tudo

Finalmente, era hora de ligar o Túnel e verificar se todas as rotinas e apps estão funcionando conforme o planejado.

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego
Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Custo

Túnel de Desinfecção Inteligente: Sanitização Automatizada para Áreas de Alto Tráfego

Link - Planilha de custos no Google Sheets

Código

Código Arduino Túnel C/C++
/* 
 * Túnel Inteligente de Desinfecção e Sanitização 
 */
int relayPin = 12; // escolhe o pino para o Pino do Relé
int inputPin = 2; // escolhe o pino de entrada (para sensor PIR)
int inputPin2 = 3; // escolhe o pino de entrada (para sensor PIR 02)
int pirState = LOW; // começamos, assumindo nenhum movimento detectado
int val = 0; // variável para ler o status do pino
int val2 = 0; // variável para ler o status do pino

void setup() {
  pinMode(relayPin, OUTPUT); // declara Relé como saída
  pinMode(inputPin, INPUT);  // declara sensor PIR como entrada
  pinMode(inputPin2, INPUT);
  Serial.begin(9600);
}

void loop(){
  val = digitalRead(inputPin);  // lê valor de entrada
  val2 = digitalRead(inputPin2); // lê valor de entrada
  if (val == HIGH || val2 == HIGH) { // verifica se a entrada é HIGH
    digitalWrite(relayPin, HIGH); // liga Relé
    if (pirState == LOW) {
      // acabamos de ligar
      Serial.println("Movimento detectado!");
      // delay de 15 seg
      delay(15000); // Só queremos imprimir na mudança de saída, não no estado
      pirState = HIGH;
    }
  } else {
    digitalWrite(relayPin, 0); // desliga Relé
    if (pirState == HIGH){
      // acabamos de desligar
      Serial.println("Movimento encerrado!");
      // Só queremos imprimir na mudança de saída, não no estado
      pirState = LOW;
    }
  }
}
main.py Python
import cv2.cv as cv
from datetime import datetime
import time
import sys
import datetime
count=0

class MotionDetector():
  def onChange(self, val): #callback quando o usuário muda o teto
    self.ceil = val

  def __init__(self,ceil=8, doRecord=True, showWindows=True):
    self.writer = None
    self.font = None
    self.doRecord=doRecord #Gravar ou não o objeto em movimento
    self.show = showWindows #Mostrar ou não as 2 janelas
    self.frame = None
    self.capture=cv.CaptureFromCAM(0)
    self.frame = cv.QueryFrame(self.capture) #Pega um frame para iniciar gravador
    if doRecord:
      self.initRecorder()
    self.frame1gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) #Frame cinza em t-1
    cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY)
    #Guardará o resultado thresholded
    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) #Frame cinza em 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 #Guarda timestamp da última detecção
    if showWindows:
      cv.NamedWindow("Image")
      #cv.CreateTrackbar("Mytrack", "Image", self.ceil, 100, self.onChange)

  def initRecorder(self): #Cria o gravador
    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 definido em 15 porque parece ser o fps da minha cam mas deve ser ajustado às suas necessidades
    self.font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) #Cria uma fonte

  def run(self):
    global count
    started = time.time()
    while True:
      curframe = cv.QueryFrame(self.capture)
      instant = time.time() #Pega timestamp do frame
      self.processImage(curframe) #Processa a imagem
      if not self.isRecording:
        if self.somethingHasMoved():
          self.trigger_time = instant #Atualiza trigger_time
          if instant > started +5:#Espera 5 segundos após início da webcam para ajuste de luminosidade etc..
            print "Humano Detectado"
            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()
            #log de timestamp
            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: #define isRecording=True apenas se gravarmos vídeo
              self.isRecording = True
      else:
        if instant >= self.trigger_time +10: #Grava durante 10 segundos
          print "Parar gravação"
          self.isRecording = False
        else:
          cv.PutText(curframe,datetime.now().strftime("%b %d, %H:%M:%S"), (25,30),self.font, 0) #Coloca data no frame
          cv.WriteFrame(self.writer, curframe) #Escreve o 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 == 1048603: #Break se usuário pressionar 'Esc'.
        break

  def processImage(self, frame):
    cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY)
    #Absdiff para obter a diferença entre os frames
    cv.AbsDiff(self.frame1gray, self.frame2gray, self.res)
    #Remove ruído e faz 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 #Guardará o número de pixels pretos
    for y in range(self.height): #Itera toda a imagem
      for x in range(self.width):
        if self.res[y,x] == 0.0: #Se o pixel é preto, mantém
          nb += 1
    avg = (nb*100.0)/self.nb_pixels #Calcula a média de pixels pretos na imagem
    #print "Average: ",avg, "%\r",
    if avg > self.ceil:#Se acima do teto, dispara alarme
      return True
    else:
      return False

if __name__=="__main__":
  detect = MotionDetector(doRecord=False)
  detect.run()
Arquivos do Dashboard PHP

Sem preview (apenas download).

Código Fonte Android Sanitation-Tunnel Java

Sem preview (apenas download).

App Android Sanitation-Tunnel Java

App Demo

Sem preview (apenas download).

Código Fonte iOS Sanitation-Tunnel Swift

Sem preview (apenas download).

Túnel Inteligente de Desinfecção e Sanitização

https://github.com/yugn27/Smart-Disinfection-and-Sanitation-Tunnel

Peças Personalizadas e Caixas

smart_disinfection_and_sanitation_tunnel_prlFu8ZRXO.3mf

Esquemáticos

Diagrama de Circuito - arquivo fritzing

smart_disinfection_and_sanitation_tunnel_Zkb20Q5S2B.fzz

Processo de manufatura

  1. Como IoT Revoluciona a Agricultura: Benefícios-Chave e Insights de Agricultura Inteligente
  2. Registrador de Temperatura e Umidade com Arduino, DHT11 e Ethernet Shield
  3. Construa um Pote Inteligente IoT com ESP8266, Arduino e Sensor Ultrassônico – Monitoramento em Tempo Real
  4. Automação Residencial Inteligente e Sistema de Segurança com 1Sheeld
  5. Tênis Inteligentes com Auto-Ajuste e Colheita de Energia Integrada
  6. Celebre com Luz e Som: Projeto Arduino DIY de Aniversário
  7. Carro Robô Autônomo de Rastreamento Facial com Arduino Nano e OpenCV
  8. Palheta Motorizada e Pedal Stomp para Guitarra – DIY com Impressão 3D e Arduino
  9. Fabrico Inteligente: Definição, Benefícios e Implementação
  10. Revolucionando a Hidráulica: Como a Indústria 4.0 Impulsiona a Manufatura Inteligente