
Artículo sobre cómo convertir un dispositivo chino barato en un controlador lógico programable. Este dispositivo encontrará aplicación tanto en la automatización doméstica como en actividades prácticas de informática escolar.
Para su información, por defecto, 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 la interacción posterior con este dispositivo será posible a través del navegador.
Sección I. Conexión de Sonoff al servicio MGT24
Paso 1. Creación del panel de control
Regístrese en el sitio web (si aún no está registrado) e inicie sesión con su cuenta.
Inicio de sesión
Para crear un panel de control para el nuevo dispositivo, haga clic en el botón «+».
Ejemplo de creación de panel
Después de que el panel sea creado, aparecerá en la lista de sus paneles.
En la pestaña «Instalación» del panel creado, encuentre los campos «ID del dispositivo» y «Clave de autorización», esta información será necesaria más adelante para la configuración del dispositivo Sonoff.
Ejemplo de pestaña
Paso 2. Reprogramación del dispositivo
Con la utilidad cargue el firmware en el dispositivo, para ello necesitará un convertidor USB-TTL. Aquí y .
Paso 3. Configuración del dispositivo
Conecte el dispositivo a la alimentación, después de que el LED se encienda, presione el botón y manténgalo presionado hasta que el LED comience a parpadear de manera uniforme y periódica.
En este momento aparecerá una nueva red Wi-Fi llamada «PLC Sonoff Basic», conecte su computadora a esta red.
Interpretación de la indicación del LED
Indicación del LED
Estado del dispositivo
parpadeo doble periódico
sin conexión con el enrutador
se mantiene encendido
conexión establecida con el enrutador
parpadeo uniforme periódico
modo de punto de acceso Wi-Fi
apagado
sin alimentación
Abra un navegador de Internet e introduzca en la barra de direcciones el texto «192.168.4.1», acceda a la página de configuración de parámetros de red del dispositivo.
Rellene los campos de la siguiente manera:
- «Nombre de la red» y «Contraseña» (para vincular el dispositivo al enrutador Wi-Fi doméstico).
- «ID del dispositivo» y «Clave de autorización» (para la autorización del 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í .
Paso 4. Conexión de sensores (opcional)
El firmware actual admite hasta cuatro sensores de temperatura ds18b20. Aquí hay información sobre la instalación de los sensores. Este paso puede ser el más complicado, ya que requerirá de destreza manual y un soldador.
Sección II. Programación visual
Paso 1. Creación de guiones
Se utiliza como entorno de programación , un entorno que es fácil de aprender, por lo que no es necesario ser programador para crear guiones simples.
He añadido bloques especializados para leer y escribir los parámetros del dispositivo. El acceso a cualquier parámetro se realiza por su nombre. Para los parámetros de dispositivos remotos se utilizan nombres compuestos: «parámetro@dispositivo».
Lista desplegable de parámetros
Ejemplo de un guion de encendido y apagado cíclico de carga (1 Hz):

Ejemplo de un guion que sincroniza el funcionamiento de dos dispositivos separados. Es decir, el relé del dispositivo objetivo repite el funcionamiento del relé del dispositivo remoto.

Guion para un termostato (sin histéresis):

Para crear guiones más complejos, se pueden utilizar variables, ciclos, funciones (con argumentos) y otras construcciones. No detallaré todo esto aquí, ya que hay bastante .
Paso 2. Orden de ejecución de los guiones
El guion se ejecuta de manera continua, y una vez que llega a su final, se reinicia. Hay dos bloques que pueden interrumpir temporalmente la ejecución del guion: «delay» y «pause».
El bloque «delay» se utiliza para retrasos en milisegundos o microsegundos. Este bloque mantiene estrictamente el intervalo de tiempo, bloqueando el funcionamiento de todo el dispositivo.
El bloque «pause» se utiliza para retrasos en segundos (o menos), y no bloquea la ejecución de otros procesos en el dispositivo.
Si el guion contiene un bucle infinito sin un «pause» dentro, el intérprete iniciará automáticamente una pequeña pausa.
En caso de agotarse la pila de memoria asignada, el intérprete detendrá la ejecución de tal guion voraz (ten cuidado con las funciones recursivas).
Paso 3. Depuración de guiones
Para depurar un script ya cargado en el dispositivo, se puede iniciar la trazabilidad del programa paso a paso. Esto es extremadamente útil cuando el comportamiento del script resulta ser diferente de lo que el autor pensó. En este caso, la trazabilidad permite al autor encontrar rápidamente la fuente del problema y corregir el error en el script.
Script para calcular el 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» (sin olvidar «entrada» y «salida» del modo de depuración). Además de la trazabilidad paso a paso, se puede establecer un punto de interrupción en cualquier bloque (haciendo clic con el ratón sobre el bloque).
Para mostrar en el monitor los valores actuales de los parámetros (sensores, relés), utilice el bloque «print».
Aquí sobre el uso del depurador.
Sección para los curiosos. ¿Qué hay debajo del capó?
Para que los scripts funcionen en el dispositivo de destino, se desarrolló un intérprete de bytecode y un ensamblador con 38 instrucciones. En el código fuente de blockly se integró un generador de código especializado que convierte bloques visuales en instrucciones de ensamblador. Posteriormente, este programa ensamblador se transforma en bytecode y se envía al dispositivo para su ejecución.
La arquitectura de esta máquina virtual es bastante simple y no tiene demasiado sentido describirla; en la red encontrará muchos artículos sobre el diseño de máquinas virtuales simples.
Normalmente asigno 1000 bytes para el stack de mi máquina virtual, lo cual es más que suficiente. Por supuesto, las recursiones profundas pueden agotar cualquier stack, pero difícilmente tendrán una aplicación práctica.
El bytecode final resulta ser bastante compacto. Como ejemplo, el bytecode para calcular el mismo factorial consta de solo 49 bytes. Esta es su forma visual de presentación:

Y este es su programa en 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 presentación en ensamblador no tiene un valor práctico, por el contrario, la pestaña «javascrit» ofrece 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));
En cuanto al rendimiento. Al ejecutar un simple script de parpadeo, obtuve una onda cuadrada de 47 kHz en la pantalla del osciloscopio (con una frecuencia de reloj del procesador de 80 MHz).


Considero que es un buen resultado, al menos esta velocidad es casi diez veces más rápida que la de y .
Parte final
En resumen, diré que el uso de scripts no solo nos permite programar la lógica de funcionamiento de un dispositivo individual, sino que también brinda la posibilidad de conectar varios dispositivos en un solo mecanismo, donde unos dispositivos influyen en el comportamiento de otros.
También señalaré que el método elegido para almacenar los scripts (directamente en los dispositivos y no en el servidor) simplifica el cambio de dispositivos ya en funcionamiento a otro servidor, como un Raspberry en casa, aquí .
Eso es todo, estaré encantado de escuchar consejos y críticas constructivas.
Fuente: habr.com
