Índice:

SilverLight: Monitor ambiental baseado em Arduino para salas de servidores: 3 etapas (com imagens)
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores: 3 etapas (com imagens)

Vídeo: SilverLight: Monitor ambiental baseado em Arduino para salas de servidores: 3 etapas (com imagens)

Vídeo: SilverLight: Monitor ambiental baseado em Arduino para salas de servidores: 3 etapas (com imagens)
Vídeo: I Emailed My Doctor 133 Times: The Crisis In the British Healthcare System 2024, Novembro
Anonim
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores
SilverLight: Monitor ambiental baseado em Arduino para salas de servidores

Uma vez me deram a tarefa de procurar uma sonda ambiental para monitorar a temperatura na sala dos servidores da minha empresa. Minha primeira ideia foi: por que não usar apenas um Raspberry PI e um sensor DHT, ele pode ser configurado em menos de uma hora incluindo a instalação do sistema operacional. Por isso, recebi a resposta fria de pessoas vendadas e mandonas de que não faríamos isso porque custaria mais em horas de trabalho configurá-lo do que comprar um dispositivo. Ter que aceitar pessoas de mente estreita como essa em uma parte da minha vida era uma coisa e eu encomendei algum lixo EATON de nível empresarial do Ebay e liguei, mas eu decidi naquele momento que para minha própria sala de servidor eu construirei um Arduino de código aberto completamente dispositivo baseado em que será muito melhor do que o que acabei de encomendar.

Este projeto tem o nome de código SilverLight, não me pergunte de onde eu tirei esses nomes:) Eu apenas olhei para a caixa de acrílico brilhante e decidi com este nome, não tem nada a ver com o produto microhoof o que descobri depois.

Etapa 1: Design de Hardware

Design de Hardware
Design de Hardware
Design de Hardware
Design de Hardware
Design de Hardware
Design de Hardware

Visão geral do hardware comercial.

Ok, então eu nem comecei com a grande ideia de colocar um monitor de ambiente dentro de um ups, mas obviamente há um mercado para ele, então vamos ver o que eles podem fazer:

Dispositivo de monitoramento ambiental COMPATIBILIDADE

Rede 10/100 Mb - MS, PXGUPS, PXGPDP e PXGMS.

O 10/100 Mb ConnectUPS-X, ConnectUPS-BD e ConnectUPS-E com FW V3.01 e superior. DIMENSÕES (LXWXH)

2,26 x 1,48 x 1,15 (polegadas) 57,6 x 37,6 x 29,3 (mm) PESO

1,19 oz (34 g)

Essa é uma informação muito útil, não é? Não se preocupe, porque eles não podem fazer muito. Para começar, seu no-break precisará de outra placa adicional cara para isso, a qual conecta com o sensor ambiental que você compra separadamente, geralmente com cabo CAT5 padrão (nem tente conectar nada nessa porta porque não há nada padrão sobre isso). Eles afirmam que o dispositivo precisa de 10 minutos para "aquecer" que na realidade eram horas e, uma vez que voou, apareceu na interface java de atualização lenta e temos temperatura e umidade. Configurar condições baseadas em alertas foi fácil a partir deste ponto, mas quem se importa, vamos construir algo melhor.

Este projeto é uma conjunção de vários dos meus projetos: estação meteorológica Natalia, Shadow of phoenix. A caixa é capaz de monitorar as seguintes restrições ambientais:

  • Índice de temperatura / umidade / calor
  • Concentrações de GLP, fumaça, álcool, propano, hidrogênio, metano e monóxido de carbono no ar (MQ2)
  • Sensibilidade solar (a luz da sala do servidor está acesa?)
  • Sensor PIR de movimento (você pode até mesmo ligar / desligar as luzes automaticamente a partir de agora, graças ao sensor de movimento quando alguém entrar na sala)

