
Articolo su come trasformare un dispositivo cinese economico in un controllore logico programmabile. Tale dispositivo troverà applicazione sia nell'automazione domestica che come attività pratiche per l'informatica scolastica.
Per riferimento, di default il programma Sonoff Basic funziona con un'app mobile tramite un servizio cloud cinese; dopo la modifica proposta, tutte le ulteriori interazioni con questo dispositivo saranno possibili tramite browser.
Sezione I. Collegamento di Sonoff al servizio MGT24
Passo 1. Creazione del pannello di controllo
Registrati sul sito (se non sei ancora registrato) e accedi con il tuo account.
Accesso al sistema
Per creare un pannello di controllo per un nuovo dispositivo, clicca sul pulsante «+».
Esempio di creazione del pannello
Una volta creato, il pannello apparirà nell'elenco dei tuoi pannelli.
Nella scheda «Installazione» del pannello creato, trova i campi «ID dispositivo» e «Chiave di autorizzazione»; queste informazioni saranno necessarie per configurare il dispositivo Sonoff.
Esempio di scheda
Passo 2. Flashing del dispositivo
Utilizza l'utility per caricare il firmware sul dispositivo; per farlo avrai bisogno di un convertitore USB-TTL. Qui e .
Passo 3. Configurazione del dispositivo
Collega il dispositivo all'alimentazione; una volta accesa la luce LED, premi e tieni premuto il pulsante finché il LED non inizia a lampeggiare uniformemente e periodicamente.
A questo punto apparirà una nuova rete wi-fi chiamata «PLC Sonoff Basic», collegati a questa rete con il tuo computer.
Decodifica dell'indicazione LED
Indicazione LED
Stato del dispositivo
lampeggiamento doppio periodico
nessuna connessione al router
luminosità continua
connessione al router stabilita
lampeggiamento uniforme e periodico
modalità punto di accesso wi-fi
spento
senza alimentazione
Apri il browser internet e inserisci nella barra degli indirizzi il testo «192.168.4.1»; vai alla pagina delle impostazioni dei parametri di rete del dispositivo.
Compila i campi come segue:
- «Nome rete» e «Password» (per collegare il dispositivo al router wi-fi domestico).
- «ID dispositivo» e «Chiave di autorizzazione» (per l'autenticazione del dispositivo presso il servizio MGT24).
Esempio di impostazione dei parametri di rete del dispositivo
Salva le impostazioni e riavvia il dispositivo.
Qui .
Passo 4. Collegamento dei sensori (opzionale)
Il firmware attuale supporta fino a quattro sensori di temperatura ds18b20. Qui sull'installazione dei sensori. A quanto pare, questo passaggio sarà il più difficile, poiché richiederà dalle tue mani abilità dirette e un saldatore.
Sezione II. Programmazione visiva
Passo 1. Creazione degli script
Come ambiente di programmazione viene utilizzato , l'ambiente è semplice da usare, quindi non è necessario essere un programmatore per creare semplici script.
Ho aggiunto blocchi specializzati per scrivere e leggere i parametri del dispositivo. L'accesso a qualsiasi parametro avviene per nome. Per i parametri dei dispositivi remoti si utilizzano nomi composti: «parametro@dispositivo».
Elenco a discesa dei parametri
Esempio di script per l'accensione e lo spegnimento ciclico di un carico (1Hz):

Esempio di script che sincronizza il funzionamento di due dispositivi separati. In particolare, il relè del dispositivo target replica il funzionamento del relè del dispositivo remoto.

Script per il termostato (senza isteresi):

Per creare script più complessi, è possibile utilizzare variabili, cicli, funzioni (con argomenti) e altre costrutti. Non elencherò tutto in dettaglio qui, poiché ci sono già molte .
Passo 2. Ordine di esecuzione degli script
Lo script opera in modalità continua e, una volta raggiunta la fine, si riavvia. Ci sono due blocchi che possono temporaneamente sospendere l'esecuzione dello script, «delay» e «pause».
Il blocco «delay» viene utilizzato per ritardi in millisecondi o microsecondi. Questo blocco mantiene rigorosamente l'intervallo di tempo bloccando l'operazione dell'intero dispositivo.
Il blocco «pause» viene utilizzato per ritardi in secondi (o meno) e non blocca l'esecuzione di altri processi nel dispositivo.
Se lo script contiene al suo interno un ciclo infinito senza un «pause», l'interprete inizia autonomamente una piccola pausa.
In caso di esaurimento dello stack di memoria allocato, l'interprete fermerà l'esecuzione di uno script così vorace (fai attenzione alle funzioni ricorsive).
Passo 3. Debugging degli script
Per il debug di uno script già caricato nel dispositivo, è possibile eseguire il tracciamento del programma passo dopo passo. Questo è estremamente utile quando il comportamento dello script risulta diverso da quello previsto dall'autore. In questo caso, il tracciamento permette all'autore di trovare rapidamente la fonte del problema e correggere l'errore nello script.
Script di calcolo del fattoriale in modalità debug:

Lo strumento di debug è molto semplice e consiste in tre principali pulsanti: «avvio», «passo avanti» e «ferma» (senza dimenticare «ingresso» e «uscita» dalla modalità di debug). Oltre al tracciamento passo-passo, è possibile impostare un punto di interruzione su qualsiasi blocco (cliccando con il mouse sul blocco).
Per visualizzare sul monitor i valori correnti dei parametri (sensori, relè) utilizzare il blocco «print».
Qui sull'uso del debugger.
Sezione per i curiosi. Ma cosa c'è sotto il cofano?
Per far funzionare gli script sul dispositivo di destinazione è stato sviluppato un interprete di bytecode e un assembler con 38 istruzioni. Nel codice sorgente di blockly è stato integrato un generatore di codice specializzato, che converte i blocchi visuali in istruzioni assembler. Successivamente, questo programma assembler viene trasformato in bytecode e inviato al dispositivo per l'esecuzione.
L'architettura di questa macchina virtuale è piuttosto semplice e non ha molto senso descriverla, in rete troverete molti articoli sul progetto delle macchine virtuali più semplici.
Per lo stack della mia macchina virtuale di solito riservo 1000 byte, che sono più che sufficienti. Certamente, chiamate ricorsive profonde possono esaurire qualsiasi stack, ma è poco probabile che trovino un'applicazione pratica.
Il bytecode finale risulta piuttosto compatto. Come esempio, il bytecode per il calcolo dello stesso fattoriale è di soli 49 byte. Questa è la sua forma di rappresentazione visiva:

E questa è la sua programma assembler:
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
Se la forma di rappresentazione assembler non ha alcun valore pratico, la scheda «javascript», al contrario, offre un aspetto più familiare rispetto ai blocchi visuali:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Per quanto riguarda le prestazioni. Eseguendo il più semplice degli scenari lampeggianti, sullo schermo dell'oscilloscopio ho ottenuto un meandro di 47kHz (con una frequenza di clock del processore di 80MHz).


Ritengo che sia un buon risultato, almeno questa velocità è quasi dieci volte più veloce di e .
Parte conclusiva
In sintesi, posso dire che l'uso di scenari ci consente non solo di programmare la logica di funzionamento di un singolo dispositivo, ma offre anche la possibilità di collegare più dispositivi in un unico meccanismo, dove alcuni dispositivi influenzano il comportamento di altri.
Inoltre, segnalo che il metodo scelto per memorizzare gli scenari (direttamente nei dispositivi stessi, e non su un server), semplifica il passaggio di dispositivi già funzionanti a un altro server, ad esempio a un Raspberry domestico, qui .
Questo è tutto, sarei felice di ricevere consigli e critiche costruttive.
Fonte: habr.com
