Control de cortina a través de la interfaz RS-485. Parte 2: agregar WiFi

Completamos la tarea mínima: probamos cómo funciona el motor AKKO AM72E a través de la interfaz RS485 . Ahora podemos controlar la luz solar enviando electrones a través de cables. El siguiente paso obvio es la transición del control con la ayuda de partículas elementales al control con la ayuda de vibraciones, es decir. ondas de radio Los hechizos que usaremos en este caso dependen de la magia que elijamos.
Cualquier tecnología inalámbrica sería adecuada para nuestros propósitos, pero quería controlar las cortinas desde mi teléfono inteligente. En este caso, es aconsejable no instalar ningún programa adicional. Me conectaré a la red WiFi de mi hogar y gestionaré la cortina eléctrica con un navegador. Conduzca, a través del adaptador RS485-UART me conectaré al ESP8266. Puede seguir su propio camino y usar, por ejemplo, un enrutador WiFi.

ESP-01 por hoy, es el módulo más económico con WiFi. Cuesta tan poco que si necesita controlar varios motores, no podemos tirar de los cables de un motor a otro, sino simplemente conectar cada uno a su propio módulo. En este caso, no necesitaremos dar a cada AM72E su propia dirección; puede comunicarse con la dirección ESP-01. Estamos interesados ​​en el ESP8266 no solo por su bajo precio y pequeño tamaño, sino también por el hecho de que tiene muy pocos recursos y requerirá mucho esfuerzo para lograr algo que funcione.
No describiré cómo conectar y actualizar el firmware ESP8266. Cómo hacer esto correctamente se puede encontrar aquí .
En Windows, para programar el ESP8266, puede usar el IDE de Arduino, y luego escribimos en C (bueno, casi) o NodeMcu, y puede escribir en Lua. También hay otras opciones, pero no nos convienen.
No, no tenemos prisa por subir NodeMcu. El firmware debe estar preparado. Los recursos en ESP-01 no son suficientes para que podamos olvidarnos de ellos si queremos crear un servidor web. Hay una ROM flash en el tablero, un lugar donde se almacenarán todos nuestros archivos, 512 KB. Esto ya es extremadamente pequeño, pero no descansaremos en la falta de recursos en flash, sino en RAM. El SoC ESP8266 tiene un área de RAM de 64 KB para el código del programa y 96 KB para los datos. Al inicio, los datos del flash se cargan en la RAM. Si llenamos el firmware de stock de NodeMcu y observamos la cantidad de memoria disponible, veremos esto:
imagen
21 kb! Con tales volúmenes, ¡tiene que guardar cada byte! También vemos algo de basura después de la línea "No se puede detectar automáticamente el firmware, porque no se recibió la respuesta correcta". Esta es información de depuración, emitida a una velocidad de 74,880, luego la velocidad cambia. Así es como se ve a la velocidad correcta:

nada interesante.
Primero, aumente la cantidad de RAM disponible. Para hacer esto significativamente, puede reconstruir el firmware usted mismo. Los códigos fuente están disponibles, pero no tiene ganas de palear todo el proyecto solo por probarlo. Además, esto tendrá que hacerse bajo Linux. No es que sea muy difícil, pero si estamos distraídos, nunca terminaremos. Puede ajustar el firmware aquí: frightanic.com/nodemcu-custom-build .
Cambié la casilla de verificación a dev096 y puse una marca de verificación adicional al lado de 1-ware en la ventana de selección de complementos. Encendí este módulo debido a una función: el cálculo CRC16. Aquí está:

usted, por supuesto, puede habilitar o deshabilitar los módulos que necesita. Ahora ingrese el correo electrónico en el formulario y haga clic en el botón "Verificar el estado de compilación". Un correo electrónico de una sola vez también está bien. Esperamos unos minutos y en una carta recibimos un enlace a los archivos con el firmware. El firmware en el que solo puede trabajar con enteros le ahorrará un destello con una docena de kilobytes. Yo serví este. Pero puedes hacer otra elección. Veamos por qué nos esforzamos tanto:

