Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Saiba por que o MongoDB foi selecionado como um líder no 2024 Gartner_Magic Quadrupnt()
Desenvolvedor do MongoDB
Centro de desenvolvedores do MongoDB
chevron-right
Idiomas
chevron-right
JavaScript
chevron-right

Uma introdução à IoT (Internet dos Toaletes)

Joe Karlsson11 min read • Published Feb 07, 2022 • Updated Sep 23, 2022
RaspberryPiJavaScript
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse exemplo de código
star-empty
star-empty
star-empty
star-empty
star-empty
social-githubVer código
Minhas coisas favoritas na vida são gatos, computadores e ideias ruins, então decidi combinar os três e explorar o que era possível com JavaScript criando um novo dispositivo de IoT para meu amigo felino em casa. Se você está lendo isso, provavelmente já ouviu falar sobre como os dispositivos conectados à Internet são interessantes e provavelmente está interessado em aprender como entrar no desenvolvimento de IoT como desenvolvedor JavaScript. Nesta postagem, exploraremos por que você deve considerar o JavaScript para seu próximo projeto de IoT, falaremos sobre as melhores práticas de dados de IoT e exploraremos minha criação mais recente, a IoT Kitty Litter Box.
Gif em stop movimento da caixa de limpeza IoT Kitty concluída
Gif em stop movimento da caixa de limpeza IoT Kitty concluída

IoT e JS(?!?!)

Ok, então por que você deve usar JavaScript em um projeto de IoT? Você pode ter achado que o JavaScript era apenas para páginas da web. Bem, acontece que o JavaScript está comendo o mundo e agora está, de fato, sendo executado em muitos dispositivos novos e interessantes, incluindo a maioria dos processadores IoT habilitados para Internet! Você fazia saber que 58% dos programadores identificados como programadores de IoT usam o Node.js?

A Internet

Fala JavaScript

São muitos desenvolvedores de IoT que já usam o Node.js. Muitos desses desenvolvedores usam o Node porque a internet fala JavaScript. É natural continuar a criar dispositivos conectados à Internet usando o padrão de fato da Internet. Por que Reinventar a Roda?

Fácil de atualizar

Outra razão pela qual os desenvolvedores de IoT usam o Node é a facilidade de atualizar sua base de código. Com outras linguagens de programação comumente usadas para projetos de IoT (C ou C++), se você deseja atualizar o código, você precisa conectar-se físicamente ao dispositivo e reflitar o dispositivo com o código mais atualizado. No entanto, com um dispositivo IoT executando o Node, tudo o que você precisa fazer é executar remotamente git pull e npm install. Agora isso é muito mais fácil.

O Node é baseado em eventos

Uma das principais novidades do Node é o loop de eventos. O loop de eventos permite que os servidores que executam o Node lidem com eventos do mundo externo (ou seja, solicitações de clientes) muito rapidamente. O nó é capaz de lidar com esses eventos de forma extremamente eficiente e em escala.
Agora, considere como um dispositivo IoT ativo foi criado para ser executado. Neste experimento pensativo, vamos presumir que estamos projetando um dispositivo IoT para uma granja que coletará dados de sensores de Umidade de um milharal. Nosso dispositivo será fornecido com um sensor de Umidade que enviará um sinal quando o nível de Umidade do Solo cair abaixo de um determinado Nível. Isso significa que nosso dispositivo IoT responderá a um evento de Umidade (soa muito como um loop de eventos ;P). Praticamente todos os casos de uso de IoT são construídos em torno de eventos como esse. O fato de a arquitetura baseada em eventos do Node corresponder de forma quase idêntica à natureza baseada em eventos dos dispositivos IoT é um ajuste completo. Ter uma arquitetura de IoT baseada em eventos significa que seu dispositivo pode economizar energia valiosa quando não precisar responder a um evento do mundo externo.

Comunidade IoT amadurecida

