Stap 4: Software
Software. Ik vind het geweldig. Gedaan het professioneel voor meer dan 30 jaar. Real-time. Vlucht controle. Simulaties. Zakelijke apps. Wetenschappelijke apps. Ik hou van alle 'em. Dat gezegd zijnde, voor mijn eigen projecten, besteed ik veel meer van mijn inspanning op de hardware dan de software. Dit is een hobby en wat ik doen om te ontspannen na de hele dag het schrijven van software. De software voor dit project zou meer compleet, meer robuuste en mooier, maar dat is niet hoe ik ben op zoek naar mijn tijd besteden op een home project.
User Interface
Omdat dit project is opgebouwd rond een ESP8266-12, dan de hand liggende oplossing voor de user-interface een verzameling webpagina's is. Ik deed niets fancy, gewoon gooide samen enkele HTML5, CSS en Javascript in Kate. Dit was mijn eerste keer met behulp van de ESP8266 voor iets anders dan een triviaal voorbeeld en er waren enkele eigenaardigheden en valkuilen ik mijn weg door struikelen moest voordat ik heb alles werkt.
Ik had niet geschreven HTML-code in meer dan tien jaar en wilde uitproberen van HTML5. Om te voorkomen dat het terug en weer schrijven, compileren en uploaden naar de ESP8266, ik eerste prototyped all de web pagina's op mijn laptop using de SimpleHTTP python module als een server. Dit gaf mij zeer snelle turn-around, terwijl ik de HTML roest geklopt.
Van de foto's, kunt u zien dat de belangrijkste pagina een lijst van bekende apparaten en knoppen is te selecteren/deselecteren en zet ze in- of uitschakelen. Er zijn ook knoppen waarmee u naar pagina's met het definiëren van een nieuw apparaat of een bestaand stereotype bewerken.
Als u wilt definiëren een nieuw apparaat, u gebruikt de knop "Registreren 315" of "Record 434". Hopelijk weet u welke frequentie uw toestel gebruikt maar als niet, u alleen één en dan de andere proberen. Als u eerst verkeerde kiest, zien niet het een signaal, dus geen schade.
De ontwikkelomgeving
De code voor dit project is geschreven in C++ met behulp van de Arduino libraries, gecompileerd en geüpload via de opdrachtregelinterface van Arduino.
Als C++ ontwikkelaar per dag is dat mijn voorkeurstaal thuis. Twee jaar geleden met het platform dat liefde of haat - de Arduino Uno mensen kreeg ik eerst in hobbyist-niveau ingebedde systemen. Net als elke andere professionele programmeur die de Arduino IDE voor meer dan vijf minuten gebruikt, keek ik snel naar een andere oplossing. Na het proberen van de Makefiles van beschikbaar en de Eclipse plug-in, uiteindelijk heb ik met behulp van Kate en een python-script om te roepen de opdrachtregelinterface van Arduino. Dat stond me toe om hun IDE helemaal sloot en maakte me veel gelukkiger.
Voordat er nog een ander zinloos debat is over de vraag of Arduino een geschikt ecosysteem om mee te werken, wil ik erop wijzen dat er drie heel leuke dingen over het werken met deze toolset zijn:
- De rijkdom van open-source bibliotheken voor interfacing met andere hardwarecomponenten
- De mogelijkheid om niet-Arduino boards (zoals de ESP8266) integreren in hun bouwsysteem
- Een hardware abstraction layer waarmee u program (min of meer) onafhankelijk van de specifieke micro-controller die u gebruikt.
Ja, ik weet dat een heleboel zeer vocale mensen daar kijk op het ecosysteem van de Arduino met minachting en beweren dat iemand die niet program rechtstreeks naar de specifieke hardware-interface en schrijven van elke bibliotheek vanaf nul is niet een echte programmeur. Ik ben het oneens, maar dat onderwerp is sinds beat ter dood lang geleden, de debatten kunnen worden verzonden naar/dev/null.
Functionele Prototyping
Al mijn eerste prototyping werd uitgevoerd op een Arduino Uno aangesloten op mijn laptop en met behulp van serieel naar opdrachten van het toetsenbord leest en resultaten naar het scherm afdrukken. Dit liet mij te concentreren op hoe om te lezen, store & replay van de RF-opdrachten zonder vast te lopen door problemen met WiFi en de web-interface.
* Pro Tip * - vanaf het allereerste begin, ik schreef de kern-logica als een set van zelfstandige klassen volledig onafhankelijk van welke gebruiker interface werd gebruikt door de testrijder. Terwijl ik prototyping was, ik lees opdrachten via het toetsenbord, geparseerd hen, de juiste methoden aangeroepen vanuit code van mijn bibliotheek en resultaten op het scherm weergegeven. Toen ik naar een web-gebaseerde interface op de ESP8266 verhuisde, de bibliotheek gleed middenin aangezien er geen afhankelijkheden op de UI. Configuratieparameters graag GPIO pin toewijzingen als constructor parameters worden doorgegeven aan de klasse op het hoogste niveau bibliotheek. In de belangrijkste bronbestand (de Ino in Arduino-land) zijn er een aantal #ifdefs die deze juist afhankelijk van het type van de Raad van bestuur dat ik ben het samenstellen voor configureren.
Wanneer een opdracht wordt ontvangen, de software draait op de juiste RF-hardware (315 ontvanger, 315 zender, 434 ontvanger of 434 zender) met behulp van de transistor gebonden aan elk van deze eenheden. Hij wacht een kleine hoeveelheid tijd om ervoor te zorgen dat de hardware is ingeschakeld en vervolgens verzendt een opdracht of voor een binnenkomende opdracht luistert.
Veiligheid
Geen. Dit is niet blootgesteld buiten mijn lokaal netwerk, dus ik lui in het belang van tijd doorbrengen met mijn familie ben. Eerlijk gezegd, als u besluit om buste via mijn brandhout en het enige wat u vinden kunt om te doen is mijn kerstverlichting inschakelen en uitschakelen herhaaldelijk, goed... u mag niet helemaal nog niet klaar voor anoniem zijn.
Volgend vakantieseizoen, kan ik een MAC whitelist en sommige rudimentaire gebruikersreferenties toevoegen. Ik dacht ook over het toevoegen van enkele logica die u uit voor een tijdje sluizen als u probeert tot uitgifte van meer dan N commando's in een uur. Voor nu is het losgekoppeld, dus het is vrij veilig.
Software hergebruik
Zoals ik al zei, is zijnde kundig voor hergebruik bestaande bibliotheken een enorme productiviteit impuls. Voor dit project, zijn er twee bibliotheken in het bijzonder dat ik maakte gebruik van.
RCSwitch - Arduino library voor afstandsbediening outlet wissels en kruisingen
Deze bibliotheek (http://code.google.com/p/rc-switch/) maakt het zeer eenvoudig om de interface met de RF-ontvangers en zenders. Ik heb uiteindelijk het nogal zwaar wijzigen aanpassen aan mijn name moet maar het was een geweldig startpunt en liet me de antwoorden die ik nodig had om dingen werken.
ESP8266WebServer - Dead eenvoudige web-server
Deze code van Ivan Grokhotkov is een goed uitgangspunt voor het schrijven van een eenvoudige webserver.
Als ik verder gezien heb, is het door staande op de schouders van reuzen. --Isaac Newton
Dat citaat een beetje pretentieus voor een dergelijk alledaagse project is, maar ik vind het belangrijk om te erkennen het werk van andere mensen die deze software veel eenvoudiger dan het schrijven zou zijn geweest anders. Bedankt.