Todos esses dados são bem exibidos em uma tela LCD e, ao mesmo tempo, retransmitidos a um computador (Orange PI Zero) para processamento posterior e alertas. Embora fosse possível conectar sensores digitais como o DHT e o pino digital do MQ2 diretamente ao OrangePI, sempre prefiro usar micros dedicados para essas tarefas e quando você precisar atualizar o LCD também e fazer outras tarefas de baixo nível Coisas que o Arduino é simplesmente imbatível e pode ser executado de forma confiável sem parar por muitos anos (na verdade, nem um único Arduino que executa 24/7 falhou comigo ainda). O OrangePI com suas deficiências (vamos enfrentá-lo é um computador de 10 $) como inutilizável para carga de trabalho pesada, sem suporte a bsd, wi-fi integrado está inchado etc pode facilmente lidar com pequenas cargas de trabalho como fazer leituras de sensor através de serial (USB) e processá-los.

Este é um projeto de hardware muito simples, que requer os seguintes componentes:

  • Arduino PRO Micro
  • Tela LCD 2x16 caracteres RGB
  • Módulo de alimentação com chave de isolamento AC-DC 220V a 5V HLK-5M05 (muito bons para projetos Arduino / ESP), esta é a versão 5V / 5W!
  • Resistores 2x300ohm
  • 2xleds (vermelho / verde)
  • Sensor de movimento PIR
  • Sensor MQ2
  • DHT22
  • LDR
  • Resistor 2X10Kohm
  • Campainha
  • Orange PI Zero
  • cabo de dados mini usb

Eu nem me preocupei em fazer uma placa de circuito impresso para esta placa de ensaio apenas usada porque os componentes podem ser simplesmente conectados ao Arduino (veja as fotos em anexo):

-DHT22 exigirá um pullup de 10K para VCC (digital)

-LDR exigirá um menu suspenso de 10K para GND (analógico)

-MQ2 pode ser conectado diretamente a qualquer pino analógico (analógico) <prefira usar analógico porque não quando temos um MCU com pinos analógicos onde podemos obter o valor exato em vez de ajustar algum potenciômetro na parte de trás do dispositivo para obter HIGH ou BAIXO fora disso, devido à colagem no meu design que é inacessível de qualquer maneira. Verifique:

-PIR pode ser conectado diretamente a qualquer pino (digital)

-LCD: pode ser acionado com 4 pinos, pode ser conectado a qualquer pino (digital) será necessário +2 RS / E (digital)

-Buzzer: pode ser conectado diretamente a qualquer pino do Arduino (digital)

A pinagem que usei pode ser vista no código. Conectar tudo depois disso é bastante simples, você também pode fazer um por um, certifique-se de que 1 sensor funcione perfeitamente e prossiga para o próximo, tudo o que você pode errar é conectar os fios por engano em lugares errados (por exemplo, trocar o vcc / gnd para um sensor, até agora isso nunca matou nenhum dos meus dispositivos). O que eu observaria aqui é que havia muitos VCC e GNDs empilhados para mim, não consegui espremê-los em uma tira de terminal, então os soldei todos.

Também sobre os DHTs não se esqueça dos meus outros projetos: se você colocar a biblioteca DHT em seu código e o sensor DHT não estiver conectado ou DHT conectado incorretamente (por exemplo, 11 definido no código que você está usando 22) isso pode levar ao programa para pendurar para sempre no início.

Sobre os sensores de detecção de movimento PIR, como você pode ver na minha foto, há toneladas de falsificações deles, na verdade eu acharia até difícil comprar um genuíno no Ebay. As falsificações funcionam tão bem, mesmo a longo prazo, mas têm seu circuito espelhado, o que faz com que os pinos + e - sejam invertidos, também estes são fáceis de reconhecer: vêm com pcb azul não o verde normal, faltando os rótulos para os medidores de potes. Tive a sorte de encontrar um genuíno na minha caixa, caso contrário, mudar a posição cobriria os 2 leds para mim. Descobri que os dois potes girados no meio do caminho funcionam para mim. Isso lhe dará um alcance longo o suficiente para detectar também quando há movimento, a perna digital será mantida na posição ALTA por cerca de um minuto, portanto, você não precisa compensar no código para isso. Nas falsificações é fácil determinar de que lado está o - e + basta olhar para as pernas correspondentes para as tampas eletrolíticas conectadas aos pinos.

