
Un artículo sobre cómo crear un controlador lógico programable desde un dispositivo chino barato. Tal dispositivo encontrará su aplicación tanto en domótica como como una lección práctica en informática de la escuela.
Como referencia, de forma predeterminada, el programa Sonoff Basic funciona con la aplicación móvil a través del servicio en la nube chino, después de la modificación propuesta, toda interacción adicional con este dispositivo será posible en el navegador.Sección I. Conexión de Sonoff a MGT24
Paso 1. Crear un panel de control
Regístrese en el
sitio web
mgt24 (si aún no se ha registrado) e inicie sesión con su cuenta.
Para crear un panel de control para un nuevo dispositivo, haga clic en el botón "+".
Ejemplo de creación de panel Una vez creado el panel, aparecerá en la lista de sus paneles.
En la pestaña "Configuración" del panel creado, busque los campos "ID de dispositivo" y "Clave de autorización"; en el futuro, esta información será necesaria al configurar el dispositivo Sonoff.
Paso 2. Destellando el dispositivo
Usando la utilidad
XTCOM_UTIL, descargue el firmware
Sonoff Basic PLC al dispositivo, para esto necesita un convertidor USB-TTL. Aquí están las
instrucciones y
las instrucciones en video .
Paso 3. Configurar el dispositivo
Aplique energía al dispositivo, después de que se encienda el LED, presione el botón y manténgalo presionado hasta que el LED comience a parpadear periódicamente de manera uniforme.
En este punto, aparecerá una nueva red wi-fi llamada "PLC Sonoff Basic", conecte su computadora a esta red.
Indicación LED de decodificación Abra un navegador de Internet e ingrese el texto "192.168.4.1" en la barra de direcciones, vaya a la página de configuración de red del dispositivo.
Complete los campos de la siguiente manera:
- "Nombre de red" y "Contraseña" (para vincular el dispositivo al enrutador wi-fi de su hogar).
- "ID de dispositivo" y "Clave de autorización" (para autorizar el dispositivo en el servicio MGT24).
Ejemplo de configuración de parámetros de red del dispositivo Guarde la configuración y reinicie el dispositivo.
Aquí hay un
video tutorial .
Paso 4. Conexión de sensores (opcional)
El firmware actual admite hasta cuatro sensores de temperatura ds18b20. Aquí hay un
video tutorial sobre el montaje de sensores. Aparentemente, este paso será el más difícil, ya que requerirá manos directas y un soldador.
Sección II Programación visual
Paso 1. Scripting
Blockly se usa como entorno de programación, el entorno es fácil de aprender, por lo que no es necesario ser un programador para crear scripts simples.
Agregué bloques especializados para escribir y leer los parámetros del dispositivo. El acceso a cualquier parámetro se realiza por nombre. Los nombres compuestos se utilizan para los parámetros del dispositivo remoto: "parámetro @ dispositivo".
Lista desplegable de opciones Un ejemplo de un escenario de encendido y apagado cíclico de la carga (1Hz):

Un escenario de ejemplo que sincroniza la operación de dos dispositivos separados. A saber, el relé del dispositivo de destino repite la operación del relé del dispositivo remoto.

Escenario para termostato (sin histéresis):

Para crear scripts más complejos, puede usar variables, bucles, funciones (con argumentos) y otras construcciones. No describiré todo esto en detalle aquí, la red ya tiene bastante
material de
capacitación sobre Blockly .
Paso 2. Orden de secuencias de comandos
La secuencia de comandos se ejecuta continuamente y, tan pronto como llega a su fin, comienza de nuevo. Hay dos bloques que pueden suspender temporalmente el script, "delay" y "pause".
El bloque de demora se usa para demoras de milisegundos o microsegundos. Esta unidad mantiene estrictamente el intervalo de tiempo, bloqueando la operación de todo el dispositivo.
El bloqueo de pausa se usa para segundos (quizás menos) retrasos, y no bloquea la ejecución de otros procesos en el dispositivo.
Si el script dentro de sí mismo contiene un bucle infinito, en el cuerpo del cual no hay "pausa", el intérprete inicia independientemente una pequeña pausa.
Si la pila de memoria asignada se agota, el intérprete detendrá la ejecución de un guión tan voraz (tenga cuidado con las funciones recursivas).
Paso 3. Depuración de scripts
Para depurar una secuencia de comandos ya cargada en el dispositivo, puede ejecutar el seguimiento del programa en pasos. Esto puede ser extremadamente útil cuando el comportamiento del script no es el que pretendía el autor. En este caso, el rastreo le permite al autor encontrar rápidamente la fuente del problema y corregir el error en el script.
El script para calcular factorial en modo de depuración:

La herramienta de depuración es muy simple y consta de tres botones principales: "inicio", "un paso adelante" y "detener" (tampoco nos olvidaremos de "entrar" y "salir" del modo de depuración). Además del rastreo paso a paso, puede establecer un punto de interrupción en cualquier bloque (haciendo clic en el bloque).
Para visualizar los valores actuales de los parámetros (sensores, relés) en el monitor, use el bloque de impresión.
Aquí hay un
video general sobre el uso del depurador.
Sección para los curiosos. ¿Pero qué hay debajo del capó?
Para que los scripts funcionen en el dispositivo de destino, se desarrollaron un intérprete de código de bytes y un ensamblador para 38 instrucciones. Se incorporó un generador de código especializado en el código fuente bloqueado que convierte los bloques visuales en instrucciones de ensamblador. En el futuro, este programa ensamblador se convierte en bytecode y se transfiere al dispositivo para su ejecución.
La arquitectura de esta máquina virtual es bastante simple y no tiene sentido describirla; en la red encontrará muchos artículos sobre el diseño de máquinas virtuales simples.
Para la pila de mi máquina virtual, generalmente asigno 1000 bytes, esto es suficiente con un margen. Por supuesto, las recursiones profundas pueden agotar cualquier pila, pero es poco probable que encuentren una aplicación práctica.
El bytecode resultante es bastante compacto. Como ejemplo, el código de bytes para calcular el mismo factorial es de solo 49 bytes. Esta es su presentación visual:

Y este es su programa de ensamblador:
shift -1 ldi 10 call factorial, 1 print exit :factorial ld_arg 0 ldi 1 gt je 8 ld_arg 0 ld_arg 0 ldi 1 sub call factorial, 1 mul ret ldi 1 ret
Si la forma de representación del ensamblador no tiene ningún valor práctico, la pestaña javascrit, por el contrario, le da un aspecto más familiar que los bloques visuales:
function factorial(num) { if (num > 1) { return num * factorial(num - 1); } return 1; } window.alert(factorial(10));
En cuanto a rendimiento. Cuando comencé el escenario de flasheo más simple, en la pantalla del osciloscopio obtuve un meandro de 47kHz (a una velocidad de reloj del procesador de 80MHz).


Creo que este es un buen resultado, al menos esta velocidad es casi diez veces más rápida que la de
Lua y
Espruino .
La parte final
En resumen, diré que el uso de scripts nos permite no solo programar la lógica de un dispositivo individual, sino que también permite vincular varios dispositivos en un solo mecanismo, donde algunos dispositivos influyen en el comportamiento de otros.
También noto que el método elegido para almacenar scripts (directamente en los dispositivos mismos, y no en el servidor), simplifica el cambio de dispositivos existentes a otro servidor, por ejemplo, a la Raspberry casera, aquí están las
instrucciones .
Eso es todo, estaré encantado de escuchar consejos y críticas constructivas.