
Articolo su come trasformare un dispositivo cinese economico in un controllore logico programmabile. Questo dispositivo troverà applicazione sia nell'automazione domestica che come attività pratiche per l'informatica scolastica.
Per riferimento, per impostazione predefinita il programma Sonoff Basic funziona con un'app mobile tramite il servizio cloud cinese; dopo la modifica proposta, tutte le interazioni con questo dispositivo saranno possibili nel browser.
Sezione I. Collegamento del Sonoff al servizio MGT24
Passaggio 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 il nuovo dispositivo, fai clic sul pulsante "+".
Esempio di creazione del pannello
Dopo che il pannello è stato creato, 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 durante la configurazione del dispositivo Sonoff.
Esempio di scheda
Passaggio 2. Flashing del dispositivo
Utilizzando l'utility carica il firmware per il dispositivo, avrete bisogno di un convertitore USB-TTL. Qui e .
Passo 3. Configurazione del dispositivo
Collegate l'alimentazione al dispositivo, dopo che il LED si accende, premete il pulsante e tenetelo premuto fino a quando il LED inizia a lampeggiare in modo uniforme.
A questo punto apparirà una nuova rete wi-fi chiamata «PLC Sonoff Basic», collegate il vostro computer a questa rete.
Decodifica dell'indicazione a LED
Indicazione a LED
Stato del dispositivo
lampeggio doppio periodico
nessuna connessione al router
illuminazione continua
connessione stabilita con il router
lampeggio uniforme periodico
modalità access point wi-fi
spento
senza alimentazione
Aprite il browser internet e inserite nella barra degli indirizzi il testo «192.168.4.1», quindi andate alla pagina delle impostazioni della rete del dispositivo.
Compilate i campi come segue:
- «Nome della rete» e «Password» (per collegare il dispositivo al router wi-fi domestico).
- «ID dispositivo» e «Chiave di autorizzazione» (per autorizzare il dispositivo al servizio MGT24).
Esempio di configurazione delle impostazioni della rete del dispositivo
Salvate le impostazioni e riavviate il dispositivo.
Qui .
Passo 4. Collegamento dei sensori (opzionale)
Il firmware attuale supporta fino a quattro sensori di temperatura ds18b20. Qui per il montaggio dei sensori. Questo passaggio sarà probabilmente il più complesso, poiché richiederà abilità manuali e un saldatore.
Sezione II. Programmazione visiva
Passo 1. Creazione degli scenari
Come ambiente di programmazione viene utilizzato , un ambiente semplice da apprendere, quindi non è necessario essere programmatori per creare scenari semplici.
Ho aggiunto blocchi specializzati per la registrazione e la lettura dei parametri del dispositivo. L'accesso a qualsiasi parametro avviene tramite nome. Per i parametri dei dispositivi remoti si usano nomi composti: «parametro@dispositivo».
Menu a discesa dei parametri
Esempio di scenario di accensione e spegnimento ciclico del carico (1Hz):

Esempio di scenario che sincronizza il funzionamento di due dispositivi separati. In particolare, il relais del dispositivo target replica l'operatività del relais del dispositivo remoto.

Scenario per un termostato (senza isteresi):

Per creare scenari più complessi, puoi utilizzare variabili, cicli, funzioni (con argomenti) e altre strutture. Non mi dilungherò qui nei dettagli, poiché ci sono già molte informazioni .
Passo 2. Ordine di esecuzione degli scenari
Lo scenario opera in modalità continua e, non appena raggiunge la fine, viene riavviato. Ci sono due blocchi che possono temporaneamente sospendere l'esecuzione dello scenario: 'delay' e 'pause'.
Il blocco 'delay' è utilizzato per ritardi di millisecondi o microsecondi. Questo blocco mantiene rigorosamente l'intervallo di tempo, bloccando l'esecuzione dell'intero dispositivo.
Il blocco 'pause' è usato per ritardi in secondi (anche meno) e non blocca l'esecuzione di altri processi nel dispositivo.
Se lo scenario contiene un ciclo infinito che non include un 'pause', l'interprete attiverà autonomamente una piccola pausa.
In caso di esaurimento dello stack di memoria allocato, l'interprete fermerà l'esecuzione di uno scenario ingordo (fai attenzione con le funzioni ricorsive).
Passo 3. Debugging degli scenari
Per eseguire il debug di uno script già caricato nel dispositivo, è possibile avviare il tracciamento step-by-step del programma. Questo è estremamente utile quando il comportamento dello script non corrisponde a quanto previsto dall'autore. In questo caso, il tracciamento consente all'autore di individuare rapidamente la fonte del problema e correggere l'errore nello script.
Script per il calcolo del fattoriale in modalità di debug:

Lo strumento di debug è molto semplice e consiste in tre pulsanti principali: «avvia», «passo avanti» e «ferma» (non dimentichiamo anche «ingresso» e «uscita» dalla modalità di debug). Oltre al tracciamento passo-passo, è possibile impostare un punto di interruzione su qualsiasi blocco (cliccando sul blocco con il mouse).
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 assemblatore con 38 istruzioni. Nel codice sorgente di blockly è stato integrato un generatore di codice specializzato che converte i blocchi visivi in istruzioni di assemblatore. Successivamente, questo programma assemblatore 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; online puoi trovare numerosi articoli sulla progettazione delle macchine virtuali più semplici.
Di solito riservo 1000 byte per lo stack della mia macchina virtuale, che è più che sufficiente. Certo, ricorsioni profonde possono esaurire qualsiasi stack, ma è improbabile che trovino un'applicazione pratica.
Il bytecode finale risulta piuttosto compatto. Ad esempio, il bytecode per calcolare lo stesso fattoriale è di soli 49 byte. Questa è la sua forma visiva di rappresentazione:

Ecco il suo programma assemblatore:
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 presentazione in assembler non ha alcun valore pratico, la scheda «javascrit», al contrario, offre un aspetto più familiare rispetto ai blocchi visivi:
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 script lampeggianti, sullo schermo dell'oscilloscopio ho ottenuto un m2 a 47kHz (con frequenza di clock della CPU di 80MHz).


Ritengo che questo sia un buon risultato, almeno questa velocità è quasi dieci volte più veloce di e .
Parte finale
In conclusione, posso dire che l'uso degli script non solo ci consente di programmare la logica di funzionamento di un singolo dispositivo, ma offre anche l'opportunità di collegare più dispositivi in un unico meccanismo, dove alcuni dispositivi influenzano il comportamento degli altri.
Nota anche che il metodo scelto per memorizzare gli script (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 .
Con questo è tutto, sarò felice di ricevere suggerimenti e critiche costruttive.
Fonte: habr.com
