
En artikel om hur man förvandlar en billig kinesisk enhet till en programmerbar logikcontroller. En sÄdan enhet kan anvÀndas bÄde för hemautomation och som praktiska övningar i skolans datateknik.
Som referens, som standard fungerar Sonoff Basic-programmet med mobilappen via en kinesisk molntjÀnst, efter den föreslagna ombyggnaden blir all vidare interaktion med denna enhet möjlig i webblÀsaren.
Avsnitt I. Ansluta Sonoff till MGT24-tjÀnsten
Steg 1. Skapa en kontrollpanel
Registrera dig pÄ webbplatsen (om du inte redan har registrerat dig) och logga in med ditt konto.
Logga in
För att skapa en kontrollpanel för den nya enheten, klicka pĂ„ knappen â+â.
Exempel pÄ att skapa en panel
NÀr panelen har skapats kommer den att visas i din lista över paneler.
I fliken âInstallationâ av den skapade panelen, hitta fĂ€lten âEnhets-IDâ och âAutentiseringstokenâ, denna information behövs senare för att konfigurera Sonoff-enheten.
Exempel pÄ fliken
Steg 2. Flasha enheten
AnvÀnd verktyget för att ladda upp fastvaren till enheten, för detta behöver du en USB-TTL-konverterare. HÀr och .
Steg 3. Konfigurera enheten
Anslut ström till enheten, nÀr LED-lampan tÀnds, tryck pÄ knappen och hÄll den intryckt tills LED-lampan börjar blinka jÀmnt.
Vid denna tidpunkt kommer ett nytt wi-fi-nĂ€tverk med namnet âPLC Sonoff Basicâ att dyka upp, anslut din dator till detta nĂ€tverk.
Avkodning av LED-indikationen
LED-indikationen
Enhetens tillstÄnd
periodisk dubbelblinkning
ingen anslutning till routern
lyser kontinuerligt
anslutning till routern Àr etablerad
periodisk jÀmn blinkning
wi-fi accesspunktslÀge
slÀckt
ingen ström
Ăppna webblĂ€saren och skriv in adressen â192.168.4.1â i adressfĂ€ltet, gĂ„ till instĂ€llningssidan för enhetens nĂ€tverksparametrar.
Fyll i fÀlten enligt följande:
- âNamn pĂ„ nĂ€tverkâ och âLösenordâ (för att koppla enheten till hemmet wi-fi-router).
- âEnhets-IDâ och âAutentiseringstokenâ (för att auktorisera enheten pĂ„ MGT24-tjĂ€nsten).
Exempel pÄ instÀllningar av nÀtverksparametrar för enheten
Spara instÀllningarna och starta om enheten.
HĂ€r .
Steg 4. Anslutning av sensorer (valfritt)
Den aktuella firmware-versionen stöder upp till fyra temperatur-sensorer ds18b20. HÀr Àr monteringsanvisningar för sensorerna. Det verkar som att detta steg blir det mest utmanande, eftersom det krÀver att du har hantverkskunskaper och en lödkolv.
Avsnitt II. Visuell programmering
Steg 1. Skapa skript
Som programmeringsmiljö anvÀnds , miljön Àr lÀtt att lÀra sig, sÄ för att skapa enkla skript behöver man inte vara programmerare.
Jag har lagt till specialblock för att lĂ€sa och skriva enhetens parametrar. Ă
tkomst till vilken parameter som helst görs via namnet. För parametrar pÄ fjÀrrenheter anvÀnds sammansatta namn: "parameter@enhet".
Rullgardinslista över parametrar
Exempel pÄ ett skript för cykliskt pÄ- och avskÀnnande av last (1 Hz):

Exempel pÄ ett skript som synkroniserar arbetet mellan tvÄ separata enheter. NÀmligen, relÀet pÄ mÄl-enheten upprepar relÀets arbete pÄ den fjÀrrstyrda enheten.

Skript för en termostat (utan hysterese):