Para cortar a caixa, usei a cabeça de dremel de diamante (que foi um exagero, mas funcionou muito bem) e uma furadeira normal. Essas caixas de junção são fáceis de trabalhar e, embora eu não goste de colar, não tinha parafusos e porcas à mão ao construí-la, então peguei a barganha de colar as coisas (que também podem ser facilmente reaquecidas e desmontadas mais tarde usando o mesmo gluegun sem filamento).

Etapa 2: Design de software

Design de software
Design de software
Design de software
Design de software

O código do Arduino também é simples, ele basicamente puxa todas as leituras do sensor no início de cada loop. Liga os LEDs se houver movimento ou fumaça e também toca um alarme sonoro na campainha se houver fumaça (este é o único código de bloqueio, então fiz isso curto), exibe os dados no LCD e finalmente os envia para o PC com um período de espera de 10 segundos, para não inundar o porto.

Este projeto usa uma comunicação unilateral do Arduino-> OrangePI, não há comandos de nenhum tipo implementados. Embora seja perfeitamente possível fazer isso como eu fiz em um de meus outros projetos, onde o computador pode enviar LCD_PRINT1 ou LCD_PRINT2 para substituir uma linha da tela LCD com sua própria mensagem (por exemplo: endereço IP, tempo de atividade, data do sistema, uso da CPU), a área da tela é tão pequena para exibir dados de 3 sensores que eu nem me incomodei. Os valores SOL e SMK podem ir até 4 dígitos 0000-1023, já tendo até 8 caracteres valiosos na tela.

Com o LCD você pode notar um pequeno truque no código que, após cada valor medido, uma impressão de espaços em branco ("") é aplicada, então movo o cursor para posições fixas para colocar os novos ícones e dados. Eles estão lá porque o LCD não é muito inteligente para entender números, ele apenas desenha o que obtém e, por exemplo, se você tivesse um valor solar de 525 que de repente diminuiu para 3, ele exibirá 325 deixando o lixo antigo na tela lá.

Um código de controle C rodando no OrangePI e registrando os dados ambientais e enviando alertas de e-mail quando necessário.

O OrangePI está rodando o Armbian (que no momento da escrita era baseado no Debian Stretch). Vou incluir isso na parte do software sobre o problema que foi resolvido. Aqui está o consumo médio de energia do dispositivo:

0,17 A - Arduino apenas + sensores

0,5-0,62 A - inicialização do OrangePI

0,31 A - Orange PI inativo

0,29 A - Orange PI desligado (não é possível desligá-lo, não tem ACPI ou algo parecido)

0,60 A - Teste de estresse 100% de uso da CPU em 4 núcleos

Eu tinha esse OrangePI em uma caixa há muito tempo. Com o kernel antigo o dispositivo drenou tanta corrente (como o medidor disse que atingiu o pico em torno de 0,63 A) que ele provavelmente não poderia fornecer que simplesmente não inicializou, o processo de inicialização travou e eu acendi os 2 leds ethernet constantemente e não fazendo nada.

Agora, isso é meio irritante, pois o HLK-5M05 afirma que pode fazer 5W em 5V, tornando-o capaz de fornecer 1 Amp, mas com esses dispositivos saindo da China você nunca sabe, o pico de 0,63 A foi bem menor do que o máximo nominal valor. Então, eu estava executando testes de reinicialização simples, a partir de 10 reinicializações o OrangePI só inicializaria duas vezes com sucesso, o que quase me fez descartá-lo do projeto, já que não gosto de comportamento inconsistente com bugs nos circuitos. Então comecei a pesquisar no Google que talvez haja uma maneira de reduzir o consumo de energia no momento da inicialização do software (já que era apenas um problema na época) e encontrei algum artigo falando sobre como ajustar o script.bin, mas era para o Orange PI PC e o arquivos estavam faltando no armazenamento, portanto, como último recurso, fiz a mágica "atualização do apt" para atualizar o firmware, kernel e tudo mais, esperando que drene menos e o dispositivo possa inicializar e:

