En artikel om hur man skapar en programmerbar logisk styrenhet från en billig kinesisk enhet. En sådan enhet kommer att hitta sin användning både i hemautomation och som praktiska klasser i skoldatavetenskap.
Som referens fungerar Sonoff Basic-programmet som standard med en mobilapplikation via en kinesisk molntjänst; efter den föreslagna ändringen kommer all ytterligare interaktion med den här enheten att bli möjlig i webbläsaren.
Avsnitt I. Ansluta Sonoff till MGT24-tjänsten
Steg 1: Skapa en kontrollpanel
Registrera dig på sajten
Logga in
För att skapa en kontrollpanel för en ny enhet, klicka på "+"-knappen.
Exempel på att skapa en panel
När panelen har skapats visas den i din lista över paneler.
På fliken "Setup" i den skapade panelen, hitta fälten "Device ID" och "Authorization Key"; i framtiden kommer denna information att krävas när du ställer in Sonoff-enheten.
Exempel på flik
Steg 2. Flasha enheten igen
Använda verktyget
Steg 3. Enhetskonfiguration
Sätt på ström till enheten, efter att lysdioden har tänts, tryck på knappen och håll den intryckt tills lysdioden börjar blinka med jämna mellanrum.
Just nu kommer ett nytt wi-fi-nätverk som heter "PLC Sonoff Basic" att dyka upp, anslut din dator till detta nätverk.
Förklaring av LED-indikering
LED indikering
Enhets status
periodisk dubbelblinkning
ingen anslutning till routern
lyser kontinuerligt
anslutning upprättad med routern
periodisk enhetlig blinkning
Wi-Fi-åtkomstpunktläge
släckt
Ingen strömförsörjning
Öppna en webbläsare och skriv in texten "192.168.4.1" i adressfältet, gå till enhetens sida med nätverksinställningar.
Fyll i fälten enligt följande:
- "Nätverksnamn" och "Lösenord" (för att länka enheten till din hemwi-fi-router).
- "Enhets-ID" och "Auktoriseringsnyckel" (för att auktorisera enheten på MGT24-tjänsten).
Exempel på inställning av enhetens nätverksparametrar
Spara inställningarna och starta om enheten.
Här
Steg 4. Ansluta sensorer (tillval)
Den nuvarande firmwaren stöder upp till fyra ds18b20 temperatursensorer. Här
Avsnitt II. Visuell programmering
Steg 1: Skapa skript
Används som programmeringsmiljö
Jag lade till specialiserade block för att skriva och läsa enhetsparametrar. Alla parametrar nås med namn. För parametrar för fjärrenheter används sammansatta namn: "parameter@enhet".
Dropdown-lista med alternativ
Exempelscenario för cyklisk till- och frånkoppling av lasten (1Hz):
Ett exempel på ett skript som synkroniserar driften av två separata enheter. Målanordningens relä upprepar nämligen operationen av reläet hos fjärranordningen.
Scenario för termostat (utan hysteres):
För att skapa mer komplexa skript kan du använda variabler, loopar, funktioner (med argument) och andra konstruktioner. Jag kommer inte att beskriva allt detta i detalj här; det finns redan en hel del på nätet.
Steg 2: Ordning av skript
Skriptet körs kontinuerligt och så fort det når slutet startar det igen. I det här fallet finns det två block som tillfälligt kan pausa skriptet, "delay" och "paus".
Blocket "fördröjning" används för millisekunds- eller mikrosekundsfördröjningar. Detta block upprätthåller strikt tidsintervallet och blockerar driften av hela enheten.
"Paus"-blocket används för andra (eller mindre) fördröjningar, och det blockerar inte exekveringen av andra processer i enheten.
Om själva skriptet innehåller en oändlig loop, vars brödtext inte innehåller "paus", initierar tolken självständigt en kort paus.
Om den allokerade minnesstacken är uttömd kommer tolken att sluta exekvera ett sådant kraftkrävande skript (var försiktig med rekursiva funktioner).
Steg 3: Felsökning av skript
För att felsöka ett skript som redan har laddats in i enheten kan du köra en programspårning steg för steg. Detta kan vara extremt användbart när manusets beteende visade sig vara annorlunda än vad författaren avsåg. I det här fallet tillåter spårning författaren att snabbt hitta källan till problemet och rätta till felet i skriptet.
Scenario för beräkning av faktor i felsökningsläge:
Felsökningsverktyget är väldigt enkelt och består av tre huvudknappar: "start", "ett steg framåt" och "stopp" (låt oss inte heller glömma "enter" och "exit" felsökningsläge). Förutom steg-för-steg-spårning kan du ställa in en brytpunkt på vilket block som helst (genom att klicka på blocket).
För att visa de aktuella värdena för parametrar (sensorer, reläer) i monitorn, använd "print"-blocket.
Här
Sektion för nyfikna. Vad finns under huven?
För att skripten skulle fungera på målenheten utvecklades en bytekodtolkare och en assembler med 38 instruktioner. Blocklys källkod har en specialiserad kodgenerator inbyggd som omvandlar visuella block till monteringsinstruktioner. Därefter omvandlas detta assemblerprogram till bytekod och överförs till enheten för exekvering.
Arkitekturen för denna virtuella maskin är ganska enkel och det finns ingen speciell mening med att beskriva den, på Internet hittar du många artiklar om att designa de enklaste virtuella maskinerna.
Jag brukar tilldela 1000 byte för stacken på min virtuella maskin, vilket är tillräckligt. Naturligtvis kan djupa rekursioner tömma vilken stapel som helst, men det är osannolikt att de har någon praktisk användning.
Den resulterande bytekoden är ganska kompakt. Som ett exempel är bytekoden för att beräkna samma faktorial endast 49 byte. Detta är dess visuella form:
Och det här är hans 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 monteringsformen för representation inte har något praktiskt värde, ger fliken "javascrit" tvärtom ett mer bekant utseende än visuella block:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Angående prestation. När jag körde det enklaste flasher-skriptet fick jag en fyrkantvåg på 47 kHz på oscilloskopskärmen (med en processorklockhastighet på 80 MHz).
Jag tycker att detta är ett bra resultat, åtminstone den här hastigheten är nästan tio gånger snabbare än
Den sista delen
För att sammanfatta kommer jag att säga att användningen av skript tillåter oss inte bara att programmera logiken för driften av en separat enhet, utan också gör det möjligt att ansluta flera enheter till en enda mekanism, där vissa enheter påverkar andras beteende.
Jag noterar också att den valda metoden att lagra skript (direkt i själva enheterna, och inte på servern) förenklar bytet av redan fungerande enheter till en annan server, till exempel till en hemhallon, här
Det är allt, jag kommer gärna att höra råd och konstruktiv kritik.
Källa: will.com