Un articolo su come creare un controller logico programmabile da un dispositivo cinese economico. Un dispositivo del genere troverà il suo utilizzo sia nella domotica che come lezioni pratiche nell'informatica scolastica.
Per riferimento, per impostazione predefinita il programma Sonoff Basic funziona con un'applicazione mobile tramite un servizio cloud cinese; dopo la modifica proposta, tutte le ulteriori interazioni con questo dispositivo saranno possibili nel browser.
Sezione I. Connessione di Sonoff al servizio MGT24
Passaggio 1: crea un pannello di controllo
Registrati sul sito
Accesso utenti
Per creare un pannello di controllo per un nuovo dispositivo, fare clic sul pulsante “+”.
Esempio di creazione di un pannello
Una volta creato il pannello, verrà visualizzato nell'elenco dei pannelli.
Nella scheda “Configurazione” del pannello creato, trova i campi “ID dispositivo” e “Chiave di autorizzazione”; in futuro, queste informazioni saranno richieste durante la configurazione del dispositivo Sonoff.
Esempio di scheda
Passaggio 2. Aggiorna il dispositivo
Utilizzando l'utilità
Passaggio 3. Configurazione del dispositivo
Alimentare il dispositivo, dopo che il LED si è acceso, premere il pulsante e tenerlo premuto finché il LED non inizia a lampeggiare periodicamente in modo uniforme.
In questo momento apparirà una nuova rete Wi-Fi chiamata “PLC Sonoff Basic”, collega il tuo computer a questa rete.
Spiegazione dell'indicazione LED
Indicazione LED
Stato del dispositivo
doppio lampeggio periodico
nessuna connessione al router
brilla continuamente
connessione stabilita con il router
lampeggiamento periodico uniforme
modalità punto di accesso Wi-Fi
estinto
Nessuna alimentazione
Apri un browser Internet e inserisci il testo “192.168.4.1” nella barra degli indirizzi, vai alla pagina delle impostazioni delle impostazioni di rete del dispositivo.
Compila i campi come segue:
- “Nome rete” e “Password” (per collegare il dispositivo al router wi-fi di casa).
- “ID Dispositivo” e “Chiave di autorizzazione” (per autorizzare il dispositivo sul servizio MGT24).
Esempio di impostazione dei parametri di rete del dispositivo
Salva le impostazioni e riavvia il dispositivo.
Qui
Passaggio 4. Collegamento dei sensori (opzionale)
Il firmware attuale supporta fino a quattro sensori di temperatura ds18b20. Qui
Sezione II. Programmazione visiva
Passaggio 1: crea script
Utilizzato come ambiente di programmazione
Ho aggiunto blocchi specializzati per la scrittura e la lettura dei parametri del dispositivo. Si accede a qualsiasi parametro per nome. Per i parametri dei dispositivi remoti vengono utilizzati nomi composti: “parametro@dispositivo”.
Elenco a discesa delle opzioni
Scenario esemplificativo per accensione e spegnimento ciclico del carico (1Hz):
Un esempio di script che sincronizza il funzionamento di due dispositivi separati. Vale a dire, il relè del dispositivo di destinazione ripete il funzionamento del relè del dispositivo remoto.
Scenario per termostato (senza isteresi):
Per creare script più complessi, puoi utilizzare variabili, cicli, funzioni (con argomenti) e altri costrutti. Non descriverò tutto questo nel dettaglio qui, ce n’è già parecchio in rete.
Passaggio 2: ordine degli script
Lo script viene eseguito continuamente e non appena raggiunge la fine ricomincia. In questo caso ci sono due blocchi che possono mettere temporaneamente in pausa lo script, “delay” e “pause”.
Il blocco "delay" viene utilizzato per ritardi di millisecondi o microsecondi. Questo blocco mantiene rigorosamente l'intervallo di tempo, bloccando il funzionamento dell'intero dispositivo.
Il blocco "pausa" viene utilizzato per ritardi di secondo (o meno) e non blocca l'esecuzione di altri processi nel dispositivo.
Se lo script stesso contiene un ciclo infinito, il cui corpo non contiene "pausa", l'interprete avvia autonomamente una breve pausa.
Se lo stack di memoria allocato è esaurito, l'interprete smetterà di eseguire uno script così assetato di energia (fai attenzione alle funzioni ricorsive).
Passaggio 3: debug degli script
Per eseguire il debug di uno script già caricato nel dispositivo è possibile eseguire passo dopo passo un Trace del programma. Ciò può essere estremamente utile quando il comportamento dello script risulta essere diverso da quello previsto dall'autore. In questo caso, la traccia consente all'autore di trovare rapidamente l'origine del problema e correggere l'errore nello script.
Scenario per il calcolo fattoriale in modalità debug:
Lo strumento di debug è molto semplice ed è composto da tre pulsanti principali: “start”, “un passo avanti” e “stop” (non dimentichiamoci anche delle modalità di debug “invio” ed “uscita”). Oltre al tracciamento passo passo, è possibile impostare un punto di interruzione su qualsiasi blocco (facendo clic sul blocco).
Per visualizzare i valori correnti dei parametri (sensori, relè) nel monitor, utilizzare il blocco "stampa".
Qui
Sezione per i curiosi. Cosa c'è sotto il cofano?
Affinché gli script funzionino sul dispositivo di destinazione, sono stati sviluppati un interprete di bytecode e un assemblatore con 38 istruzioni. Il codice sorgente di Blockly ha un generatore di codice specializzato integrato che converte i blocchi visivi in istruzioni di assemblaggio. Successivamente questo programma assembler viene convertito in bytecode e trasferito al dispositivo per l'esecuzione.
L'architettura di questa macchina virtuale è abbastanza semplice e non ha particolare senso descriverla; su Internet troverai molti articoli sulla progettazione delle macchine virtuali più semplici.
Di solito alloco 1000 byte per lo stack della mia macchina virtuale, che è abbastanza da risparmiare. Naturalmente, le ricorsioni profonde possono esaurire qualsiasi stack, ma è improbabile che abbiano un utilizzo pratico.
Il bytecode risultante è abbastanza compatto. Ad esempio, il bytecode per calcolare lo stesso fattoriale è di soli 49 byte. Questa è la sua forma visiva:
E questo è il suo 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 dell'assemblaggio non ha alcun valore pratico, la scheda "javascrit", al contrario, dà 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. Quando ho eseguito lo script flasher più semplice, ho ottenuto un'onda quadra da 47 kHz sullo schermo dell'oscilloscopio (a una velocità di clock del processore di 80 MHz).
Penso che questo sia un buon risultato, almeno questa velocità è quasi dieci volte più veloce di quella
La parte finale
Riassumendo, dirò che l'uso degli script ci consente non solo di programmare la logica di funzionamento di un dispositivo separato, ma consente anche di collegare più dispositivi in un unico meccanismo, dove alcuni dispositivi influenzano il comportamento di altri.
Noto inoltre che il metodo scelto per archiviare gli script (direttamente nei dispositivi stessi e non sul server) semplifica il passaggio dei dispositivi già funzionanti su un altro server, ad esempio su un Raspberry domestico, qui
Questo è tutto, sarò felice di ricevere consigli e critiche costruttive.
Fonte: habr.com