Linux silverlight 4.14.18-sunxi # 24 SMP Sex, 9 de fevereiro 16:24:32 CET 2018 armv7l GNU / Linux

Linux silverlight 4.19.62-sunxi # 5.92 SMP Quarta, 31 de julho, 22:07:23 CEST 2019 armv7l GNU / Linux

Funcionou! Atribuir hardware a um problema de software geralmente é algo que os desenvolvedores java preguiçosos decidem fazer, mas neste caso resolvemos um problema de hardware com software que foi um grande sucesso. Eu fiz mais 20 testes de reinicialização, o dispositivo inicializou todos os casos. Eu ainda observaria que a oscilação de energia ao ligar o Opi (conectar / desconectar) é tão grande que reinicializará o Arduino a qualquer momento (uma simples reinicialização irá apenas piscar no LCD, mas não causará mais problemas), mas esse problema permanece oculto, pois os 2 serão inicializados juntos.

Eu também olhei os módulos do kernel:

usb_f_acm u_serial g_serial libcomposite xradio_wlan mac80211 lima sun8i_codec_analog snd_soc_simple_card gpu_sched sun8i_adda_pr_regmap sun4i_i2s snd_soc_simple_card_utils ttm sun4i_gpadc_iio snd_soc_core cfg80211 snd_pcm_dmaengine industrialio snd_pcm snd_timer snd sun8i_ths soundcore cpufreq_dt uio_pdrv_genirq uio thermal_sys pwrseq_simple

O que realmente precisamos deles? Ok, o pwr e o térmico podem ser úteis, mas o som, a porta serial, o wi-fi (já está quebrado), não precisamos de tudo isso pode ser colocado na lista negra. Também vou criar um kernel personalizado com apenas os módulos necessários mais tarde.

O que precisamos e não é carregado por padrão é o CDC ACM para se comunicar com o Arduino, habilite-o com:

echo "cdc-acm" >> / etc / modules

Depois disso, você já pode testar a conexão com:

tela / dev / ttyACM0 9600

Você deve ver os dados de status sendo enviados a cada 10 segundos.

Alertas e monitoramento

A partir dos alertas, acabei de inserir chamadas de sistema () no código de controle C, que recebe os dados da série, de forma que nenhuma ferramenta externa seja necessária. Alguns exemplos de alertas:

- A temperatura ultrapassa os 30 ° C

- A umidade ultrapassa 70% (não é saudável para os servidores)

- Movimento detectado na sala (isso pode ser irritante se você continuar na sala do servidor)

- Fumaça ou gás detectado (alertas acima de 100 podem ser levados a sério, eu brinquei com este sensor e ele liga para muitas coisas, por exemplo, a criação de fumaça próxima ao sensor com o ferro de solda resultou em pouco mais de 50 enquanto fumava em seguida o aumentou para 500, ele até detectou gás de desodorante comum de longe)

Para manter os dados históricos, não me preocupei em desenvolver uma ferramenta, porque reinventar a roda quando tínhamos excelentes frameworks de monitoramento por aí. Vou mostrar um exemplo de como integrar isso em meu favorito pessoal, Zabbix:

apt-get install zabbix-agent

Adicione ao final de: /etc/zabbix/zabbix_agentd.conf

UserParameter = silverlight.hum, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 1}'

UserParameter = silverlight.tmp, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 2}' UserParameter = silverlight.sol, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 4}' UserParameter = silverlight.mot, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 5}' UserParameter = silverlight.smk, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{imprimir $ 6}'

A execução de zabbix_agentd -p deve retornar agora os valores adequados:

silverlight.hum [t | 41]

silverlight.tmp [t | 23] silverlight.sol [t | 144] silverlight.mot [t | 0] silverlight.smk [t | 19]