Por fim, é importante observar que há uma comunidade madura de desenvolvedores de IoT trabalhando ativamente em bibliotecas de IoT para o Node.js. Minhas favoritas são Johnny-Five e CylonJS. Vamos dar uma olhada no "Hello World" em dispositivos de IoT: fazer uma lâmpada de LED piscar. Esta é a aparência quando comecei a fazer meu código IoT "Hello World" funcionar.
IoT Hello World
IoT Hello World
Apenas tome cuidado para que seu gato não tente comer seu projeto enquanto você está instalando e executando o aplicativo Hello World.
Meu cão comendo o projeto IoT Olá Mundo
Meu cão comendo o projeto IoT Olá Mundo

IoT (AKA: Internet dos toaletes) Kitty Litter Box

Isso me leva ao meu projeto pessoal de IoT, a IoT Kitty Litter Box. Para este projeto, optei por usar o Jonhy-Five. Então, o que é essa IoT Kitty Litter Box e por que alguém gostaria de construir uma coisa dessas? Bem, o objetivo de construir uma caixa de limpeza conectada à Internet era:
  • Ajudar a acompanhar a saúde do meu amigo feline medindo passivamente o peso do meu gatos toda vez que ele põe os peões na bandeja de fezes.
  • Monitore os padrões de banheiro do meu gato ao longo do tempo. Isso tornará mais fácil rastrear quaisquer alterações no comportamento do banheiro.
  • Explore projetos de IoT e divirta-se!
Além disso, pessoalmente, gosto da ideia de construir algo que oscila bem na fronteira de ser completamente ridículo e meio genial. Sinceramente, estou chocado com o fato de ninguém ter realmente criado um produto de consumo como esse! Aqui está em toda a sua glória completa.
Gif em stop movimento da caixa de limpeza IoT Kitty concluída
Gif em stop movimento da caixa de limpeza IoT Kitty concluída

Materiais e ferramentas

  • 1 x Raspberry Pi - Usei um Raspberry Pi 3 Modelo B para esta demonstração, mas qualquer modelo serve.
  • 1 x Breadboard
  • 2 x Fios fêmea para macho
  • 1 x 3D [Opcional] - A impressão 3D foi usada para imprimir a caixa onde os eletrônicos estão incluídos.
  • 1 x Filamento de PLA [Opcional] - Qualquer cor funcionará.
  • 1 x Soldador e fio de Solda
  • Parafusos 8 x M2x6 mm
  • 1 x módulo de711 HX - Este módulo é necessário como um amplificador de célula de carga e converte o sinal analógico da célula de carga em um sinal digital para que o Raspberry Pi possa ler os dados recebidos.
  • 4 x 50 célula de carga Kg (x4) - São usadas para medir o peso. Neste projeto, são utilizadas quatro células de carga que podem medir um peso máximo de 200kg.
  • 1 xSensor de porta elástica - Usado para detectar que a caixa de drenagem está aberta.
  • 1 x cabo micro USB
  • 1 x Caixa de fezes para gatos

Como funciona a caixa de limpeza IoT Kitty?

Então, como funciona esta caixa de limpeza IoT Kitty? Vamos dar uma olhada nos eventos que eu precisei gerenciar:
  • Quando a tampa da caixa é removida, a caixa entra no modo de manutenção "." Quando estou no modo de manutenção, posso remover lixo ou atualizar a ninhada.
  • Quando a tampa da caixa é colocada de volta, ela sai do modo de manutenção, aguarda um minuto para que a cama assente e, em seguida, recalibra um novo peso base após a limpeza.
  • Em seguida, a caixa aguarda que um objeto do tamanho de um gato seja adicionado ao peso da caixa. Quando esse evento ocorre, esperamos 15 segundos para que o gato se acomode e a caixa registra o peso do gato e o registra em um MongoDB database.
  • Quando o gato sai da caixa, redefinimos o peso base da caixa, e a caixa aguarda a ocorrência de outro evento de banheiro ou manutenção.
