Un artículo sobre cómo crear un controlador lógico programable a partir de un dispositivo chino económico. Un dispositivo de este tipo se utilizará tanto en la automatización del hogar como en las clases prácticas de informática escolar.
Como referencia, de forma predeterminada el programa Sonoff Basic funciona con una aplicación móvil a través de un 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 al servicio MGT24
Paso 1: crea un panel de control
Registrarse en el sitio
Ingresar al sistema
Para crear un panel de control para un nuevo dispositivo, haga clic en el botón “+”.
Ejemplo de creación de un panel.
Una vez creado el panel, aparecerá en su lista de paneles.
En la pestaña "Configuración" del panel creado, busque los campos "ID del dispositivo" y "Clave de autorización", en el futuro, esta información será necesaria al configurar el dispositivo Sonoff.
Ejemplo de pestaña
Paso 2. Actualiza el dispositivo
Usando la utilidad
Paso 3. Configuración del dispositivo
Aplique energía al dispositivo, después de que el LED se encienda, presione el botón y manténgalo presionado hasta que el LED comience a parpadear periódicamente de manera uniforme.
En este momento aparecerá una nueva red wifi llamada “PLC Sonoff Basic”, conecta tu ordenador a esta red.
Explicación de la indicación LED
indicación LED
Estado del dispositivo
doble parpadeo periódico
sin conexión al enrutador
brilla continuamente
conexión establecida con el enrutador
parpadeo uniforme periódico
modo punto de acceso wifi
extinguido
Sin fuente de alimentació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 wifi de su hogar).
- “ID del 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.
es
Paso 4. Conexión de sensores (opcional)
El firmware actual admite hasta cuatro sensores de temperatura ds18b20. Aquí
Sección II. programación visual
Paso 1: crear guiones
Utilizado como entorno de programación.
Agregué bloques especializados para escribir y leer parámetros del dispositivo. Se accede a cualquier parámetro por nombre. Para los parámetros de dispositivos remotos, se utilizan nombres compuestos: “parámetro@dispositivo”.
Lista desplegable de opciones
Escenario de ejemplo para encendido y apagado cíclico de la carga (1 Hz):
Un ejemplo de un script que sincroniza el funcionamiento de dos dispositivos separados. Es decir, el relé del dispositivo objetivo repite la operación del relé del dispositivo remoto.
Escenario para termostato (sin histéresis):
Para crear scripts más complejos, puede utilizar variables, bucles, funciones (con argumentos) y otras construcciones. No describiré todo esto en detalle aquí; ya hay bastante en la red.
Paso 2: Orden de los guiones
El script se ejecuta continuamente y, tan pronto como llega a su fin, comienza de nuevo. En este caso, existen dos bloques que pueden pausar temporalmente el script, “retrasar” y “pausar”.
El bloque "retraso" se utiliza para retrasos de milisegundos o microsegundos. Este bloque mantiene estrictamente el intervalo de tiempo, bloqueando el funcionamiento de todo el dispositivo.
El bloque de “pausa” se utiliza para retrasos de segundos (o menos) y no bloquea la ejecución de otros procesos en el dispositivo.
Si el guión en sí contiene un bucle infinito, cuyo cuerpo no contiene "pausa", el intérprete inicia de forma independiente una breve pausa.
Si la pila de memoria asignada se agota, el intérprete dejará de ejecutar un script que consume tanta energía (tenga cuidado con las funciones recursivas).
Paso 3: depurar scripts
Para depurar un script que ya se ha cargado en el dispositivo, puede ejecutar un seguimiento del programa paso a paso. Esto puede resultar extremadamente útil cuando el comportamiento del guión resultó ser diferente al previsto por el autor. En este caso, el rastreo permite al autor encontrar rápidamente el origen del problema y corregir el error en el script.
Escenario para calcular factorial en modo de depuración:
La herramienta de depuración es muy simple y consta de tres botones principales: "iniciar", "un paso adelante" y "detener" (tampoco nos olvidemos del modo de depuración "entrar" y "salir"). Además del seguimiento paso a paso, puede establecer un punto de interrupción en cualquier bloque (haciendo clic en el bloque).
Para mostrar los valores actuales de los parámetros (sensores, relés) en el monitor, utilice el bloque "imprimir".
es
Sección para curiosos. ¿Qué hay debajo del capó?
Para que los scripts funcionen en el dispositivo de destino, se desarrolló un intérprete de código de bytes y un ensamblador con 38 instrucciones. El código fuente de Blockly tiene integrado un generador de código especializado que convierte bloques visuales en instrucciones de ensamblaje. Posteriormente, este programa ensamblador se convierte en código de bytes 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 Internet encontrará muchos artículos sobre el diseño de las máquinas virtuales más simples.
Normalmente asigno 1000 bytes para la pila de mi máquina virtual, que es suficiente de sobra. Por supuesto, las recursiones profundas pueden agotar cualquier pila, pero es poco probable que tengan algún uso práctico.
El código de bytes resultante es bastante compacto. Como ejemplo, el código de bytes para calcular el mismo factorial es de solo 49 bytes. Esta es su forma visual:
Y este es su programa 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 ensamblada no tiene ningún valor práctico, entonces la pestaña "javascrit", por el contrario, da una apariencia más familiar que los bloques visuales:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Respecto al rendimiento. Cuando ejecuté el script de flasheo más simple, obtuve una onda cuadrada de 47 kHz en la pantalla del osciloscopio (a una velocidad de reloj del procesador de 80 MHz).
Creo que este es un buen resultado, al menos esta velocidad es casi diez veces más rápida que
Parte final
En resumen, diré que el uso de scripts nos permite no solo programar la lógica de funcionamiento de un dispositivo separado, sino que también permite conectar varios dispositivos en un solo mecanismo, donde algunos dispositivos influyen en el comportamiento de otros.
También observo que el método elegido para almacenar scripts (directamente en los dispositivos y no en el servidor) simplifica el cambio de dispositivos que ya funcionan a otro servidor, por ejemplo a una Raspberry doméstica, aquí
Eso es todo, estaré encantado de escuchar consejos y críticas constructivas.
Fuente: habr.com