Dubbla frekvenser RC utlopp Webserver (4 / 4 steg)
Steg 4: programvara
Programvara. Jag älskar det. Gjort det professionellt i över 30 år. Realtid. Flygning kontroll. Simuleringar. Business apps. Vetenskapliga apps. Jag älskar dem alla. Med detta sagt, för min hem projekt, tillbringar jag mycket mer av min insats på hårdvara än programvaran. Detta är en hobby och vad jag gör för att varva ner efter skrift mjukvaran hela dagen. Programvaran för detta projekt skulle kunna vara mer komplett, mer robust och snyggare men det är inte hur jag vill lägga min tid på ett hem projektet.
Användargränssnitt
Eftersom detta projekt är byggd runt en ESP8266-12, då är den självklara lösningen för användargränssnittet en uppsättning webbsidor. Jag gjorde inte något fancy, bara kastade ihop några HTML5, CSS och Javascript i Kate. Detta var första gången jag använder ESP8266 för något annat än ett trivialt exempel och det fanns några quirks och fallgropar hade jag snubbla mig igenom innan jag fick allt fungerar.
Jag hade inte skrivit någon HTML i över tio år och ville prova HTML5. Att undvika tillbaka och vidare skriver, kompilera och ladda upp till ESP8266, jag första prototyped alla webbsidor på min laptop med modulen SimpleHTTP python som en server. Det gav mig mycket snabb vändning medan jag knackade HTML rosta bort.
Från bilderna, kan du se att huvudsidan är en lista över kända enheter och knapparna för att markera/avmarkera och aktivera eller inaktivera dem. Det finns också knappar som tar dig till sidor för att definiera en ny enhet eller redigera en befintlig.
Om du vill definiera en ny enhet, använder du knappen "Record 315" eller "Rekord 434" knappen. Förhoppningsvis vet du vilken frekvens din enhet använder men om inte, du bara prova en och sedan den andra. Om du väljer fel först, syns det en signal, så ingen skada skedd.
Utvecklingsmiljön
Koden för detta projekt är skriven i C++ använder Arduino bibliotek och sammanställt och laddat upp genom att använda Arduino kommandoradsgränssnitt.
Som C++ utvecklare av dagen är det mitt språk hemma. Jag hamnade först i hobby-nivå inbyggda system för två år sedan med plattformen som folk antingen älskar eller hatar - Arduino Uno. Som alla andra professionella programmerare som har använt Arduino IDE i mer än fem minuter, tittade jag snabbt för en annan lösning. Efter försökande den tillgängliga makefiler och Eclipse plug-in, slutade jag upp med Kate och ett python-skript för att åberopa Arduino kommandoradsgränssnittet. Som tillät mig att dike deras IDE alldeles och gjorde mig mycket gladare.
Innan det finns ännu en annan meningslös debatt om huruvida Arduino är en lämplig ekosystem att arbeta med, vill jag påpeka att det finns tre mycket fina saker om att arbeta med att verktygen:
- Rikedomen av öppen källkod bibliotek för gränssnitt med olika maskinvarukomponenter
- Förmågan att integrera icke-Arduino styrelser (som ESP8266) i deras byggsystem
- En hardware abstraction layer som låter dig programmera (mer eller mindre) oberoende av den specifika mikro-controller du använder.
Ja, jag vet att en hel del mycket högljudd människor där ute ser på Arduino ekosystemet med förakt och hävda att någon som inte direkt för att gränssnittet maskinvaruspecifika och skriva varje bibliotek från början inte är riktiga programmerare. Jag håller inte men eftersom detta ämne har varit slå ihjäl länge sedan, debatter kan skickas till DjoceNet.
Funktionella prototyper
Alla min första prototyper utfördes på en Arduino Uno ansluten till min laptop och använda följetong till läsa kommandon från tangentbordet och skriva ut resultaten till skärmen. Detta tillät mig att fokusera på hur till läsa, lagra & replay RF kommandon utan att få kört fast med problem med WiFi och webbgränssnittet.
* Pro tips * - från början, jag skrev core logiken som en uppsättning fristående klasser helt oberoende av vad användaren var gränssnittet som används av testförare. Medan jag var prototyper, jag läsa kommandon från tangentbordet, tolka dem, startas korrekt metoderna från min bibliotek kod och visas resultaten för skärmen. När jag flyttade till ett webbaserat gränssnitt på ESP8266, biblioteket gled rätt i eftersom det har några beroenden på UI. Konfigurationsparametrar som GPIO pin uppdrag skickas som konstruktören parametrar till klassen "top level"-biblioteket. I huvudsakliga källfilen (.ino i Arduino-land) finns det en rad #ifdefs som konfigurerar dessa korrekt utifrån styrelsen jag sammanställer för.
När ett kommando tas emot, programvaran vänder på lämplig RF maskinvara (315 mottagare, 315 sändare, 434 mottagare eller 434 sändare) med hjälp av transistorn knuten till var och en av dessa enheter. Det väntar en liten mängd tid att se till att maskinvaran drivs upp och sedan antingen skickar ett kommando eller lyssnar efter ett inkommande kommando.
Säkerhet
Ingen. Detta är inte utsatt utanför mitt lokala nätverk så jag fick lata intresse spendera tid med min familj. Ärligt talat, om du väljer att bust genom min brandvägg och det enda du kan hitta för att göra är slå min julbelysningen på och av flera gånger, väl... du kanske inte är redo för anonym ganska ännu.
Nästa semester säsong, kan jag lägga till en MAC vitlista och vissa rudimentära användarreferenser. Jag tyckte också om att lägga till några logik som låser du ut ett tag om du försöker fråga mer än N kommandon i en timme. För nu är det ansluten, så det är ganska säkert.
Programvara för återanvändning
Som jag nämnde, är att kunna återanvända befintliga bibliotek en enorm produktivitet öka. För detta projekt, det finns två bibliotek i synnerhet som jag använder.
RCSwitch - Arduino bibliotek för fjärrkontrollen utlopp växlar
Detta bibliotek (http://code.google.com/p/rc-switch/) gör det mycket enkelt att kommunicera med RF-mottagare och sändare. Jag sluta ändra den ganska kraftigt för att passa min särskilt behöver men det var en bra utgångspunkt och visade mig de svar jag behövde för att få saker och ting fungerar.
ESP8266WebServer - död enkel web-server
Denna kod från Ivan Grokhotkov är en bra utgångspunkt för att skriva en enkel webserver.
Om jag har sett ytterligare, är det genom att stå på en jättes axlar. --Isaac Newton