
En artikkel om hvordan man kan lage en programmerbar logisk kontroller fra et billig kinesisk apparat. Denne enheten vil kunne brukes bÄde til hjemmeautomatisering og som praktiske oppgaver i skoleinformatikk.
For referanse, som standard fungerer Sonoff Basic-programmet med en mobilapplikasjon gjennom en kinesisk skylÞsning. Etter den foreslÄtte ombyggingen vil all videre interaksjon med denne enheten vÊre mulig i nettleseren.
Del I. Tilkobling av Sonoff til MGT24-tjenesten
Trinn 1. Opprettelse av kontrollpanelet
Registrer deg pÄ nettstedet (hvis du ikke allerede er registrert) og logg inn pÄ din konto.
Innlogging
For Ä opprette et kontrollpanel for den nye enheten, trykk pÄ knappen «+».
Eksempel pÄ oppretting av panel
NÄr panelet er opprettet, vil det vises pÄ listen over dine paneler.
I fanen «Installasjon» for det opprettede panelet, finn feltene «Enhets-ID» og «AutentiseringsnÞkkel». Denne informasjonen vil bli nÞdvendig for fremtidig konfigurering av Sonoff-enheten.
Eksempel pÄ fane
Trinn 2. Flashing av enheten
Bruk verktĂžyet last opp fastvaren til enheten, for dette trenger du en USB-TTL-konverter. Her er en og .
Trinn 3. Konfigurering av enheten
Koble til strÞm til enheten, nÄr LED-lampen lyser, trykk pÄ knappen og hold den nede til LED-lampen begynner Ä blinke jevnt.
PÄ dette tidspunktet vil et nytt Wi-Fi-nettverk med navnet «PLC Sonoff Basic» vises, koble datamaskinen din til dette nettverket.
Dekoding av LED-indikasjonen
LED-indikasjon
Enhetens tilstand
periodisk dobbelt blink
ingen forbindelse til ruteren
lyser kontinuerlig
tilkobling til ruteren er etablert
periodisk jevnt blink
Wi-Fi-tilgangspunktmodus
slukket
ingen strĂžm
à pne nettleseren og skriv inn teksten «192.168.4.1» i adressefeltet, gÄ til innstillingssiden for enhetens nettverksparametre.
Fyll ut feltene som fĂžlger:
- «Nettverksnavn» og «Passord» (for Ä knytte enheten til det hjemlige Wi-Fi-ruteren).
- «Enhets-ID» og «AutentiseringsnÞkkel» (for autentisering av enheten pÄ MGT24-tjenesten).
Eksempel pÄ innstilling av nettverksparametre for enheten
Lagre innstillingene og start enheten pÄ nytt.
Her .
Trinn 4. Tilkobling av sensorer (valgfritt)
Den nÄvÊrende fastvaren stÞtter opptil fire temperaturfÞlere ds18b20. Her er montering av sensorene. Dette trinnet vil tilsynelatende vÊre det mest utfordrende, da det vil kreve gode ferdigheter og en loddebolt.
Del II. Visuell programmering
Trinn 1. Oppretting av scenarier
Vi bruker , som er en lettfattelig plattform, sÄ for Ä lage enkle scenarier trenger du ikke vÊre programmerer.
Jeg har lagt til spesialiserte blokker for Ä skrive og lese enhetsparametere. Tilgang til enhver parameter skjer via navn. For parametere fra eksterne enheter brukes sammensatte navn: «parameter@enhet».
Nedtrekkslisten over parametere
Eksempel pÄ scenario for syklisk pÄ- og avstenging av belastning (1 Hz):

Eksempel pÄ scenario som synkroniserer arbeidet til to separate enheter. Det vil si at reléet pÄ mÄl-enheten gjentar arbeidet til reléet pÄ den eksterne enheten.

Scenario for termostat (uten hysterese):

For Ä lage mer komplekse scenarier kan du bruke variabler, lÞkker, funksjoner (med argumenter) og andre konstruksjoner. Jeg vil ikke gÄ inn pÄ detaljene her, det finnes allerede mye .
Trinn 2. UtfĂžrelsesrekkefĂžlge for scenarier
Scenariet kjÞrer kontinuerlig, og sÄ snart det er ferdig, starter det pÄ nytt. Det er to blokker som midlertidig kan stoppe scenariet: «delay» og «pause».
Blokken «delay» brukes for millisekund- eller mikrosekundforsinkelser. Denne blokken holder strengt tidsintervallet, og blokkerer driften av hele enheten.
Blokken «pause» brukes for forsinkelser pÄ sekunder (eller mindre), og den blokkerer ikke kjÞringen av andre prosesser i enheten.
Hvis scenariet inneholder en uendelig lÞkke uten «pause», vil tolken selv initiere en liten pause.
Ved oppbruk av tilgjengelig minne vil tolken stoppe kjĂžringen av et slik ressurskrevende scenario (vĂŠr forsiktig med rekursive funksjoner).
Trinn 3. FeilsĂžking av scenarier
For debugging a script that has already been loaded onto the device, you can initiate step-by-step program tracing. This is extremely useful when the behavior of the script does not match the author's intent. In this case, tracing allows the author to quickly identify the source of the problem and correct the error in the script.
Factorial calculation script in debug mode:

The debugging tool is very simple and consists of three main buttons: 'start', 'step forward', and 'stop' (also don't forget about 'enter' and 'exit' debug mode). Besides step-by-step tracing, you can set a breakpoint on any block (by clicking with the mouse on the block).
To display the current values of parameters (sensors, relays) on the monitor, use the 'print' block.
Her about using the debugger.
Section for the curious. So what's under the hood?
In order for the scripts to work on the target device, a bytecode interpreter and an assembler with 38 instructions were developed. A specialized code generator was integrated into the blockly source code, which converts visual blocks into assembly instructions. Subsequently, this assembly program is transformed into bytecode and sent to the device for execution.
The architecture of this virtual machine is quite simple, and there is little point in describing it; you will find many articles on the design of simple virtual machines online.
I usually allocate 1000 bytes for the stack of my virtual machine; this is more than enough. Of course, deep recursions can exhaust any stack, but they are unlikely to find practical application.
The resulting bytecode is quite compact. For example, the bytecode for calculating the same factorial consists of only 49 bytes. Here is its visual representation:

And here is its assembly program:
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
If the assembly representation has no practical value, the 'javascript' tab, on the other hand, provides a more familiar view than visual blocks:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
NÄr det gjelder ytelsen. Ved Ä kjÞre et enkelt blinkeskript, fikk jeg en 47kHz rektangulÊr bÞlge pÄ oscilloskopet (med prosessorens klokkehastighet pÄ 80MHz).


Jeg anser dette som et greit resultat, i det minste er denne hastigheten nesten ti ganger raskere enn og .
Avsluttende del
For Ä oppsummere vil jeg si at bruken av skript ikke bare lar oss programmere logikken til en enkelt enhet, men ogsÄ gir mulighet til Ä koble flere enheter sammen i en enhetlig mekanisme, der enkelte enheter pÄvirker oppfÞrselen til andre.
Jeg vil ogsÄ pÄpeke at den valgte metoden for lagring av skript (direkte i enhetene selv, ikke pÄ serveren) forenkler overgangen av allerede fungerende enheter til en annen server, for eksempel til en hjemmelaget Raspberry, her .
Det er alt, jeg ser frem til Ä hÞre rÄd og konstruktiv kritikk.
Kilde: habr.com