Você também pode assistir a esta dinâmica útil que percorre os vários eventos que precisamos gerenciar.
Lives de como a caixa funciona
Lives de como a caixa funciona

Como escrever código que interage com o mundo lá fora

Para este projeto, optou por trabalhar com um Raspberry Pi 3 Modelo B+, pois ele executa uma distribuição Linux completa e é fácil fazer o Node executá-lo nele. O Raspberry Pi é maior do que outros processadores habilitados para Internet no mercado, mas sua facilidade de uso o torna ideal para usuários novatos que desejam se envolver em projetos de IoT. O outro motivo pelo qual escolhi o Raspberry Pi é a grande variedade de pinos GPIO. Esses pinos permitem que você faça três coisas.
  1. Alimente um sensor ou processador externo.
  2. Ler a entrada de um sensor (ou seja, ler dados de um sensor de luz ou Umidade).
  3. Enviar dados do Raspberry Pi para o mundo externo (ou seja, ligar e desligar uma luz).
Lives de como a caixa funciona
Lives de como a caixa funciona
Conectei a IoT Kitty Litter Box usando o esquema abaixo. Gostaria de observar que não sou engenheiro elétrico e a criação desse produto envolveu muitas pesquisas no Google, falhas e pelo menos duas placas de circuito explodidas. Não há problema em cometer erros, especialmente quando se está começando.

Esquemas

Design de esquema de caixa de limpeza IoT Kitty
Design de esquema de caixa de limpeza IoT Kitty
Usaremos esses pinos GPIO para nos comunicarmos com nossos sensores no mundo real ". "

Vamos mergulhar no código

Quero começar com o componente mais simples da caixa, o interruptor magnético que é acionado quando a tampa é removida, para que saibamos quando a caixa entra no modo de manutenção ". " Se você quiser acompanhar, confira o código-fonte completo aqui.

Interruptor mestre

1const { RaspiIO } = require('raspi-io');
2const five = require('johnny-five');
3
4// Initialize a new Raspberry Pi Board
5const board = new five.Board({
6 io: new RaspiIO(),
7});
8
9// Wait for the board to initialize then start reading in input from sensors
10board.on('ready', () => {
11 // Initialize a new switch on the 16th GPIO Input pin
12 const spdt = new five.Switch('GPIO16');
13
14 // Wait for the open event to get triggered by the sensor
15 spdt.on('open', () => {
16 enterMaintenceMode();
17 });
18
19 // Recalibrate the box once the sensor has closed
20 // Once the box has been cleaned, the box prepares for a new event
21 spdt.on('close', () => {
22 console.log('close');
23 // When the box has been closed again
24 // wait 1 min for the box to settle
25 // and recalibrate a new base weight
26 setTimeout(() => {
27 scale.calibrate();
28 }, 60000);
29 });
30});
31
32board.on('fail', error => {
33 handleError(error);
34});
Você pode ver o evento e a natureza assíncrona da IoT funcionarem muito bem com a estrutura de chamada de resposta do Node. Aqui está uma demonstração do componente do interruptor magnético em ação.
Alterne a demonstração
Alterne a demonstração

Células de carga