För att skapa mer komplexa skript kan man anvÀnda variabler, loopar, funktioner (med argument) och andra konstruktioner. Jag kommer inte att förklara allt detta i detalj hÀr, det finns redan en hel del .
Steg 2. Ordning för skriptens utförande
Skriptet körs i kontinuerligt lÀge, och sÄ snart det nÄr sin slutpunkt startar det om. Det finns tvÄ block som kan tillfÀlligt pausa skriptets körning, "delay" och "pause".
Blocket "delay" anvÀnds för millisekund- eller mikrosekunds-pausar. Detta block hÄller strikt pÄ tidsintervallet och blockerar hela enhetens funktion.
Blocket "pause" anvÀnds för sekunders (kan Àven vara kortare) pausar, och det blockerar inte utförandet av andra processer i enheten.
Om skriptet innehÄller en oÀndlig loop utan en "pause", initierar interpreteraren sjÀlv en kort paus.
Om den tilldelade stackminnet tar slut, kommer interpreteraren att stoppa utförandet av ett sÄdant resurskrÀvande skript (var försiktig med rekursiva funktioner).
Steg 3. Felsökning av skript
För att debugga ett skript som redan har laddats in i enheten kan du starta steg-för-steg-tracing av programmet. Detta Àr mycket anvÀndbart nÀr skriptets beteende inte Àr som förvÀntat av författaren. I sÄdana fall gör tracing det möjligt för författaren att snabbt hitta kÀllan till problemet och korrigera felet i skriptet.
Skript för berÀkning av faktoriel i debug-lÀge:

Debuggingverktyget Àr mycket enkelt och bestÄr av tre grundlÀggande knappar: "start", "ett steg framÄt" och "stopp" (glöm heller inte "in" och "ut" ur debug-lÀge). Förutom steg-för-steg-tracing kan du sÀtta en brytpunkt pÄ vilken block som helst (genom att klicka med musen pÄ blocket).
För att visa aktuella vÀrden pÄ parametrarna (sensorer, relÀer) pÄ skÀrmen, anvÀnd blocket "print".
HÀr om anvÀndningen av debuggern.
Avsnitt för nyfikna. Vad finns under huven?
För att skripten ska fungera pÄ mÄlenheten utvecklades en byte-kodtolk och en assembler med 38 instruktioner. I kÀllkoden för blockly integrerades en specialiserad kodgenerator som konverterar visuella block till assemblerinstruktioner. Denna assemblerprogram överförs sedan till byte-kod och skickas till enheten för utförande.
Arkitekturen för denna virtuella maskin Àr ganska enkel och det finns ingen sÀrskild mening med att beskriva den, pÄ nÀtet hittar du mÄnga artiklar om design av enklaste virtuella maskiner.
För min virtuella maskins stack brukar jag avsÀtta 1000 byte, vilket Àr mer Àn tillrÀckligt. SjÀlvklart kan djup rekursion förbruka vilken stack som helst, men det Àr osannolikt att de fÄr praktisk tillÀmpning.
Den slutliga byte-koden Àr ganska kompakt. Som exempel utgör byte-koden för berÀkning av samma faktoriel endast 49 byte. HÀr Àr dess visuella representationsform:

Och hÀr Àr dess assemblerprogram:
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
Om den assemblerformade representationen inte har nÄgot praktiskt vÀrde, ger fliken "javascrit", Ä sin sida, en mer bekant vy Àn visuella block:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
NÀr det kommer till prestanda. Vid körning av ett enkelt blinkande program fick jag en vÄgform pÄ 47 kHz pÄ oscilloskopet (med en processor klockfrekvens pÄ 80 MHz).


Jag anser att detta Àr ett bra resultat, Ätminstone Àr denna hastighet nÀstan tio gÄnger snabbare Àn och .
Avslutande del
Sammanfattningsvis vill jag sÀga att anvÀndningen av skript inte bara lÄter oss programmera logiken för enskilda enheter, utan ocksÄ ger möjlighet att koppla flera enheter till en enhetlig mekanism, dÀr vissa enheter pÄverkar beteendet hos andra.
Jag vill ocksÄ pÄpeka att den valda metoden för lagring av skript (direkt i enheterna, snarare Àn pÄ servern) förenklar övergÄngen av redan fungerande enheter till en annan server, till exempel en hemmaserver med Raspberry Pi, hÀr .
Det Àr allt, jag ser fram emot att höra rÄd och konstruktiv kritik.
KĂ€lla: habr.com
