Tabla de contenido:

SilverLight: Monitor ambiental basado en Arduino para salas de servidores: 3 pasos (con imágenes)
SilverLight: Monitor ambiental basado en Arduino para salas de servidores: 3 pasos (con imágenes)

Video: SilverLight: Monitor ambiental basado en Arduino para salas de servidores: 3 pasos (con imágenes)

Video: SilverLight: Monitor ambiental basado en Arduino para salas de servidores: 3 pasos (con imágenes)
Video: Объясняющее видео | Технология мониторинга окружающей среды от OIZOM 2024, Noviembre
Anonim
SilverLight: monitor ambiental basado en Arduino para salas de servidores
SilverLight: monitor ambiental basado en Arduino para salas de servidores
SilverLight: monitor ambiental basado en Arduino para salas de servidores
SilverLight: monitor ambiental basado en Arduino para salas de servidores
SilverLight: monitor ambiental basado en Arduino para salas de servidores
SilverLight: monitor ambiental basado en Arduino para salas de servidores
SilverLight: monitor ambiental basado en Arduino para salas de servidores
SilverLight: monitor ambiental basado en Arduino para salas de servidores

Una vez me dieron la tarea de buscar una sonda ambiental para monitorear la temperatura en la sala de servidores de mi empresa. Mi primera idea fue: ¿por qué no usar un Raspberry PI y un sensor DHT? Se puede configurar en menos de una hora, incluida la instalación del sistema operativo. Por esto, obtuve la fría respuesta de gente mandona con los ojos vendados de que no lo haremos porque costaría más en horas de trabajo configurarlo que comprar un dispositivo. Tener que aceptar a personas de mente estrecha como esta durante una parte de mi vida fue una cosa y pedí un poco de basura EATON de grado empresarial en Ebay y lo llamé, pero decidí en ese momento que para mi propia sala de servidores construiré un Arduino de código abierto completamente. dispositivo basado que será mucho mejor que lo que acabo de pedir.

Este proyecto tiene el nombre en código SilverLight, no me preguntes de dónde saqué estos nombres:) Acabo de mirar la caja de acrílico medio brillante y decidí con este nombre, no tiene nada que ver con el producto microhoof lo que descubrí después.

Paso 1: Diseño de hardware

Diseño de hardware
Diseño de hardware
Diseño de hardware
Diseño de hardware
Diseño de hardware
Diseño de hardware

Descripción general de hardware comercial.

Ok, ni siquiera comencé con cuya gran idea fue poner un monitor de entorno dentro de un ups, pero obviamente hay un mercado para ello, así que veamos qué pueden hacer estos:

Dispositivo de monitoreo ambiental COMPATIBILIDAD

La red 10 / 100Mb-MS, PXGUPS, PXGPDP y PXGMS.

ConnectUPS-X, ConnectUPS-BD y ConnectUPS-E de 10 / 100Mb con FW V3.01 y superior. DIMENSIONES (LXWXH)

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

1,19 onzas (34 g)

Esa es una información muy útil, ¿no? Aunque no se preocupe porque no pueden hacer mucho. Incluso para comenzar, su UPS necesitará tener otra tarjeta adicional costosa para esto que lo conecte con el sensor ambiental que compra por separado, generalmente con un cable CAT5 estándar (ni siquiera intente enchufar nada en ese puerto porque no hay nada estándar sobre eso). Afirman que el dispositivo necesita 10 minutos para "calentarse" que en realidad fueron horas y una vez que lo hizo, apareció en su interfaz Java que se actualizaba lentamente y tenemos temperatura y humedad. Configurar condiciones basadas en alertas fue fácil desde este punto, pero a quién le importa, construyamos algo mejor.