O índice de calor, eu coleciono, mas não vejo nenhum uso prático dele, então é apenas registrado. No código de controle C, implementei 2 funções de registro, a primeira registrará todos os dados em um formato amigável:

[SILVERLIGHT] Dados recebidos em 2019-09-10 23:36:08 => Umidade: 44, Temp: 22, Hi: 25, Solar: 0, Movimento: 0, Fumaça: 21

[SILVERLIGHT] Dados recebidos em 2019-09-10 23:36:18 => Umidade: 44, Temp: 22, Hi: 25, Solar: 0, Movimento: 0, Fumaça: 21 [SILVERLIGHT] Dados recebidos em 09/2019 -10 23:36:29 => Umidade: 44, Temp: 22, Hi: 25, Solar: 0, Movimento: 0, Fumaça: 22 [SILVERLIGHT] Dados recebidos em 2019-09-10 23:36:39 => Umidade: 44, Temp: 22, Hi: 25, Solar: 0, Movimento: 0, Fumaça: 21

O segundo:

void logger2 (char * text) {

ARQUIVO * f = fopen ("/ dev / shm / silverlight-zbx.log", "w"); if (f == NULL) {printf ("Erro ao abrir o arquivo de log da memória! / n"); Retorna; } fprintf (f, "% s", texto); fclose (f); Retorna; }

Isso colocará um registro de linha na memória (eliminará operações rw desnecessárias no cartão SD), que será sempre sobrescrito na próxima vez. Este log conterá apenas as 6 colunas de dados e nenhum carimbo de data / hora, é facilmente legível para o Zabbix.

Como bônus final: como programar o Arduino diretamente do OrangePI para que você não precise ir até o dispositivo todas as vezes e conectar seu laptop.

Existem 2 maneiras:

- Maneira fácil: instale o Arduino IDE completo e as bibliotecas, use alguns desktops remotos como o X11 com encaminhamento, Xrdp, Xvnc, Nxserver etc.

- Maneira difícil: instale o IDE do Arduino e use a linha de comando

Faremos da maneira mais difícil desta vez, já que não gosto de instalar o X11 em servidores. Para isso, você precisará de 6 componentes:

1, Arduino IDE para ARM de 32 bits ->

2, Python serial -> apt-get install python-serial

3, projeto Arduino Makefile -> git clone

4, biblioteca DHT

5, definições de placa Sparkfun

6, SilverLight.ino, código principal

Para facilitar, agrupei os arquivos necessários para os últimos 4 pontos (sketchbook.tgz), portanto, você precisará apenas dos 2 primeiros

Em primeiro lugar, é melhor criar um usuário normal que tenha acesso rw à porta USB:

adduser prata

usermod -a -G dialout silver

SCP o sketchbook.tgz para o dispositivo no diretório inicial do usuário recém-criado e extraia-o ali mesmo:

cd / home / prata

tar xvzf sketchbook.tgz

Para entender um pouco o que está acontecendo nos bastidores quando você está usando o IDE gráfico:

O fluxo de trabalho de construção de um esboço do Arduino ao usar o IDE do Arduino é descrito no site do Arduino https://www.arduino.cc/en/Hacking/BuildProcess e com mais detalhes aqui: https://www.arduino.cc/ en / Hacking / BuildProcess

Geralmente, o processo de construção padrão do Arduino é:

Combine os arquivos.ino no arquivo de esboço principal. Transformação do arquivo de esboço principal: adicione a instrução #include; criar declarações de função (protótipos) de todas as funções no arquivo de esboço principal; acrescente o conteúdo do arquivo main.cxx do destino ao arquivo de esboço principal. Compile o código para arquivos de objeto. Vincule os arquivos de objeto para produzir um arquivo.hex pronto para carregá-lo no Arduino.

Existem algumas pequenas diferenças entre o processo de construção padrão do Arduino e o processo de construção usando o Arduino-Makefile:

Apenas um arquivo.ino é compatível. As declarações de funções não são criadas automaticamente no arquivo.ino. O usuário deve se preocupar em criar as declarações de função corretas.