ahora tenemos 35 KB de RAM disponibles.
Antes de pasar a la programación, regresemos brevemente al adaptador UART-RS485. A la parte del mismo responsable del cambio de transmisión-recepción. A la resistencia R1. Al cargar, el ESP8266 establece todos los pines GPIO en el modo de entrada, y luego el programa determina en qué modo funcionará cada GPIO. Resultó que en el momento de la carga, el contacto TX_UART (U0TXD) debe estar en un nivel alto, de lo contrario, el programa grabado en flash no se iniciará. Sin R1, cuando se sondea un contacto TX, se leerá un nivel bajo y el ESP8266 se "colgará" hasta que se vuelva a conectar el adaptador.
Puede rechazar todo el esquema de conmutación de recepción-transmisión utilizando uno de los pines GPIO. Pero hay pocos GPIO disponibles en el ESP-01, y quizás encuentren otra aplicación en su proyecto. Además, con el esquema de conmutación, el adaptador que hicimos se puede usar, por ejemplo, con un enrutador que no tiene un GPIO.
El proyecto consta de tres archivos: data, index.html e init.lua. Es más correcto considerar esto no como un proyecto, sino como un prototipo. Por ejemplo, no hay autorización, excepto cuando está conectado a un enrutador. Y no estoy del todo seguro de que el servidor del ESP8266 sea capaz de resistir ataques. El código no se verifica de ninguna manera, excepto cuando está conectado, hay una conexión de red o ha desaparecido. No hay código que reinicie automáticamente el ESP8266 si el programa se congela. Las dos últimas tareas se resuelven fácilmente, pero el proyecto se habría vuelto más complicado.
Debe editar el archivo de datos: ingrese el nombre y la contraseña de su red WiFi allí. Al conectar el ESP8266 a la red, podremos controlar las cortinas a través de Internet. Después de finalizar la depuración init.lua, configure la variable de depuración en falso o elimínela por completo. Por lo tanto, se arrojará menos basura en UART. Si esto no se hace, es posible que la unidad no funcione. Además, AKKO AM72E aún no podrá entender lo que le está escribiendo. En este caso, la función de registro y todas las líneas en las que se menciona en init.lua también se pueden eliminar.
Volvamos al tema del ahorro de recursos. El archivo de datos, con mi nombre de red y contraseña, ocupa 1643 bytes en la memoria. Si aún no lo ha adivinado, entonces este archivo es un archivo lua normal. Se puede compilar. Después de la compilación, el mismo archivo ya ocupa 1040 bytes. Puedes hacer lo mismo con init.lua. El tamaño del archivo puede reducirse aún más. Es necesario descartar todo lo superfluo, en primer lugar, comentarios y espacios. El archivo se vuelve poco legible, pero si necesitamos más espacio, tenemos que buscarlo. Esta es una práctica común. Al final, nadie apreciará el diseño hermoso y correcto de su código. Bueno, tal vez competidores cuando tu código llegue a ellos. Pero la funcionalidad truncada se notará de inmediato. Especialmente si hay algo para comparar. Cuando se programan dispositivos con pocos recursos, las prioridades cambian. Esto es a menudo por qué los programasescrito en C para sistemas embebidos son poco legibles. Todo se complica cambiando todo lo posible al preprocesador. Si comienza un proyecto en C y lo pospone durante un par de meses, es posible que necesite un tiempo decente para descubrir su propio código. Se presta menos atención al mantenimiento del código, ya que En tres o cinco años, aparece un nuevo hierro y todo tiene que ser reescrito nuevamente debido a la nueva arquitectura.
Después de eliminar manualmente todo lo innecesario del archivo de datos, comenzó a ocupar 705 bytes. Al mismo tiempo, el tamaño aún puede reducirse en varias decenas de bytes, si las variables reciben nombres no significativos, sino nombres de una letra (sí, sí, esto no es lo que se nos enseña en la escuela). Después de compilarlo, el archivo data.lc ocupa 728 bytes en flash. ¡Vaya! ¡Incluso sucede!
No hay mucho que decir sobre index.htm. También le agregué una imagen en formato svg. Tú también puedes hacerlo. Simplemente llene curtain.svg en el flash con otro archivo.
Init.lua: el archivo principal del proyecto. Hay comentarios en el archivo mismo y si algo no está claro, puede comenzar la ejecución línea por línea y, en general, experimentar hasta que se aclare por completo. Además de UARTA, todavía hay LED de conmutación conectados a GPIO2. Los archivos cuando los carga el servidor se leen desde la memoria flash y se transfieren en bloques de 512 bytes. Esto reduce los requisitos de tamaño de la RAM disponible.
Esto no está en el código, pero si se hace necesario calcular CRC16, entonces se hace con el comando ow.crc16 (buf, crc). Por ejemplo, si escribe:
= ow.crc16 ('\ 85 \ 00 \ 00 \ 03 \ 01', 0xFFFF) en la línea de comando, obtenemos
:
15593
Solo necesita recordar, envíe primero el byte bajo y luego el alto.
Esto es lo que sucedió al final:
debería haber un video)

Source: https://habr.com/ru/post/es387983/


All Articles