Este proyecto es una conjunción de varios de mis proyectos: la estación meteorológica de Natalia, Shadow of phoenix. La caja puede monitorear las siguientes limitaciones ambientales:

  • Índice de temperatura / humedad / calor
  • Concentraciones de GLP, humo, alcohol, propano, hidrógeno, metano y monóxido de carbono en el aire (MQ2)
  • Sensibilidad solar (¿está encendida la luz en la sala de servidores?)
  • Sensor PIR de movimiento (incluso puedes encender / apagar las luces automáticamente a partir de ahora gracias al sensor de movimiento cuando alguien entra en la habitación)

Todos estos datos se muestran muy bien en una pantalla LCD mientras que también se transmiten a una computadora (Orange PI Zero) para su posterior procesamiento y alertas. Aunque sería posible conectar sensores digitales como el DHT y el pin digital del MQ2 al OrangePI directamente, siempre prefiero usar micros dedicados para estas tareas y cuando necesite actualizar la pantalla LCD también y hacer otras de bajo nivel. cosas, el Arduino es simplemente inmejorable y puede funcionar de manera confiable sin parar durante muchos años (de hecho, ni un solo Arduino que funciona las 24 horas del día, los 7 días de la semana, me falló todavía). El OrangePI con sus deficiencias (seamos sinceros, es una computadora de $ 10) como inutilizable para una gran carga de trabajo, sin soporte bsd, wifi integrado está inflado, etc.puede manejar fácilmente una pequeña carga de trabajo como tomar lecturas de sensores a través de serie (USB) y procesarlas.

Este es un proyecto de hardware muy simple que requiere los siguientes componentes:

  • Arduino PRO Micro
  • Pantalla LCD 2x16 caracteres RGB
  • Módulo de alimentación del interruptor de aislamiento AC-DC 220V a 5V HLK-5M05 (estos son muy buenos para proyectos Arduino / ESP), ¡esta es la versión de 5V / 5W!
  • Resistencias 2x300ohm
  • 2xleds (rojo / verde)
  • Sensor de movimiento PIR
  • Sensor MQ2
  • DHT22
  • LDR
  • Resistencia 2X10Kohm
  • Zumbador
  • PI naranja cero
  • cable de datos mini USB

Ni siquiera me molesté en hacer una PCB para esto, solo usé una placa de pruebas normal porque los componentes se pueden conectar simplemente al Arduino (vea las imágenes adjuntas):

-DHT22 requerirá un pullup de 10K a VCC (digital)

-LDR requerirá un pulldown de 10K a GND (analógico)

-MQ2 se puede conectar directamente a cualquier pin analógico (analógico) <prefiero usar analógico porque ¿por qué no cuando tenemos un MCU con pines analógicos donde podemos obtener el valor exacto en lugar de ajustar algún potenciómetro en la parte posterior del dispositivo para obtener ALTO o BAJO, debido al pegado en mi diseño que es inaccesible de todos modos. Verificar:

-PIR se puede conectar directamente a cualquier pin (digital)

-LCD: se puede conducir con 4 pines, se puede conectar a cualquier pin (digital) necesitará +2 RS / E (digital)

-Buzzer: se puede conectar directamente a cualquier pin Arduino (digital)

El pinout que utilicé se puede ver en el código. Conectar todo después de esto es bastante sencillo, también puede hacerlo uno por uno, asegúrese de que 1 sensor funcione perfectamente y luego continúe con el siguiente, todo lo que puede equivocarse es conectar cables a lugares incorrectos (por ejemplo, intercambiar vcc / gnd para un sensor, hasta ahora esto nunca mató a ninguno de mis dispositivos). Lo que notaría aquí es que había demasiados VCC y GND apilados para mí, no podía apretarlos a través de una regleta de terminales, así que los soldé todos.

También sobre los DHT, no se olvide de mis otros proyectos: si coloca la biblioteca DHT en su código y el sensor DHT no está conectado o el DHT está conectado incorrectamente (por ejemplo, 11 definido en el código que está usando 22) eso puede llevar al programa colgar para siempre al principio.

