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

Octopod:Smart IoT Home / Industry Automation Project

Componentes e suprimentos

Arduino UNO
× 1
Arduino MKR WiFi 1010
Este ou qualquer outro Wifi ESP8266 / ESP32 não estava disponível no meu país, então optei pelo NodeMCU ESP8266
× 1
Maxim Integrated MAX32630FTHR
Você pode escolher entre MAX32620FTHR, Arduino 1010 ou qualquer placa ESP8266. com esta placa, você precisará de WiFi externo Módulo ou um chip Esp8266 para Interent
× 1
Raspberry Pi Zero Wireless
Você também pode usar Raspi 2/3 normal!
× 1
Sensor DHT11 de Temperatura e Umidade (4 pinos)
× 1
Seeed Grove - Sensor de gás (MQ2)
× 1
Sensor de umidade do solo SparkFun (com terminais de parafuso)
× 1
Sensor de movimento PIR (genérico)
Opcional
× 1
Leitor RFID (genérico)
× 1
Relé (genérico)
2 canais de preferência
× 1
Cátodo comum difuso RGB
× 1
Módulo de câmera Raspberry Pi
× 1
Servos (Tower Pro MG996R)
× 1
Buzzer
× 2
Módulo Bluetooth HC-05
Opcional
× 1
LED (genérico)
× 4
Adaptador de parede / Power Bank
× 2
Cartão de memória
mais de 4 Gb e de preferência Classe 10 (obrigatório para Raspberry Pi OS)
× 1

Ferramentas e máquinas necessárias

Pistola de cola quente (genérica)
Impressora 3D (genérica)
Opcional
Ferramentas manuais
Alicate de ponta fina, tesoura, cortador, etc.

Aplicativos e serviços online

Blynk
OpenCV

Sobre este projeto




Existem muitos projetos de automação de IoT por aí, mas acredite em mim, não há nada parecido com isso! Octopod é feito usando NodeMCU (MAX32620FTHR ou Arduino MKR 1010), Arduino Uno, e Raspberry Pi 3 . O Octopod permite que você torne sua casa mais inteligente. Octopod envia a você uma variedade de dados, como temperatura , umidade, e qualidade do gás dentro de sua casa / escritório / indústria. Octopod envia a você notificação sempre que detectar qualquer tipo de movimento dentro e avisa quando você precisa regar suas plantas . Você também pode controlar seus aparelhos através de um Blynk aplicativo em seu smartphone. O Octopod permite até mesmo a verdadeira iluminação ambiente!

Octopod está equipado com uma pequenina câmera , que envia a você feed ao vivo . Esta câmera também usa inteligência artificial para detectar humanos à sua vista e enviar a você as fotos deles . Além disso, possui um RFID trava de porta sistema ! Incrível, certo?






Como tudo funciona?


O NodeMCU é conectado a vários sensores, um módulo de relé e LEDs RGB. Ele é conectado ao aplicativo Blynk em um smartphone via WiFi, que envia todos os dados e permite que você controle sua casa.

O Raspberry Pi também está conectado ao Wi-Fi, o que permite que você veja o feed ao vivo por meio da câmera Pi. Também instalamos bibliotecas OpenCV no Pi e configuramos o Pi para detectar qualquer ser humano à sua vista e enviar a você por e-mail suas imagens.

A unidade de porta inteligente usa um módulo RFID. Quando o RFID permitido é colocado dentro de seu alcance, ele abre automaticamente a porta.





PASSO 1:codificando o Octopod principal


Eu adicionei comentários em quase todas as linhas, para que você não apenas copie, mas também entenda. Aqui, direi o que realmente acontece quando o código é executado em poucas palavras!
  • Incluindo as bibliotecas:

Este código usa 2 bibliotecas principais, a Biblioteca Blynk para tornar o código compatível com o Aplicativo Blynk e a outra biblioteca é a Biblioteca de Temperatura DHT11, que converte os dados brutos do sensor em Temperatura e Umidade. Para baixar essas bibliotecas, basta acessar os links fornecidos no código e baixá-los. Em seguida, vá para Arduino IDE Sketch → Incluir biblioteca → Adicionar biblioteca .zip e selecione suas bibliotecas baixadas.
  #include  // Incluir Biblioteca Blynk # include  // Incluir Biblioteca Blynk # include  // Incluir biblioteca do sensor DHT # define BLYNK_PRINT Serial  

Este é um código Blynk que ajuda você a conectar seu nodemcu à Internet e, em seguida, autenticá-lo em seu aplicativo.
  // Você deve obter o Auth Token no Blynk App.// Vá para as configurações do projeto (ícone de noz) .char auth [] ="Your Auth Key"; // Your WiFi credentials.// Set senha para "" for open networks.char ssid [] ="Your WiFi SSID"; char pass [] ="Your WiFi Pass";  
  • Definição de pinos e inteiros:

Neste segmento, definimos os pinos de nossos vários sensores. Você pode alterá-los de acordo com sua convicção. Também definimos alguns inteiros que tendemos a usar durante o curso de nosso código.
  #define DHTPIN 2 // Qual pino digital de temperatura e sensor de umidade está conectado # define soloPin 4 // Qual pino digital de sensor de umidade do solo está conectado # define gasPin A0 // Qual pino analógico de sensor de gás está conectado to # define pirPin 12 // Qual pino digital do sensor de umidade do solo está conectado ao int pirValue; // Lugar para armazenar read PIR Valueint soloValue; // Lugar para armazenar leia Soil Moisture Valueint PIRpinValue; // Local para armazenar o valor enviado pelo Blynk App Pin V0int SOILpinValue; // Local para armazenar o valor enviado pelo Blynk App Pin V1  
  • BLYNK_WRITE ():

Com este código, informamos ao aplicativo Blynk que ele pode usar o Pin V0 e o Pin V1 para informar o código se o teste de detecção de movimento e umidade do solo estão LIGADOS.
  BLYNK_WRITE (V0) // O pino VO do aplicativo Blynk informa se a detecção de movimento está ATIVADA {PIRpinValue =param.asInt (); } BLYNK_WRITE (V1) // pino V1 do aplicativo Blynk informa se a umidade do solo está ATIVADA {SOILpinValue =param.asInt (); }  
  • void sendSensor ():

Este código pega os dados do DHT11 para torná-lo utilizável e, em seguida, os envia para os pinos V5 e V6, respectivamente.
  void sendSensor () {int h =dht.readHumidity (); int t =dht.readTemperature (); // ou dht.readTemperature (true) para Fahrenheit if (isnan (h) || isnan (t)) {Serial.println ("Falha ao ler do sensor DHT!"); // para verificar se o sensor não está enviando nenhum valor falso return; } // Você pode enviar qualquer valor a qualquer momento. // Por favor, não envie mais de 10 valores por segundo. Blynk.virtualWrite (V5, h); // envia umidade para o pino V5 Blynk.virtualWrite (V6, t); // envia temperatura para o pino V7}  
  • void getPirValue () &void getSoilValue ():

Lê o valor digital dos sensores e executa uma condição if-else para verificar o estado do sensor. Se o sensor estiver no estado necessário, ele enviará uma notificação do aplicativo Blynk.
  void getPirValue (void) {pirValue =digitalRead (pirPin); if (pirValue) // pino digital de PIR fornece alto valor na detecção humana {Serial.println ("Movimento detectado"); Blynk.notify ("Movimento detectado"); }} void getSoilValue (void) {soloValue =digitalRead (soloPin); if (soloValue ==HIGH) // pino digital do sensor de solo fornece valor baixo quando a umidade é menor {Serial.println ("Plantas aquáticas"); Blynk.notify ("Plantas aquáticas"); }}  
  • configuração vazia ():

Na configuração, fazemos algumas coisas que devem ser feitas apenas uma vez. Como:iniciando a comunicação serial em uma taxa de transmissão fixa, autorize este código para o aplicativo Blynk, iniciando as leituras do sensor Dht, depois tweetando para o seu Twitter que seu projeto de casa inteligente está online e, em seguida, informando ao nó que o pino Pir e o sensor de solo Pin destina-se a receber apenas entrada.
  void setup () {// Console de depuração Serial.begin (9600); Blynk.begin (auth, ssid, pass); // Você também pode especificar server://Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442); //Blynk.begin(auth, ssid, pass, IPAddress (192,168,1,100), 8442); dht.begin (); // Começa a leitura do DHT Blynk.tweet ("OCTOPOD IS ONLINE!"); // Tweating em seu Twitter Handle que você projeta está online pinMode (pirPin, INPUT); // Definir que Pir Pin deve receber apenas Input pinMode (soloPin, INPUT); // Definir que o pino do sensor de solo deve receber apenas entrada // Configurar uma função a ser chamada a cada segundo timer.setInterval (1000L, sendSensor);}  
  • void loop ():

No loop, escrevemos coisas que devem ser feitas indefinidamente. Aqui, garantimos que o código que escrevemos antes da instalação seja executado. Em seguida, escrevemos 2 instruções If-Else que verificam os estados do pino V0 e do pino V1 e, a seguir, obtemos os valores dos sensores de acordo.
  void loop () {Blynk.run (); timer.run (); if (PIRpinValue ==HIGH) // O pino VO do aplicativo Blynk informa se a detecção de movimento está ATIVADA {getPirValue (); } if (SOILpinValue ==HIGH) // pino V1 do aplicativo Blynk informa se a umidade do solo está ATIVADA {getSoilValue (); }}  





ETAPA 2:codificando o RFID Smart Lock


Para ser honesto, este é um Código simples e fácil e não precisa de muitas explicações. Mas, ainda vou dizer em poucas palavras o que isso faz. Existem duas versões do código, uma é se você deseja conectar a caixa da unidade da porta ao Bluetooth para que ele avise quando a porta está aberta através do terminal serial. Outro envia para serial para que possa ser visualizado se você conectar seu Arduino ao computador. Eu prefiro simples, sem versão Bluetooth. Aqui vamos nos!
  • Vá para Sketch → Incluir biblioteca → Gerenciar biblioteca → Digite na barra de pesquisa MFRC522 e instale a biblioteca. Em seguida, vá em Arquivo → Exemplos → Bibliotecas personalizadas → MFRC522 → dumpInfo Sketch. No início você pode ler como conectar os pinos (Ou consulte a imagem). Em seguida, execute o código e abra o monitor serial e coloque seu cartão RFID na frente do Módulo MFRC522 e aguarde 5 segundos. Em seguida, observe o UID do cartão de maneira semelhante, observe os UIDs de seus outros cartões e chaveiros.
  • Em seguida, baixe o código de sua preferência. Abra o código e vá para esta linha. Aqui, no lugar desses Xs, adicione o UID do cartão que deseja usar para abrir a porta. Agora que você está pronto, basta fazer upload do código.
  if (content.substring (1) =="XX XX XX XX") {}  

Neste código, há duas coisas principais que fazemos, isto é, na parte If-Else do código. Em se dissermos ao arduino que se o UID da placa coincidir com o UID mencionado, faça o Servo se mover (para que a porta se abra) e pisque alguns Led's e faça alguns sons usando a campainha. Caso contrário, se os UIDs não fizerem piscar alguns LEDs e fizerem alguns sons usando o Buzzer.





ETAPA 3:Configuração de detecção humana de Raspberry Pi


Nesta etapa guiada, aprenderemos como fazer uma câmera Smart Security. A câmera enviará um e-mail sempre que detectar o objeto e se você estiver na mesma rede WiFi, poderá acessar a filmagem ao vivo pela câmera digitando o endereço IP do seu Raspberry Pi. Vou mostrar como criar a câmera inteligente do zero. Vamos lá!

Requisitos:

1. OpenCV (Open Source Computer Vision Library)

2. Raspberry Pi 3B

3. Câmera Raspberry Pi V2

Premissas:

1. Raspberry Pi 3 com Raspbian Stretch instalado. Se você ainda não tem o Raspbian Stretch OS, você precisará atualizar seu sistema operacional para aproveitar as vantagens dos novos recursos do Raspbian Stretch.

Para atualizar seu Raspberry Pi 3 para Raspbian Stretch, você pode baixá-lo aqui e seguir estas instruções de atualização (ou estas para a rota NOOBS que é recomendada para iniciantes).

Observação:se você estiver atualizando seu Raspberry Pi 3 de Raspbian Jessie para Raspbian Stretch, há potencial para problemas. Continue por sua própria conta e risco e consulte os fóruns do Raspberry Pi para obter ajuda. Importante:é minha recomendação que você prossiga com uma nova instalação do Raspbian Stretch! Atualizar de Raspbian Jessie não é recomendado.

2. Acesso físico ao Raspberry Pi 3 para que você possa abrir um terminal e executar comandos Acesso remoto via SSH ou VNC. Farei a maior parte deste tutorial via SSH, mas contanto que você tenha acesso a um terminal, pode acompanhar facilmente.
  • Etapa 1:ANEXAR A CÂMERA AO RASPBERRY PI 3

1. Abra o módulo da câmera Raspberry Pi. Esteja ciente de que a câmera pode ser danificada por eletricidade estática. Antes de remover a câmera de sua bolsa antiestática cinza, certifique-se de ter descarregado tocando em um objeto aterrado (por exemplo, um radiador ou chassi de PC).

2. Instale o módulo da câmera Raspberry Pi inserindo o cabo no Raspberry Pi. O cabo se encaixa no conector situado entre as portas Ethernet e HDMI, com os conectores prateados voltados para a porta HDMI.

3. Inicialize seu Raspberry Pi.

4. No prompt, execute "sudo raspi-config". Se a opção "câmera" não estiver listada, você precisará executar alguns comandos para atualizar o Raspberry Pi. Execute "sudo apt-get update" e "sudo apt-get upgrade"

5. Execute "sudo raspi-config" novamente - agora você deve ver a opção "câmera".

COMANDO-
  $ sudo raspi-config  

6. Navegue até a opção "câmera" e ative-a (observe a opção de interface). Selecione “Concluir” e reinicie o Raspberry Pi ou apenas digite o seguinte:
  $ sudo reboot  
  • Etapa 2:ABRIR A INSTALAÇÃO DO CV

Se esta é a primeira vez que você instala o OpenCV ou está apenas começando a usar o Rasbian Stretch. Este é o tutorial perfeito para você.

Etapa 1:expandir o sistema de arquivos

Você está usando uma nova instalação do Raspbian Stretch? Nesse caso, a primeira coisa que você deve fazer é expandir seu sistema de arquivos para incluir todo o espaço disponível em seu cartão micro-SD:

COMANDO-
  $ sudo raspi-config  

em seguida, selecione o item de menu “Opções avançadas” e, em seguida, selecione “Expandir sistema de arquivos”. Quando solicitado, você deve selecionar a primeira opção, “A1. Expanda o sistema de arquivos ”, pressione Enter no teclado, vá até o botão“ ”com a seta e reinicie o Pi. Se você estiver usando um cartão de 8 GB, pode estar usando cerca de 50% do espaço disponível, então uma coisa simples a fazer é excluir o LibreOffice e o mecanismo Wolfram para liberar algum espaço em seu PI:

COMANDO-
  $ sudo apt-get purge wolfram-engine $ sudo apt-get purge libreoffice * $ sudo apt-get clean $ sudo apt-get autoremove  

Depois de remover o Wolfram Engine e o LibreOffice, você pode recuperar quase 1 GB!

Etapa 2: Instalar dependências

Esta não é a primeira vez que discuto como instalar o OpenCV no Raspberry Pi, então vou manter essas instruções no lado mais breve, permitindo que você trabalhe no processo de instalação:Eu também incluí a quantidade de tempo leva para executar cada comando (alguns dependem da velocidade da sua Internet) para que você possa planejar a instalação do OpenCV + Raspberry Pi 3 de acordo (o próprio OpenCV leva aproximadamente 4 horas para compilar - mais sobre isso mais tarde). A primeira etapa é atualizar e atualizar quaisquer pacotes existentes:

COMANDO-
  $ sudo apt-get update &&sudo apt-get upgrade  

Em seguida, precisamos instalar algumas ferramentas de desenvolvedor, incluindo CMake, que nos ajuda a configurar o processo de construção do OpenCV:Raspbian Stretch:Instale OpenCV 3 + Python em seu Raspberry Pi

COMANDO-
  $ sudo apt-get install build-essential cmake pkg-config  

Em seguida, precisamos instalar alguns pacotes de E / S de imagem que nos permitem carregar vários formatos de arquivo de imagem do disco. Exemplos de tais formatos de arquivo incluem JPEG, PNG, TIFF, etc .:Raspbian Stretch

COMANDO-
  $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev  

Assim como precisamos de pacotes de E / S de imagem, também precisamos de pacotes de E / S de vídeo. Essas bibliotecas nos permitem ler vários formatos de arquivo de vídeo do disco, bem como trabalhar diretamente com streams de vídeo

COMANDO-
  $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev  

A biblioteca OpenCV vem com um submódulo chamado highgui que é usado para exibir imagens em nossa tela e construir GUIs básicas. Para compilar o módulo highgui, precisamos instalar a biblioteca de desenvolvimento GTK:Raspbian Stretch:Instale OpenCV 3 + Python em seu Raspberry Pi

COMANDO-
  $ sudo apt-get install libgtk2.0-dev libgtk-3-dev  

Muitas operações dentro do OpenCV (nomeadamente operações de matriz) podem ser otimizadas ainda mais com a instalação de algumas dependências extras:

COMANDO-
  $ sudo apt-get install libatlas-base-dev gfortran  

Essas bibliotecas de otimização são especialmente importantes para dispositivos com recursos limitados, como o Raspberry Pi. Por último, vamos instalar os arquivos de cabeçalho Python 2.7 e Python 3 para que possamos compilar OpenCV com ligações Python:Raspbian Stretch

COMANDO-
  $ sudo apt-get install python2.7-dev python3-dev  

Se você estiver trabalhando com uma nova instalação do sistema operacional, é possível que essas versões do Python já estejam na versão mais recente (você verá uma mensagem de terminal informando isso). Se você pular esta etapa, poderá notar um erro relacionado ao arquivo de cabeçalho Python.h não ser encontrado ao executar make para compilar o OpenCV. Etapa 3:Baixe o código-fonte OpenCV

Etapa 3:Baixe o OpenCV código-fonte

Agora que temos nossas dependências instaladas, vamos pegar o arquivo 3.3.0 do OpenCV do repositório oficial do OpenCV. Esta versão inclui o módulo dnn que discutimos em um post anterior, onde fizemos Deep Learning com OpenCV (Observação:como versões futuras do openCV são lançadas, você pode substituir 3.3.0 pelo número da versão mais recente):

COMANDO-
  $ cd ~ $ wget -O opencv.zip   https://github.com/Itseez/opencv/archive/3.3.0.zi ...>> p $ unzip opencv.zip 

Queremos a instalação completa do OpenCV 3 (para ter acesso a recursos como SIFT e SURF, por exemplo), então também precisamos pegar o repositório opencv_contrib também:Raspbian Stretch:Instale OpenCV 3 + Python em seu Raspberry Pi

COMANDO-
  $ wget -O opencv_contrib.zip   https://github.com/Itseez/opencv_contrib/archive/...>>3.3.0$ descompacte opencv_contrib.zip  

Pode ser necessário expandir o comando acima usando o botão “<=>” durante a cópia e colagem. O .zip no 3.3.0.zip pode parecer cortado em alguns navegadores. O URL completo do arquivo OpenCV 3.3.0 é:https://github.com/Itseez/opencv_contrib/archive / ... Observação:certifique-se de que suas versões opencv e opencv_contrib são as mesmas (neste caso, 3.3.0) . Se os números das versões não corresponderem, você provavelmente terá erros de tempo de compilação ou de execução. Etapa 4:Python 2.7 ou Python 3? Antes de começarmos a compilar o OpenCV em nosso Raspberry Pi 3, primeiro precisamos instalar o pip, um gerenciador de pacotes Python

COMANDO-
  $ wget    https://bootstrap.pypa.io/get-pip.py> 
>> 
> $ sudo python get-pip.py $ sudo python3 get-pip.py  

Você pode receber uma mensagem informando que o pip já está atualizado ao emitir esses comandos, mas é melhor não pular esta etapa. Se você é um leitor de PyImageSearch de longa data, então você sabe que sou um grande fã de virtualenv e virtualenvwrapper.

Instalar esses pacotes não é um requisito e você pode absolutamente ter o OpenCV instalado sem eles, mas, dito isso, eu recomendo fortemente que você os instale como outros tutoriais PyImageSearch existentes (bem como tutoriais futuros) também aproveitam ambientes virtuais Python.

Também presumirei que você instalou o virtualenv e o virtualenvwrapper no restante deste guia. Então, considerando isso, qual é o ponto de usar o virtualenv e o virtualenvwrapper? Primeiro, é importante entender que um ambiente virtual é uma ferramenta especial usada para manter as dependências exigidas por diferentes projetos em lugares separados, criando ambientes Python isolados e independentes para cada um deles. Resumindo, ele resolve o dilema “O Projeto X depende da versão 1.x, mas o Projeto Y precisa de 4.x”.

Ele também mantém seus pacotes globais de sites organizados, organizados e livres de desordem. Se você quiser uma explicação completa sobre por que os ambientes virtuais Python são boas práticas, com certeza dê uma lida nesta excelente postagem do blog sobre RealPython. É prática padrão na comunidade Python usar algum tipo de ambiente virtual, então eu recomendo fortemente que você faça o mesmo:

COMANDO-
  $ sudo pip install virtualenv virtualenvwrapper $ sudo rm -rf ~ / .cache / pip  

Agora que o virtualenv e o virtualenvwrapper foram instalados, precisamos atualizar nosso arquivo ~ / .profile. inclua as seguintes linhas na parte inferior do arquivo:Raspbian Stretch

COMANDO-
  $ nano ~ / .profile  

Copie e cole as seguintes linhas linhas na parte inferior do arquivo:

COMANDO-
   #  virtualenv e virtualenvwrapperWORKON_HOME =$ HOME / .virtualenvs source /usr/local/bin/virtualenvwrapper.sh  

OU

Você deve simplesmente usar o redirecionamento cat e output para lidar com a atualização de ~ / .profile:

COMANDO-
  $ echo -e "\ n # virtualenv and virtualenvwrapper">> ~ / .profile $ echo "exportWORKON_HOME =$ HOME / .virtualenvs">> ~ / .profile $ echo "source / usr / local / bin / virtualenvwrapper.sh ">> ~ / .profile  

Agora que temos nosso ~ / .profile atualizado, precisamos recarregá-lo para garantir que as alterações tenham efeito. Você pode forçar uma recarga de seu arquivo ~ / .profile:Efetuando logout e, em seguida, efetuando login novamente.

Fechando uma instância de terminal e abrindo uma nova

Ou meu favorito pessoal

COMANDO-
  $ source ~ / .profile  

Nota :Eu recomendo executar o arquivo fonte ~ / .profile cada vez que você abrir um novo terminal para garantir que as variáveis ​​do sistema foram configuradas corretamente. Criando seu ambiente virtual Python A seguir, vamos criar o ambiente virtual Python que usaremos para o desenvolvimento da visão computacional:

COMANDO-
  $ mkvirtualenv cv -p python2  

Este comando criará um novo ambiente virtual Python denominado cv usando Python 2.7.

Se você quiser usar o Python 3, use este comando:

COMANDO-
  $ mkvirtualenv cv -p python3 

Novamente, não posso enfatizar este ponto o suficiente:o ambiente virtual cv Python é totalmente independente e sequestrado da versão padrão do Python incluída no download do Raspbian Stretch.

Quaisquer pacotes Python no diretório global de pacotes de sites não estarão disponíveis para o ambiente virtual cv. Da mesma forma, quaisquer pacotes Python instalados em pacotes de sites do cv não estarão disponíveis para a instalação global do Python.

Lembre-se disso quando estiver trabalhando em seu ambiente virtual Python e isso ajudará a evitar muitas confusões e dores de cabeça. Como verificar se você está no ambiente virtual “cv” Se você reiniciar seu Raspberry Pi; saia e faça login novamente; ou abrir um novo terminal, você precisará usar o comando workon para acessar novamente o ambiente virtual cv.

Em postagens anteriores do blog, vi leitores usarem o comando mkvirtualenv - isso é totalmente desnecessário! O comando mkvirtualenv deve ser executado apenas uma vez:para realmente criar o ambiente virtual. Depois disso, você pode usar workon e será levado ao seu ambiente virtual:

COMANDO-
  $ source ~ / .profile $ workon cv  

Para validar e garantir que você está no ambiente virtual cv, examine sua linha de comando - se você vir o texto (cv) precedendo seu prompt, então você está no ambiente virtual cv:Certifique-se de ver o texto “(cv)” em seu prompt, indicando que você está no ambiente virtual cv.

Caso contrário, se você não vir o texto (cv), então não está no ambiente virtual cv:

Se você não vir o texto “(cv)” em seu prompt, então você não está no ambiente virtual cv e precisa executar “source” e “workon” para resolver este problema. Para corrigir isso, basta executar os comandos source e workon mencionados acima. Instalando o NumPy em seu Raspberry Pi Supondo que você tenha chegado até aqui, você agora deve estar no ambiente virtual cv (no qual você deve permanecer pelo resto deste tutorial).

Etapa 4:Instalando NumPy em seu Raspberry Pi

Nossa única dependência Python é NumPy, um pacote Python usado para processamento numérico:

COMANDO-
  $ pip install numpy  

a instalação do NumPy pode demorar um pouco.

Etapa 5:Compilar e instalar o OpenCV

COMANDO-
  $ workon cv  

Depois de garantir que está no ambiente virtual cv, podemos configurar nossa construção usando CMake:

COMANDO-
  $ cd ~ / opencv-3.3.0 / $ mkdir build $ cd build $ cmake -D CMAKE_BUILD_TYPE =RELEASE \ -D CMAKE_INSTALL_PREFIX =/ usr / local \ -D INSTALL_PYTHON_EXAMPLES =ON \ -D OPENCV_EXTRA_MODES =ON \ -D OPENCV_EXTRA_MODES =~ /opencv_contrib-3.3.0/modules \ -D BUILD_EXAMPLES =ON ..  

Agora, antes de passarmos para a etapa de compilação real, certifique-se de examinar a saída do CMake! Comece rolando para baixo na seção intitulada Python 2 e Python 3. Se você estiver compilando OpenCV 3 para Python 2.7, certifique-se de que sua seção Python 2 inclui caminhos válidos para o intérprete, bibliotecas, numpy e pacotes

Verificar se o Python 3 será usado ao compilar o OpenCV 3 para Raspbian Stretch no Raspberry Pi 3. Observe como o Interpreter aponta para nosso binário python2.7 localizado no ambiente virtual cv. A variável numpy também aponta para a instalação do NumPy no ambiente cv.

Novamente, o Interpreter aponta para nosso binário python3.5 localizado no ambiente virtual cv enquanto numpy aponta para nossa instalação NumPy.

Em ambos os casos, se você não vê o ambiente virtual cv nesses caminhos de variáveis, é quase certo porque você NÃO está no ambiente virtual cv antes de executar o CMake! Se for esse o caso, acesse o ambiente virtual cv usando workon cv e execute novamente o comando cmake descrito acima.

Configure o tamanho do espaço de troca antes de compilar Antes de iniciar o processo de compilação, você deve aumentar o tamanho do espaço de troca. Isso permite que o OpenCV compile com todos os quatro núcleos do Raspberry PI sem que a compilação seja interrompida devido a problemas de memória.

Open your /etc/dphys-swapfile and then edit the CONF_SWAPSIZE variable

COMMAND-
$ nano /etc/dphys-swapfile  

and then edit the following section of the file:#set size to absolute value, leaving empty (default) then uses computed value # you most likely don't want this, unless you have an special disk situation
# CONF_SWAPSIZE=100 CONF_SWAPSIZE =1024 

Notice that I’ve commented out the 100MB line and added a 1024MB line. This is the secret to getting compiling with multiple cores on the Raspbian Stretch. If you skip this step, OpenCV might not compile.

To activate the new swap space, restart the swap service:

COMMAND-
$ sudo /etc/init.d/dphys-swapfile stop $ sudo /etc/init.d/dphys-swapfile start  

Note:It is possible to burn out the Raspberry Pi microSD card because flash memory has a limited number of writes until the card won’t work. It is highly recommended that you change this setting back to the default when you are done compiling and testing the install (see below). To read more about swap sizes corrupting memory, see this page. Finally, we are now ready to compile OpenCV:

COMMAND-
$ make -j4 

The -j4 switch stands for the number of cores to use when compiling OpenCV. Since we are using a Raspberry Pi 2, we’ll leverage all four cores of the processor for a faster compilation.

However, if your make command errors out, I would suggest starting the compilation over again and only using one core
$ make clean$ make  

Once OpenCV 3 has finished compiling.Our OpenCV 3 compile on Raspbian Stretch has completed successfully.

From there, all you need to do is install OpenCV 3 on your Raspberry Pi 3:

COMMAND-
$ sudo make install$ sudo ldconfig  

Step #6 :Finish installing OpenCV on your Pi

We’re almost done — just a few more steps to go and you’ll be ready to use your Raspberry Pi 3 with OpenCV 3 on Raspbian Stretch.

For Python 2.7:

#5 Provided your Step without error, OpenCV should now be installed in/usr/local/lib/python2.7/site-pacakges . You can verify this using the ls command:

COMMAND-
$ ls -l /usr/local/lib/python2.7/site-packages/ total 1852 -rw-r--r-- 1 root staff 1895772 Mar 20 20:00 cv2.so  

Note:In some cases, OpenCV can be installed in /usr/local/lib/python2.7/dist-packages(note the dist-packages rather than site-packages ). If you do not find the cv2.so bindings insite-packages , we be sure to check dist-packages . Our final step is to sym-link the OpenCV bindings into our cv virtual environment for Python 2.7:

COMMAND-
$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ $ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so  

For Python 3:After running make install , your OpenCV + Python bindings should be installed in/usr/local/lib/python3.5/site-packages . Again, you can verify this with the ls command:

COMMAND-
$ ls -l /usr/local/lib/python3.5/site-packages/ total 1852 -rw-r--r-- 1 root staff 1895932 Mar 20 21:51 cv2.cpython-34m.so  

I honestly don’t know why, perhaps it’s a bug in the CMake script, but when compiling OpenCV 3 bindings for Python 3+, the output .so file is named cv2.cpython-35m-arm-linux-gnueabihf.so(or some variant of) rather than simply cv2.so (like in the Python 2.7 bindings). Again, I’m not sure exactly why this happens, but it’s an easy fix. All we need to do is rename the file:

COMMAND-
$ cd /usr/local/lib/python3.5/site-packages/ $ sudo mv cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so  

After renaming to cv2.so , we can sym-link our OpenCV bindings into the cv virtual environment

for Python 3.5:

COMMAND-
$ cd ~/.virtualenvs/cv/lib/python3.5/site-packages/ $ ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so  

Step #7:Testing your OpenCV 3 install

Congratulations, you now have OpenCV 3 installed on your Raspberry Pi 3 running Raspbian Stretch! But before we pop the champagne and get drunk on our victory, let’s first verify that your OpenCV installation is working properly.

Open up a new terminal, execute the source and workon commands, and then finally attempt to import the Python + OpenCV bindings:

COMMAND-
$ source ~/.profile$ workon cv $ python>>> import cv2>>> cv2.__version__ '3.3.0'>>>  

OpenCV 3 has been successfully installed on my Raspberry Pi 3 + Python 3.5 environment . Once OpenCV has been installed, you can remove both the opencv-3.3.0 and opencv_contrib-3.3.0 directories to free up a bunch of space on your disk:

COMMAND-
$ rm -rf opencv-3.3.0 opencv_contrib-3.3.0  

However, be cautious with this command! Make sure OpenCV has been properly installed on your system before blowing away these directories. A mistake here could cost you hours in compile time.

Open your /etc/dphys-swapfile and then edit the CONF_SWAPSIZE variable COMMAND-
# set size to absolute value, leaving empty (default) then uses computed value# you most likely don't want this, unless you have an special disk situation CONF_SWAPSIZE=100 #CONF_SWAPSIZE=1024 

Notice that I’ve commented out the 1024MB line and uncommented the 100MB line. As stated above, larger swap spaces may lead to memory corruption, so I recommend setting it back to 100MB. If you skip this step, your memory card won’t last as long. To revert to the smaller swap space, restart the swap service

COMMAND-
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
  • STEP 4:Setting Up Python Program

You can verify that the camera works by running.

COMMAND-
$ raspistill -o image.jpg 

which will save a image from the camera in your current directory.

After you checked the camera is working. Now download all the python files and models from below link :

LINK:

https://drive.google.com/file/d/0B98uoD6BbkpqZU9FT...

You can open up the file inspector and view the image.

Make sure you are using the virtual environment by typing the following commands:

COMMANDS-
$ source ~/.profile $ workon cv  

Next, navigate to the repository directory,

COMMANDS-
$ cd Smart-Security-Camera  

and install the dependencies for the project

COMMANDS-
$ pip install -r requirements.txt  

To get emails when objects are detected, you'll need to make a couple modifications to the mail.py file. Open mail.py with vim vim mail.py , then press i to edit. Scroll down to the following section
# Email you want to send the update from (only works with gmail)fromEmail ='[email protected]' fromEmailPassword ='password1234' # Email you want to send the update to toEmail ='[email protected]'  

and replace with your own email/credentials.

The mail.py file logs into a gmail SMTP server and sends an email with an image of the object detected by the security camera. Press esc then ZZ to save and exit.

You can also modify the main.py file to change some other properties.
email_update_interval =600 # sends an email only once in this time intervalvideo_camera =VideoCamera(flip=True) # creates a camera object, flip verticallyobject_classifier =cv2.CascadeClassifier("models/fullbody_recognition_model.xml") # an opencv classifier facial_recognition_model.xml fullbody_recognition_model.xml upperbody_recognition_model.xml 

Run the program python main.py

You can view a live stream by visiting the IP address of your pi in a browser on the same network. You can find the IP address of your Raspberry Pi by typing ifconfig in the terminal and looking for the inet address. Visit :5000 in your browser to view the stream.

Observação:

To view the live stream on a different network than your Raspberry Pi, you can use ngrok to expose a local tunnel. Once downloaded, run ngrok with ./ngrok http 5000 and visit one of the generated links in your browser. Note:The video stream will not start automatically on startup. To start the video stream automatically, you will need to run the program from your /etc/rc.local file see this video for more information about how to configure that. Receiving Emails When receiving an email for the first time, you might get the following notification from Google:

By default, Google blocks apps from using SMTP without permissions. We can solve this by clicking on the allow "less secure apps" link and toggle the feature on. The next object detected will send an email.





STEP 4:Blynk App Interface Setup


This is one of the easiest and fun steps. So let's get started. Shall we?
  • Downloading the Blynk App is the first obvious step. Download it from App Store or Google Play Store. Sign Up or Login in the app to get started.
  • Click on New Project to create a new project. Name it whatever you like. In devices Choose NodeMCU. In connection type choose WiFi and click on Create.
  • Now you will get a Auth key on your Email. Make sure to copy that and add that to your code.
  • Now click on the + sign to add widgets. You may need to buy some energy!
  • Now add three Gauge's. Click on of the Gauge's, name it Temperature. Choose a color of you choice for this gauge. In the pin choose Virtual Pin V6. Set the range from 0 to 50 °C ( not sure for °F), make the label °C/ °F and keep the reading rate to Push.
  • Repeat this for other two Gauges using data as shown in the pictures.
  • Now, add a zeRGBa and set R to digital Pin GP15, B to GP3 and B to GP1.
  • Now add 4 Buttons, change there colors accordingly. Set them as shown in the pictures.
  • Add a SuperChart, add 3 data streams Temperature, Humidity and gas, set there colors, there pins, Range and Suffix.
  • Now, add tabs. Go to the second tab and add Twitter, Notifications, Email and Eventor. In Twitter add you twitter username and password. In Notifications, Switch on Notify when hardware goes off. In Email, set your Email address. In Eventor you can set many triggers, see the picture for the triggers that I have set up.
  • You are done. now click on the play button to use the interface that you have created. You can change the interface as you like. It is really simple and fun process!





STEP 5:Making Octopod Structure


Warning - This is going to be one of most time-consuming process!

NOTE:You can skip this step and 3D print the enclosure that I have provided!

Actually, this step is optional yet the most important step! You can just take a shoe box and avoid all of this hard work. But on the contrary, this hard work makes the project unique. The idea for this unique design striked me while, I was doing my math homework. This shape is inspired from an octagon. Rather, This is a 3D octagon! So let's get started!

Making the Structure:
  • Take your cardboard and draw a rectangle of 9 cm x 9.5 cm (You can change the dimensions as per your convince). Now, joining end to end draw 4 of theses similar rectangles (8 if your cardboard is long enough).
  • Now make partial cuts (somewhat like paper creases) in between these rectangles and cut out this whole long piece. Repeat this process until you have 4 of these long pieces.
  • Now, using a D draw a 135° and cut it out as shown in the images. Make 16 of these same angles.
  • Using Glue gun glue these angles in between the small pieces. Repeat this for all the joints.
  • Now using glue gun join 2 of these open structures to make a closed structure (somewhat octagon) .
  • Now glue the other two open structure perpendicularly, making a 3-D shape.
  • Now Cut 4 More pieces of of 9 x 9.5 cm and glue them in between all the empty spaces.
  • Now you will be left with only 8 open triangles. Using Acrylic Butter paper cut 8 triangles, which will fit on these open areas, but don't glue them now.

Paint Job:

For this you need to head out towards an open area! Wear your Mask and Gloves and just make one coat over the structure that you have created. You can go to Youtube, to learn proper ways to make a perfect coat. Now let this dry for 4- 5 Hours and then apply 1 more coat. I think 3 coats will be good for this.

That's it! You have arrived with a unique piece of art.








STEP 6:Making Door Lock Enclosure


Really simple. Just take a Shoe Box and apply 2- 3 even coats of spray. And maybe for design make check pattern using duck tape like we did!





STEP 7:Assembling the Octopod


I have tried to make this step as simple as possible, by making the schematic diagram. Refer the picture or the file, and make connections accordingly. I will briefly explain all the connections!
  • We have connected the nodeMCU to a large size Solderless Breadboard. We have also connected Breadboard power supply on the breadboard. NodeMCU, all the sensors, LED's and other components are powered by the power supply.
  • Following are the sensor connections:DHT11D4 / GP2 MQ2A0 / adc00 Soil Moisture SensorD2 / GP4 PIRD6 / GP1 RGB R → D8 / GP15, G → Rx / GP3, B → Tx / GP1 RelayLn1D0 / GP16, Ln2D5 / GP14 Make the following connections.
  • For powering this you can use Power Bank or a Wall Adapter, which will be connected to the breadboard Power supply.
  • Now, take your Raspberry Pi along with the Raspberry Pi Camera. Make a small hole in one of the walls of the cardboard and glue or tape your Raspberry Camera.

Now, insert all these electronics inside, through any open triangle and close the triangle by using the cut outs of acrylic butter paper that we made. It is better to leave 1 or 2 open, in case something inside needs to be fixed! Also let the prongs of the Soil Moisture Sensor sit outside.

All done! We have completed the making process of the Octopod! Now, Just switch On the power and keep your Octopod over the dining Table or maybe on the Guest's Table and enjoy! To see the live feed from the Raspberry Pi, just open a browser and put in the IP address of the Pi. Enjoy!





STEP 8:Assembling the Door Lock


After uploading the code on your Arduino just make the connections as shown in the picture or in fritzing file! It is quite simple. Then take the handy shoe box that we made make 2 holes in it for the LED's to pop out. and allow the servo to stand out. These days mechanical locks like servo's are also available in the market, though servo works just as fine. This is just an experiment, so please so please don't use this as you actual lock! Glue the Rfid to one wall of the box and also glue the small breadboard and Arduino. You can use a wall adapter or a Power bank to power this. Just power the Arduino and you will be good to go! Done!





CONCLUSION:


This was a really fun project to do!

I was really happy how it turned out. I think the lights look really well, and i think its well worth making even one of these as a side lamp. I really can't thank creators of Blynk and OpenCV libraries enough, they are both really excellent pieces of software and made this project possible! As always, if you have any questions on any part of the process please let me know and I will be happy to try help. Thanks a lot! And Please Vote for Us!

-Saksham



Arduino Blog

Full Instructable





UPDATE:


I have been working on integrating this system with Amazon Alexa, I am almost done. Will upload the code in 2-3 days!

Código

  • octopod.ino
  • octopod_door.ino
  • octopod_door_bluetooth.ino
octopod.inoArduino
This is the main code for Arduino MKR 1010 (NodeMCU in my case)
If you are using MAX32620FTHR, download libraries for it. Then change the board in board settings. Also change the pin as given bellow
ESP MAX
AO - - - - - - - - - - - - GPIO2
A1 - - - - - - - - - - - - - GPIO1

Soil Sensor MAX
analog sensor - - - GPIO3

Gas Sensor (MQ2) MAX
sensor - - - - - - - - - - - GPIO4

PIR Sensor MAX
sensor - - - - - - - - - - - -GPIO0

Relay MAX
1 - - - - - - - - - - - - - - - - - M0
2 - - - - - - - - - - - - - - - - - M1
/*************************************************************************** OCTOPOD:A SMART HOME AUTOMATION PROJECT MADE BY SAKSHAM Download latest Blynk library here:https://github.com/blynkkk/blynk-library/releases/latestDownload latest DHT Sensor library here:https://github.com/adafruit/DHT-sensor-library***************************************************************************/#include  //Include ESP8266 Wifi Library#include  //Include Blynk Library#include  //Include DHT sensor library#define BLYNK_PRINT Serial// You should get Auth Token in the Blynk App.// Go to the Project Settings (nut icon).char auth[] ="Your Blynk Auth Key";// Your WiFi credentials.// Set password to "" for open networks.char ssid[] ="Your WiFi SSID";char pass[] ="Your WiFi Password";#define DHTPIN 2 // What digital pin temperature and humidity sensor is connected to#define soilPin 4 // What digital pin soil moist ure sensor is connected to#define gasPin A0 // What analog pin gas sensor is connected to#define pirPin 12 // What digital pin soil moisture sensor is connected to int pirValue; // Place to store read PIR Valueint soilValue; // Place to store read Soil Moisture Valueint PIRpinValue; // Place to store the value sent by Blynk App Pin V0int SOILpinValue; // Place to store the value sent by Blynk App Pin V1// Uncomment whatever type you're using!#define DHTTYPE DHT11 // DHT 11//#define DHTTYPE DHT22 // DHT 22, AM2302, AM2321//#define DHTTYPE DHT21 // DHT 21, AM2301DHT dht(DHTPIN, DHTTYPE);BlynkTimer timer;// This function sends Arduino's up time every second to Virtual Pin (5).// In the app, Widget's reading frequency should be set to PUSH. This means// that you define how often to send data to Blynk App.BLYNK_WRITE(V0) //VO pin from Blynk app tells if Motion Detection is ON{ PIRpinValue =param.asInt(); } BLYNK_WRITE(V1) //V1 pin from Blynk app tells if Soil Moisture is ON{ SOILpinValue =param.asInt(); } void sendSensor(){ int h =dht.readHumidity(); int t =dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); // to check if sensor is not sending any false values return; } // You can send any value at any time. // Please don't send more that 10 values per second. Blynk.virtualWrite(V5, h); // send humidity to pin V5 Blynk.virtualWrite(V6, t); // send temperature to pin V7}void getPirValue(void){ pirValue =digitalRead(pirPin); if (pirValue) //digital pin of PIR gives high value on human detection { Serial.println("Motion detected"); Blynk.notify("Motion detected"); }}void getSoilValue(void){ soilValue =digitalRead(soilPin); if (soilValue ==HIGH) //digital pin of soil sensor give low value when humidity is less { Serial.println("Water Plants"); Blynk.notify("Water Plants"); }}void setup(){ // Debug console Serial.begin(9600); Blynk.begin(auth, ssid, pass); // You can also specify server://Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442); //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442); dht.begin (); // Begins DHT reading Blynk.tweet("OCTOPOD IS ONLINE! "); // Tweating on your Twitter Handle that you project is online pinMode(pirPin,INPUT); // Defining that Pir Pin is meant to take Input Only pinMode(soilPin,INPUT); // Defining that Soil Sensor Pin is meant to take Input Only // Setup a function to be called every second timer.setInterval(1000L, sendSensor);}void loop(){ Blynk.run(); timer.run(); if (PIRpinValue ==HIGH) //VO pin from Blynk app tells if Motion Detection is ON { getPirValue(); } if (SOILpinValue ==HIGH) //V1 pin from Blynk app tells if Soil Moisture is ON { getSoilValue(); }} 
octopod_door.inoArduino
Code for Automatic Door Lock Control (NO BLUETOOTH VERSION)
/*********************************************************************************************************** OCTOPOD:A SMART HOME AUTOMATION PROJECT MADE BY SAKSHAM ARDUINO RFID DOOR LOCK CODELibrary Required - MFRC522 ************************************************************************************************************/#include #include #include  #define SS_PIN 10#define RST_PIN 9#define LED_G 5 //define green LED pin#define LED_R 4 //define red LED#define BUZZER 2 //buzzer pinMFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.Servo myServo; //define servo name void setup() { Serial.begin(9600); // Initiate a serial communication SPI.begin(); // Initiate SPI bus mfrc522.PCD_Init(); // Initiate MFRC522 myServo.attach(3); //servo pin myServo.write(0); //servo start position pinMode(LED_G, OUTPUT); pinMode(LED_R, OUTPUT); pinMode (BUZZER, OUTPUT); noTone(BUZZER); Serial.println("Put your card to the reader..."); Serial.println();}void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor Serial.print("UID tag :"); String content=""; byte letter; for (byte i =0; i  
octopod_door_bluetooth.inoArduino
Code for Automatic Door Lock Control (Bluetooth Version)
/*********************************************************************************************************** OCTOPOD:A SMART HOME AUTOMATION PROJECT MADE BY SAKSHAM ARDUINO RFID DOOR LOCK CODELibrary Required - MFRC522 ************************************************************************************************************/#include SoftwareSerial BTserial(0, 1); // RX | TX#include #include #include #define SS_PIN 10#define RST_PIN 9#define LED_G 5 //define green LED pin#define LED_R 4 //define red LED#define BUZZER 2 //buzzer pinMFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.Servo myServo; //define servo namevoid setup(){ BTserial.begin(9600); // Initiate a serial communication BTserial.println("Waiting for connections..."); SPI.begin(); // Initiate SPI bus mfrc522.PCD_Init(); // Initiate MFRC522 myServo.attach(3); //servo pin myServo.write(0); //servo start position pinMode(LED_G, OUTPUT); pinMode(LED_R, OUTPUT); pinMode (BUZZER, OUTPUT); noTone(BUZZER); BTserial.println("Put your card to the reader..."); BTserial.println();}void loop(){ // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor BTserial.print("UID tag :"); String content =""; byte letter; for (byte i =0; i  

Peças personalizadas e gabinetes

This is the basic design that you can use if you want to make the enclosure out of Cardboard/ Wood like me! octopod_v2_ukTmIJ0uMl.f3dProper Enclosure that you can 3D Print! octo_2_v3_sii4tuCF7d.f3d

Esquemas

Pin configuration might be different with Arduino MKR 1010 Without Bluetooth
For Bluetooth connect Rx (HC-05) --> Tx (Arduino)
Tx (HC-05) --> Rx (Arduino)
and 5v to 5v
Ground to Ground ESP MAX
AO - - - - - - - - - - - - GPIO2
A1 - - - - - - - - - - - - - GPIO1

Soil Sensor MAX
analog sensor - - - GPIO3

Gas Sensor (MQ2) MAX
sensor - - - - - - - - - - - GPIO4

PIR Sensor MAX
sensor - - - - - - - - - - - -GPIO0

Relay MAX
1 - - - - - - - - - - - - - - - - - M0
2 - - - - - - - - - - - - - - - - - M1

Processo de manufatura

  1. Aplicações de automação residencial
  2. Malvertising insidioso presas na IoT de casa inteligente
  3. RASPBERRY PI HOME AUTOMATION
  4. Smart Blinds
  5. IOT - Jar inteligente usando ESP8266, Arduino e sensor ultrassônico
  6. Automação residencial inteligente e sistema de segurança usando 1Sheeld
  7. Tech-TicTacToe
  8. Cronômetro de contagem regressiva do Arduino
  9. Trava de porta inteligente usando página de login WiFi por Arduino e ESP8266
  10. Automação na indústria 4.0