Ok, agora vamos falar sobre meu componente favorito, as células de carga. As células de carga funcionam basicamente como qualquer balança de banheiro que você tenha em casa. As células de carga são responsáveis por converter a pressão exercida sobre elas em uma medida de peso digital que eu possa ler no Raspberry Pi. Começo medindo o peso básico da caixa de areia. Depois, espero que o peso de algo aproximadamente do tamanho de um gato seja adicionado ao peso base da caixa e meço o peso do gato. Quando o gato sai da caixa, eu recalibro o peso base da caixa. Também recalculo o peso base cada vez que a tampa é retirada, a fim de levar em conta eventos como a limpeza da caixa ou a adição de mais lixo à caixa.
No que diz respeito ao código para leitura de dados das células de carga, as coisas eram um pouco complicadas. Isso ocorre porque as células de carga não são diretamente compatíveis com Johnny-Five. No entanto, consegui encontrar uma biblioteca Python que pode interagir com as células de carga HX711 .
1#! /usr/bin/python2
2
3import time
4import sys
5import RPi.GPIO as GPIO
6from hx711 import HX711
7# Infintely run a loop that checks the weight every 1/10 of a second
8while True:
9 try:
10 # Prints the weight - and send it to the parent Node process
11 val = hx.get_weight()
12 print(val)
13
14 # Read the weight every 1/10 of a second
15 time.sleep(0.1)
16
17 except (KeyboardInterrupt, SystemExit):
18 cleanAndExit()
Para usar esse código, precisei usar a API de processo filho do Node. A API do processo filho é responsável por ativar o processo Python em um thread separado. Veja como é isso.
1const spawn = require('child_process').spawn;
2
3class Scale {
4 constructor(client) {
5 // Spin up the child process when the Scale is initialized
6 this.process = spawn('python', ['./hx711py/scale.py'], {
7 detached: true,
8 });
9 }
10
11 getWeight() {
12 // Takes stdout data from Python child script which executed
13 // with arguments and send this data to res object
14 this.process.stdout.on('data', data => {
15 // The data is returned from the Python process as a string
16 // We need to parse it to a float
17 this.currWeight = parseFloat(data);
18
19 // If a cat is present - do something
20 if (this.isCatPresent() {
21 this.handleCatInBoxEvent();
22 }
23 });
24
25 this.process.stderr.on('data', err => {
26 handleError(String(err));
27 });
28
29 this.process.on('close', (code, signal) => {
30 console.log(
31 `child process exited with code ${code} and signal ${signal}`
32 );
33 });
34 }
35 [...]
36}
37
38module.exports = Scale;
Esta foi a primeira vez que joguei com a API de Processo de Filho de Node. Pessoalmente, estou realmente impactado com a facilidade de uso e solução de problemas. Não é a solução mais elegante, mas funciona totalmente para o meu projeto e usa alguns recursos legais do Node. Vamos dar uma olhada em como as células de carga se parecem em ação. No vídeo abaixo, você pode ver como a pressão colocada nas células de carga é registrada como uma medida de peso do Raspberry Pi.
Load Cell Demo
Load Cell Demo

Como lidar com dados de IoT

Ok, então, como engenheiro de software do MongoDB, eu seria falha se não falasse sobre o que fazer com todos os dados desse dispositivo IoT. Para minha IoT Litter Box, estou salvando todos os dados em um serviço de banco de dados totalmente gerenciado no MongoDB Atlas. Veja como conectei a caixa de limpeza ao banco de dados MongoDB Atlas.
1const MongoClient = require('mongodb').MongoClient;
2const uri = 'YOUR MONGODB URI HERE'
3const client = new MongoClient(uri, { useNewUrlParser: true });
4client.connect(err => {
5 const collection = client.db('IoT').collection('toilets');
6 // perform actions on the collection object
7 client.close();
8});

Melhores práticas de dados IoT

Há muitos lugares para armazenar seus dados de IoT atualmente, então gostaria de falar sobre o que você deve procurar ao avaliar plataformas de dados.

Alto rendimento de banco de dados

A primeira coisa ao selecionar um banco de dados para seu projeto de IoT, você precisa garantir que seu banco de dados seja capaz de lidar com uma grande quantidade de gravações simultâneas. A maioria das arquiteturas de IoT tem gravação pesada, o que significa que você está gravando mais dados em seu banco de dados do que lendo a partir deles. Digamos que eu decida iniciar a produção em massa e a venda de minhas IoT Kitty Litter Boxes. Depois de distribuir algumas milhares de caixas à solta, meu banco de dados poderá ter uma quantidade massiva de gravações simultâneas se todos os gatos Go ao banco ao mesmo tempo! Esses serão muitos dados recebidos que meu banco de dados precisará gerenciar!

Esquema de dados flexível

Você também deve considerar um banco de dados capaz de lidar com um esquema flexível. Isso ocorre porque é comum adicionar ou atualizar sensores em um dispositivo IoT. Por exemplo, em minha caixa de lixo, conseguir atualizar facilmente meu esquema para adicionar os dados de troca quando decidiu começar a acompanhar a frequência com que a caixa é limpa.

Seu banco de dados deve facilmente dados de série temporal

Por último, você desejará selecionar um banco de dados que lide nativamente com dados de séries temporais. Considere como seus dados serão usados. Para a maioria dos projetos de IoT, os dados serão coletados, analisados e visualizados em um gráfico ou gráfico ao longo do tempo. Para a minha IoT Litter Box, o esquema do meu banco de dados é semelhante ao seguinte.
1{
2 "_id": { "$oid": "dskfjlk2j92121293901233" },
3 "timestamp_day": { "$date": { "$numberLong": "1573854434214" } },
4 "type": "cat_in_box",
5 "cat": { "name": "BMO", "weight": "200" },
6 "owner": "Joe Karlsson",
7 "events": [
8 {
9 "timestamp_event": { "$date": { "$numberLong": "1573854435016" } },
10 "weight": { "$numberDouble": "15.593333333" }
11 },
12 {
13 "timestamp_event": { "$date": { "$numberLong": "1573854435824" } },
14 "weight": { "$numberDouble": "15.132222222" }
15 },
16 {
17 "timestamp_event": { "$date": { "$numberLong": "1573854436632"} },
18 "type": "maintenance"
19 }
20 ]
21}

Resumo

Tudo bem, vamos encerrar essa festiva. Nesta postagem, conversamos sobre por que você deve considerar o uso do Node em seu próximo projeto de IoT: É fácil atualizar em uma rede, a internet já fala JavaScript, há muitas bibliotecas/plugins/APIs existentes (incluindo CylonJS e J.J.S.), e o JavaScript é ótimo para lidar com aplicativos orientados a eventos. Analisamos um projeto de IoT baseado em nó da vida real, minha IoT Kitty Litter Box. Em seguida, pesquisamos a base de código da IoT Kitty Litter Box. Também discutemos o que procurar ao selecionar um banco de dados para projetos de IoT: ele deve ser capaz de escrever dados de forma simultânea rapidamente, ter um esquema flexível e ser capaz de lidar com dados de séries temporais.
Processo final de montagem da caixa de limpeza IoT Kitty
Processo final de montagem da caixa de limpeza IoT Kitty
O que vem a seguir? Bem, se inspirei você a começar seu próprio projeto de IoT, direi: "Go em frente!" Escolha um projeto, mesmo que seja "de baixa qualidade", e construa-o. Pesquise no Google conforme avança e cometa erros. É a melhor maneira de aprender. Por meio deste, dou permissão para fazer coisas estúpidas só para você, algo para ajudá-lo a aprender e crescer como ser humano e engenheiro de software.
Quando estiver pronto para construir seu próprio dispositivo IoT, confira o MongoDB Atlas, o banco de dados como serviço totalmente gerenciado do MongoDB. O Atlas é a maneira mais fácil de começar a usar o MongoDB e tem uma camada rica e gratuita para sempre.
Confira os seguintes recursos para obter mais informações:

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse exemplo de código
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Trabalhando com MongoDB Charts e o novo SDK para JavaScript


Apr 02, 2024 | 10 min read
Tutorial

Como desenvolver um aplicativo web com funções sem servidor da Netlify e MongoDB


Jan 13, 2025 | 6 min read
Tutorial

Criar um backend de gerenciamento de mídia escalável: integrando Node.js, Armazenamento de blobs Azure e MongoDB


Nov 05, 2024 | 10 min read
Tutorial

Rastreamento de localização em tempo real com Change Streams e Socket.io


Aug 13, 2024 | 8 min read
Tecnologias Utilizadas
Linguagens
Tecnologias
Sumário