Acerca de los sensores de detección de movimiento PIR, como puede ver en mi imagen, hay toneladas de falsificaciones falsas de estos, de hecho, incluso me resultaría difícil comprar uno genuino en Ebay. Las falsificaciones funcionan igual de bien, incluso a largo plazo, pero tienen su circuito reflejado, lo que hace que los pines + y - se inviertan, también son fáciles de reconocer por: vienen con PCB azul, no el verde habitual, faltan las etiquetas para los potenciómetros. Tuve la suerte de encontrar uno genuino en mi caja, de lo contrario, cambiar la posición cubriría los 2 leds para mí. He descubierto que ambas ollas giradas a la mitad funcionan para mí. Esto le dará un rango lo suficientemente largo para detectar también cuando hay movimiento, la pierna digital se mantendrá en la posición ALTA durante aproximadamente un minuto, por lo que no tiene que compensar el código para esto. En las falsificaciones es fácil determinar de qué lado está - y + basta con mirar las patas correspondientes para las tapas electrolíticas conectadas a los pines.

Para cortar la caja utilicé una cabeza dremel de diamante (que fue una exageración pero funcionó muy bien) y una máquina perforadora normal. Estas cajas de conexiones son fáciles de trabajar y, aunque no me gusta pegar, no tenía tornillos y pernos a mano cuando construí esto, así que tomé la ganga de pegar cosas juntas (que también se pueden recalentar y desmontar fácilmente más tarde usando el misma pistola de pegamento sin relleno).

Paso 2: Diseño de software

Diseño de software
Diseño de software
Diseño de software
Diseño de software

El código Arduino también es simple, básicamente extrae todas las lecturas del sensor al comienzo de cada ciclo. Enciende los LED si hay movimiento o humo y también reproduce un sonido de alarma en el timbre si hay humo (este es el único código de bloqueo, así que lo hice corto), luego muestra los datos en la pantalla LCD y finalmente los envía a la PC con un período de espera de 10 segundos, para no inundar el puerto.

Este proyecto utiliza una comunicación unidireccional de Arduino-> OrangePI, no hay comandos de ningún tipo implementados. Aunque esto sería perfectamente posible hacerlo como lo hice en uno de mis otros proyectos donde la computadora puede enviar LCD_PRINT1 o LCD_PRINT2 para sobrescribir una línea de la pantalla LCD con su propio mensaje (por ejemplo: dirección IP, tiempo de actividad, fecha del sistema, uso de la CPU), el área de la pantalla es tan pequeña para mostrar datos de 3 sensores que ni siquiera me molesté. Los valores SOL y SMK pueden subir hasta 4 dígitos 0000-1023 ocupando ya 8 caracteres valiosos en la pantalla.

Con la pantalla LCD puedes notar un pequeño truco en el código que después de cada valor medido se aplica una impresión de espacios en blanco (""), luego muevo el cursor a posiciones fijas para colocar los nuevos iconos y datos. Estos están ahí porque la pantalla LCD no es tan inteligente para entender los números, simplemente dibuja lo que obtiene y, por ejemplo, si tenía un valor solar de 525 que de repente disminuyó a 3, entonces mostrará 325 dejando la basura vieja en la pantalla. allí.

Un código de control C que se ejecuta en OrangePI y que registra los datos ambientales y envía alertas por correo electrónico cuando sea necesario.

OrangePI está ejecutando Armbian (que en el momento de escribir este artículo se basa en Debian Stretch). Incluiré esto en la parte del software con respecto a que fue un problema de cómo lo resolvió. Aquí está el consumo de energía promedio del dispositivo:

0.17 A - Solo Arduino + sensores

0.5-0.62 A - Arranque OrangePI

0.31 A - PI naranja en reposo

0.29 A - Orange PI apagado (realmente no se puede apagar, no tiene ACPI ni nada por el estilo)

0,60 A - Prueba de esfuerzo 100% de uso de CPU en 4 núcleos