O coração do processo de construção é o Makefile. Não se preocupe, tudo está preparado para você, é um pouco mais complicado compilar desta forma para placas não padronizadas como a série SparkFun.

BOARD_TAG = promicro

ALTERNATE_CORE = SparkFun BOARD_SUB = 16MHzatmega32U4 ARDUINO_PORT = / dev / ttyACM0 USER_LIB_PATH = / home / silver / sketchbook / libraries ARDUINO_DIR = /opt/arduino-1.8.9 incluir /home/silver/sketchbook/Arkduino-Makefile/

E tudo que você precisa digitar é: make upload (que criará os arquivos.hex primeiro e depois usa avrdude para carregá-los), ele terminará com algo como:

mkdir -p build-promicro-16MHzatmega32U4

make reset make [1]: Entrando no diretório '/ home / silver / sketchbook' / home / silver / sketchbook / Arduino-Makefile / bin / ard-reset-arduino --caterina / dev / ttyACM0 make [1]: Saindo do diretório ' / home / silver / sketchbook 'make do_upload make [1]: Entrando no diretório' / home / silver / sketchbook '/opt/arduino-1.8.9/hardware/tools/avr/bin/avrdude -q -V -p atmega32u4 - C /opt/arduino-1.8.9/hardware/tools/avr/etc/avrdude.conf -D -c avr109 -b 57600 -P / dev / ttyACM0 / -U flash: w: build-promicro-16MHzatmega32U4 / sketchbook. hex: i Conectando ao programador:. Programador encontrado: Id = "CATERIN"; tipo = S Versão do software = 1.0; Nenhuma versão de hardware fornecida. O programador suporta incremento automático de addr. O programador oferece suporte ao acesso à memória em buffer com tamanho de buffer = 128 bytes. O programador suporta os seguintes dispositivos: Código do dispositivo: 0x44 avrdude: dispositivo AVR inicializado e pronto para aceitar instruções avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4) avrdude: arquivo de entrada de leitura "build-promicro-16MHzatmega32U4 / sketchbook.hex" avrdude: gravação de flash (11580 bytes): avrdude: 11580 bytes de flash escrito avrdude: safemode: Fusíveis OK (E: CB, H: D8, L: FF) avrdude feito. Obrigada.

Bem, obrigado avrdude, e agora nosso Arduino está resetado e programado com o novo código, o que você pode apenas editar com o vi ou seu editor favorito localmente, sem necessidade de quaisquer IDEs. Eu observaria que você deve fechar o programa de controle C, a tela ou qualquer outra coisa acessando o arduino durante o upload, caso contrário, a porta voltará como / dev / ttyACM1 após a reinicialização.

Etapa 3: Encerramento e lista de tarefas

Fechamento e lista de tarefas
Fechamento e lista de tarefas
Fechamento e lista de tarefas
Fechamento e lista de tarefas
Fechamento e lista de tarefas
Fechamento e lista de tarefas

Embora eu tenha criado esta caixa de sensor ambiental para salas de servidores, você pode usá-la para laboratórios de química / eletrônica, depósitos, salas regulares e qualquer outra coisa. E sim, como está usando TCP / IP, é um dispositivo IoT, G eu deveria ter colocado isso no título também para torná-lo mais empreendedor:)

Você pode modificar facilmente o hardware e o software para também ligar as luzes da sala automaticamente. Dê uma olhada no meu outro projeto: Shadow of phoenix como isso funciona para o controle de luz, você tem todo o hardware disponível para fazer a mesma coisa (ele usa temporizadores para manter as luzes acesas enquanto houver movimento detectado dentro de um período de tempo, se houver movimento novamente, um cronômetro será aumentado).

Com o OrangePI executando uma pilha completa Armbian, as possibilidades são ilimitadas, você pode criar uma interface web local escrita do zero em php para exibir dados históricos em gráficos. Já não é melhor que você tenha um dispositivo completamente Open Source monitorando sua sala de servidores, o que você pode se orgulhar de construir, se você acha que sim, construa você mesmo!

Recomendado: