
Un article sur la façon de transformer un appareil chinois bon marché en un contrôleur logique programmable. Cet appareil trouvera son utilisation tant dans l'automatisation domestique que dans le cadre de cours pratiques en informatique scolaire.
À titre de référence, par défaut, le programme Sonoff Basic fonctionne avec une application mobile via un service cloud chinois. Après la modification proposée, toute interaction ultérieure avec cet appareil sera possible via un navigateur.
Section I. Connecter Sonoff au service MGT24
Étape 1. Créer un tableau de bord
Inscrivez-vous sur le site (si vous n'êtes pas encore inscrit) et connectez-vous avec votre compte.
Connexion
Pour créer un tableau de bord pour un nouvel appareil, cliquez sur le bouton « + ».
Exemple de création de tableau de bord
Une fois le tableau de bord créé, il apparaîtra dans la liste de vos tableaux de bord.
Dans l'onglet « Installation » du tableau de bord créé, trouvez les champs « ID de l'appareil » et « Clé d'autorisation », car ces informations seront nécessaires pour configurer l'appareil Sonoff.
Exemple d'onglet
Étape 2. Flasher l'appareil
Avec l'outil , téléchargez le firmware dans l'appareil ; pour cela, vous aurez besoin d'un convertisseur USB-TTL. Voici et .
Étape 3. Configurer l'appareil
Alimentez l'appareil. Après que la diode LED s'allume, appuyez sur le bouton et maintenez-le enfoncé jusqu'à ce que la diode commence à clignoter périodiquement et uniformément.
À ce moment, un nouveau réseau wi-fi apparaîtra avec le nom « PLC Sonoff Basic », connectez votre ordinateur à ce réseau.
Décodage de l'indication LED
Indication LED
État de l'appareil
clignotement double périodique
pas de connexion au routeur
brille en continu
connexion établie avec le routeur
clignotement périodique et uniforme
mode point d'accès wi-fi
éteint
pas d'alimentation
Ouvrez votre navigateur internet et saisissez dans la barre d'adresse le texte « 192.168.4.1 », accédez à la page des paramètres réseau de l'appareil.
Remplissez les champs comme suit :
- « Nom du réseau » et « Mot de passe » (pour lier l'appareil au routeur wi-fi domestique).
- « ID de l'appareil » et « Clé d'autorisation » (pour l'authentification de l'appareil sur le service MGT24).
Exemple de configuration des paramètres réseau de l'appareil
Enregistrez les paramètres et redémarrez l'appareil.
Ici .
Étape 4. Connexion des capteurs (facultatif)
Le micrologiciel actuel prend en charge jusqu'à quatre capteurs de température ds18b20. Ici sur le montage des capteurs. Apparemment, cette étape sera la plus compliquée, car elle nécessitera de l'habileté manuelle et un fer à souder.
Section II. Programmation visuelle
Étape 1. Création de scénarios
L'environnement de programmation utilisé est , cet environnement est simple à utiliser, donc pour créer des scénarios simples, il n'est pas nécessaire d'être programmeur.
J'ai ajouté des blocs spécialisés pour écrire et lire les paramètres de l'appareil. L'accès à chaque paramètre se fait par son nom. Pour les paramètres des appareils distants, des noms composites sont utilisés : «paramètre@appareil».
Liste déroulante des paramètres
Exemple de scénario de commutation cyclique d'une charge (1 Hz) :

Exemple de scénario synchronisant le fonctionnement de deux appareils distincts. En effet, le relais de l'appareil cible répète le fonctionnement du relais de l'appareil distant.

Scénario pour un thermostat (sans hystérésis) :

Pour créer des scénarios plus complexes, vous pouvez utiliser des variables, des boucles, des fonctions (avec des arguments) et d'autres constructions. Je vais éviter de tout détailler ici, car il existe déjà beaucoup de .
Étape 2. Ordre d'exécution des scénarios
Le scénario fonctionne en mode continu, et dès qu'il atteint sa fin, il redémarre. Il y a deux blocs qui peuvent temporairement suspendre le scénario, «delay» et «pause».
Le bloc «delay» est utilisé pour des délais en millisecondes ou en microsecondes. Ce bloc respecte strictement l'intervalle de temps, bloquant le fonctionnement de tout l'appareil.
Le bloc «pause» est utilisé pour des délais en secondes (ou moins), et il ne bloque pas l'exécution d'autres processus dans l'appareil.
Si le scénario contient une boucle infinie sans «pause», l'interpréteur initiera automatiquement une petite pause.
En cas d'épuisement de la mémoire allouée, l'interpréteur arrêtera l'exécution de ce scénario vorace (faites attention aux fonctions récursives).
Étape 3. Débogage des scénarios
Pour déboguer un script déjà chargé dans l'appareil, il est possible de lancer un pas à pas de la trace de programme. Cela peut être extrêmement utile lorsque le comportement du script ne correspond pas à ce que l'auteur avait prévu. Dans ce cas, le pas à pas permet à l'auteur de localiser rapidement la source du problème et de corriger l'erreur dans le script.
Script de calcul de la factorielle en mode débogage :

L'outil de débogage est très simple et se compose de trois boutons principaux : « démarrer », « un pas en avant » et « arrêter » (n'oublions pas aussi les boutons « entrer » et « quitter » du mode débogage). En plus de la trace pas à pas, il est possible de définir un point d'arrêt sur n'importe quel bloc (en cliquant avec la souris sur le bloc).
Pour afficher les valeurs actuelles des paramètres (capteurs, relais) sur le moniteur, utilisez le bloc « print ».
Ici sur l'utilisation du débogueur.
Section pour les curieux. Qu'est-ce qui se cache sous le capot ?
Pour que les scripts fonctionnent sur l'appareil cible, un interpréteur de bytecode et un assembleur de 38 instructions ont été développés. Dans le code source de blockly, un générateur de code spécialisé a été intégré, qui convertit les blocs visuels en instructions assembleur. Ensuite, ce programme assembleur est transformé en bytecode et transmis à l'appareil pour exécution.
L'architecture de cette machine virtuelle est assez simple et il n'est pas particulièrement utile de la décrire, vous trouverez de nombreux articles sur la conception de machines virtuelles simples sur Internet.
Pour la pile de ma machine virtuelle, j'alloue généralement 1000 octets, ce qui est plus que suffisant. Bien sûr, des récursions profondes peuvent épuiser n'importe quelle pile, mais il est peu probable qu'elles aient une application pratique.
Le bytecode final est assez compact. Par exemple, le bytecode pour le calcul de la même factorielle ne fait que 49 octets. Voici sa forme visuelle de représentation :

Et voici son programme assembleur :
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 forme assembleur n'a pas de valeur pratique, l'onglet « javascript », en revanche, offre une vue plus familière que les blocs visuels :
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
En ce qui concerne la performance. Lors de l'exécution d'un scénario simple de clignotement, j'ai obtenu une onde de 47 kHz sur l'oscilloscope (avec une fréquence d'horloge du processeur de 80 MHz).


Je considère que c'est un bon résultat, en tout cas, cette vitesse est presque dix fois plus rapide que celle de et .
Partie finale
Pour conclure, je dirais que l'utilisation de scénarios nous permet non seulement de programmer la logique de fonctionnement d'un appareil individuel, mais aussi de relier plusieurs appareils en un seul mécanisme, où certains appareils influencent le comportement des autres.
Je souligne également que la méthode de stockage des scénarios choisie (directement dans les appareils eux-mêmes et non sur un serveur) facilite le changement d'appareils fonctionnant déjà vers un autre serveur, par exemple un Raspberry personnel, ici .
C'est tout, je serais ravi d'entendre des conseils et des critiques constructives.
Source : habr.com