Tenía este OrangePI en una caja desde hace mucho tiempo. Con el kernel antiguo, el dispositivo consumió tanta corriente (como el medidor decía que alcanzó un máximo de alrededor de 0,63 A) lo que la fuente de alimentación probablemente no pudo proporcionar que simplemente no arrancó, el proceso de arranque se atascó y los 2 leds de ethernet se encendieron constantemente y sin hacer nada.

Ahora, esto es un poco molesto ya que el HLK-5M05 afirma que puede hacer 5W en 5V, lo que le permite proporcionar 1 amperio, pero con estos dispositivos que salen de China, nunca se sabe, el pico de 0.63 A era mucho más bajo que el máximo nominal. valor. Así que estaba ejecutando pruebas de reinicio simples, a partir de 10 reinicios, el OrangePI solo se iniciaba dos veces con éxito, lo que casi me hizo descartarlo del proyecto ya que no me gusta el comportamiento inconsistente con errores en los circuitos. Entonces comencé a buscar en Google, tal vez haya una manera de reducir el consumo de energía en el momento del arranque desde el software (ya que solo era un problema en ese momento) y encontré un artículo que habla de modificar el script.bin, pero era para Orange PI PC y el faltaban archivos en el almacenamiento, así que como último recurso, hice la mágica "actualización de apt" para actualizar el firmware, el kernel y todo lo demás, con la esperanza de que se agote menos y el dispositivo pueda arrancar y:

Linux silverlight 4.14.18-sunxi # 24 SMP vie 9 de febrero 16:24:32 CET 2018 armv7l GNU / Linux

Linux silverlight 4.19.62-sunxi # 5.92 SMP Mié 31 de julio 22:07:23 CEST 2019 armv7l GNU / Linux

¡Funcionó! Lanzar hardware a un problema de software suele ser un problema para los desarrolladores de Java, pero en este caso hemos resuelto un problema de hardware con el software, qué gran éxito. He hecho como 20 pruebas de reinicio más, el dispositivo arrancó en cada caso. Aún así, notaría que la sobrecarga de energía al encender el Opi (conectar / desconectar) es tan grande que reiniciará el Arduino en cualquier momento (un reinicio simple solo hará parpadear la pantalla LCD pero no causará más problemas), pero este problema persiste oculto ya que los 2 se iniciarán juntos.

También he mirado los módulos del 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

¿Qué necesitamos realmente de estos? Ok, el pwr y el térmico pueden ser útiles, pero el sonido, el puerto serie, el wifi (el hardware ya está roto) no es necesario que todos estos se incluyan en la lista negra. También crearé un kernel personalizado con solo los módulos necesarios más adelante.

Lo que sí necesitamos y no está cargado por defecto es el CDC ACM para comunicarnos con el Arduino, habilítalo con:

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

Después de esto, ya puede probar la conexión con:

pantalla / dev / ttyACM0 9600

Debería ver los datos de estado que se envían cada 10 segundos.

Alertas y seguimiento

A partir de las alertas, solo puse llamadas al sistema () en el código de control C que recibe los datos de la serie, por lo que no se requieren herramientas externas. Algunas alertas de ejemplo:

- La temperatura supera los 30 C

- La humedad supera el 70% (no es saludable para los servidores)

- Movimiento detectado en la sala (esto puede ser molesto si continúa en su sala de servidores)

- Detección de humo o gas (las alertas de más de 100 se pueden tomar en serio, he jugado con este sensor y se enciende para muchas cosas, por ejemplo, la creación de humo junto al sensor con soldador resultó un poco más de 50 mientras fumaba un cigarrillo a continuación o subió a 500, incluso detectó gas de desodorante regular desde lejos)

Para mantener datos históricos, no me molesté en desarrollar una herramienta porque ¿por qué reinventar la rueda cuando tenemos excelentes marcos de monitoreo? Mostraré un ejemplo de cómo integrar esto en mi favorito personal, Zabbix:

apt-get install zabbix-agent

Agregar al final de: /etc/zabbix/zabbix_agentd.conf

UserParameter = silverlight.hum, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{imprimir $ 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}'

La ejecución de zabbix_agentd -p debería devolver ahora los valores adecuados:

silverlight.hum [t | 41]

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

El índice de calor, lo recopilo pero no veo ningún uso práctico de él, por lo que simplemente se registra. En el código de control C he implementado 2 funciones de registro, la primera registrará todos los datos en un formato fácil de usar:

[SILVERLIGHT] Datos recibidos en 2019-09-10 23:36:08 => Humedad: 44, Temp: 22, Hi: 25, Solar: 0, Movimiento: 0, Humo: 21

[SILVERLIGHT] Datos recibidos en 2019-09-10 23:36:18 => Humedad: 44, Temp: 22, Hi: 25, Solar: 0, Movimiento: 0, Humo: 21 [SILVERLIGHT] Datos recibidos en 2019-09 -10 23:36:29 => Humedad: 44, Temp: 22, Hi: 25, Solar: 0, Movimiento: 0, Humo: 22 [SILVERLIGHT] Datos recibidos en 2019-09-10 23:36:39 => Humedad: 44, temperatura: 22, alta: 25, solar: 0, movimiento: 0, humo: 21

El segundo:

void logger2 (char * text) {

ARCHIVO * f = fopen ("/ dev / shm / silverlight-zbx.log", "w"); if (f == NULL) {printf ("¡Error al abrir el archivo de registro de memoria! / n"); regreso; } fprintf (f, "% s", texto); fclose (f); regreso; }

Esto colocará un registro de 1 línea en la memoria (eliminará las operaciones rw innecesarias en la tarjeta sd) que siempre se sobrescribirá la próxima vez. Este registro solo contendrá las 6 columnas de datos y sin marca de tiempo, es fácilmente legible para Zabbix.

Como bono final: cómo programar el Arduino directamente desde el OrangePI para que no tenga que acercarse al dispositivo cada vez y enchufar su computadora portátil.

Hay 2 formas:

-Fácil: instale Arduino IDE completo y las bibliotecas usan algún escritorio remoto como X11 con reenvío, Xrdp, Xvnc, Nxserver, etc.

-Forma difícil: instale el IDE de Arduino y use la línea de comando

Lo haremos de la manera más difícil esta vez, ya que no me gusta instalar X11 en servidores. Para ello necesitará 6 componentes:

1, Arduino IDE para ARM de 32 bits ->

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

3, proyecto Arduino Makefile -> git clone

4, biblioteca DHT

5, definiciones de tablero Sparkfun

6, SilverLight.ino, código principal

Para que sea más fácil, he incluido los archivos necesarios para los últimos 4 puntos (sketchbook.tgz), por lo que solo necesitará los primeros 2

Primero, es mejor crear un usuario regular que tenga acceso rw al puerto USB:

adduser silver

usermod -a -G dialout plateado

SCP el sketchbook.tgz en el dispositivo en el directorio de inicio del usuario recién creado y extráigalo allí mismo:

cd / hogar / plata

tar xvzf sketchbook.tgz

Para comprender un poco lo que sucede debajo del capó cuando usa el IDE gráfico:

El flujo de trabajo de construcción de un boceto de Arduino cuando se usa el IDE de Arduino se describe en el sitio web de Arduino https://www.arduino.cc/en/Hacking/BuildProcess y con más detalle aquí: https://www.arduino.cc/ es / Hacking / BuildProcess

Generalmente, el proceso de compilación estándar de Arduino es:

Combine archivos.ino en el archivo de boceto principal. Transformación del archivo de boceto principal: agregue la instrucción #include; crear declaraciones de función (prototipos) de todas las funciones en el archivo de boceto principal; agregue el contenido del archivo main.cxx del destino al archivo de boceto principal. Compile el código en archivos objeto. Vincular los archivos de objeto para producir un archivo.hex listo para cargarlo en Arduino.

Hay algunas pequeñas diferencias entre el proceso de compilación estándar de Arduino y el proceso de compilación que utiliza Arduino-Makefile:

Solo se admite un archivo.ino. Las declaraciones de funciones no se crean automáticamente en el archivo.ino. El usuario debe encargarse de crear las declaraciones de función correctas.

El corazón del proceso de construcción es el Makefile. No te preocupes, todo está preparado para ti, es un poco más complicado compilar de esta manera para placas no estándar como la serie 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 include /home/silver/sketchbook/Arduino-

Y todo lo que necesita escribir es: make upload (que construirá los archivos.hex primero y luego usará avrdude para cargarlos), terminará con algo como:

mkdir -p build-promicro-16MHzatmega32U4

make reset make [1]: Entrar en el directorio '/ home / silver / sketchbook' / home / silver / sketchbook / Arduino-Makefile / bin / ard-reset-arduino --caterina / dev / ttyACM0 make [1]: Salir del directorio ' / home / silver / sketchbook 'make do_upload make [1]: Ingresando al directorio' / 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 al programador:. Programador encontrado: Id = "CATERIN"; tipo = S Versión de software = 1.0; No se ha proporcionado ninguna versión de hardware. El programador admite el incremento automático de direcciones. El programador admite el acceso a la memoria almacenada en búfer con un tamaño de búfer = 128 bytes. El programador admite los siguientes dispositivos: Código de dispositivo: 0x44 avrdude: dispositivo AVR inicializado y listo para aceptar instrucciones avrdude: firma del dispositivo = 0x1e9587 (probablemente m32u4) avrdude: lectura del archivo de entrada "build-promicro-16MHzatmega32U4 / sketchbook.hex" avrdude: escritura flash (11580 bytes): avrdude: 11580 bytes de flash escrito avrdude: safemode: Fusibles correctos (E: CB, H: D8, L: FF) avrdude hecho. Gracias.

Bueno, gracias avrdude, y ahora nuestro Arduino está reiniciado y programado con el nuevo código, lo que puede editar con vi o su editor favorito localmente, sin necesidad de IDE. Me gustaría señalar que debe cerrar tanto el programa de control C, la pantalla o cualquier otra cosa que acceda al arduino mientras se carga, de lo contrario, el puerto volverá como / dev / ttyACM1 después del reinicio.

Paso 3: Cierre y lista de tareas pendientes

Lista de cierres y tareas pendientes
Lista de cierres y tareas pendientes
Lista de cierres y tareas pendientes
Lista de cierres y tareas pendientes
Lista de cierres y tareas pendientes
Lista de cierres y tareas pendientes

Aunque creé esta caja de sensor ambiental para salas de servidores, puede usarla para laboratorios de química / electrónica, almacenes, salas normales y cualquier otra cosa. Y sí, dado que usa TCP / IP, es un dispositivo de IoT, G, debería haberlo puesto también en el título para hacerlo más emprendedor:)

Puede modificar fácilmente tanto el hardware como el software para poder encender también las luces de la habitación automáticamente. Eche un vistazo a mi otro proyecto: Shadow of phoenix, ¿cómo funciona eso para el control de la luz? Tiene todo el hardware a mano para hacer lo mismo (utiliza temporizadores de espera para mantener las luces encendidas siempre que se detecte movimiento dentro de un período de tiempo, si hay movimiento nuevamente, se aumentará el temporizador).

Con OrangePI ejecutando un Armbian de pila completa, las posibilidades son ilimitadas, puede crear una interfaz web local escrita desde cero en php para mostrar datos históricos en gráficos. ¿No es mejor que tenga un dispositivo completamente de código abierto que monitorea su sala de servidores, lo que puede estar orgulloso de construir, si lo cree, constrúyalo usted mismo?

Recomendado: