Stap 9: Programma je Arduino
De volledige broncode van de Arduino is aangesloten. Als u niet geïnteresseerd bent in het wijzigen of leren hoe het werkt, kunt u gewoon downloaden en implementeren. Als u zien hoe het werkt wilt, lees deze stap en bladert u door de code.
Vanaf evt_loop.cpp, roept het programma eerst evt_loop_init. Vervolgens noemt het herhaaldelijk event_loop_proc voor onbepaalde tijd, totdat de Arduino macht verliest. Kijkend naar deze twee functies, ziet u dat het merendeel van de Arduino code is gecentreerd rond het idee van berichtenwachtrijen . Berichtenwachtrijen zijn nuttig zijn in situaties waar een systeem nodig heeft om te praten met een ander op een asynchrone wijze. In onze situatie hebben we een Bluetooth-modem die gegevens te allen tijde kan worden ontvangen. Een heleboel werk gaat in het algemeen, ervoor te zorgen dat gegevens nooit verloren, ongeacht wat het apparaat doet wanneer het bericht aankomt. Gelukkig, de Arduino Uno heeft een ingebouwde 128-byte hardware seriële buffer. Aangezien elke één van onze berichten Bluetooth 1 byte, zal deze buffer waarschijnlijk meer dan genoeg voor onze applicatie. Dus zit onze applicatie in een lus, wachten op een bericht vandaan Bluetooth in. In een commercieel product is het typisch voor de microcontroller te gaan een spaarstand slaapmodus om energie te besparen. Voor eenvoud, dat hebben we niet gedaan hier (Zie bt.cpp van bt_wait_for_msgs functie).
Wanneer een bericht aankomt in de Bluetooth wachtrij (Zie bt.cpp van bt_check_for_msgs functie), de gegevens lezen en aan een berichtrij ingezet voor het verwerken van gegevens vanuit de Bluetooth-module toegevoegd. We doen dit omdat we onze microcontroller wilden te zijn vrij om andere dingen te doen wanneer het berichten niet verwerkt. De berichtenwachtrij is zoals een postbus. De volgende keer dat het programma een kans krijgt, zal het de mailbox controleren en zien of er geen berichten voor het. Geen gebruik maakt van een berichtrij lijkt luid schreeuwen uit de kamer. In dat geval zou alles moeten stoppen en onmiddellijk de opdracht dienst voordat hij terugkeerde naar wat het aan het doen was. De functie van de msgq_push (gedefinieerd in msgq.cpp) geeft als resultaat een verscheidenheid van responscodes (gedefinieerd in msgq.h) die een verschillende aantal wachtrij voorwaarden aangeven. Bijvoorbeeld, als het programma nooit gecontroleerd zijn postvak, is het mogelijk voor deze wachtrij te vullen. In dat geval zou de antwoord waarde aangeven dat de wachtrij vol was. Dit zorgt voor het afhandelen van fouten die is een essentieel onderdeel van ontwikkeling van de embedded systeem.
Terug in evt_loop_proc, is het bericht gelezen in een lokale variabele. Bovendien, wordt een pointer naar een antwoord-type doorgegeven. Het en-teken (&) voordat de variabele rsp betekent dat rsp het adres in het geheugen wordt paseed in msgq_pop, in tegenstelling tot de waarde ervan. Als u nog niet gehoord van dit concept voordat, IBM weet heel veel over, en ze zou graag die informatie aan u onthullen. Deze aanwijzer vertelt msgq_pop een locatie in het geheugen waar het de antwoord waarde kan zetten. Het is soort van als een manier om een functie voor het retourneren twee waarden--het bericht en de status.
Na het nemen van het bericht uit de wachtrij (vergelijkbaar met het nemen van de brief uit de postbus), wordt de respons gecontroleerd. Als de operatie niet succesvol was, de gehele Bluetooth-berichtenwachtrij wordt teruggesteld en het programma blijft. Er is niet echt een heel stuk anders die het programma zou kunnen in deze staat doen.
Als het programma het verleden dat fout terug maakt, wordt er gekeken naar de waarde van het bericht. Als het bericht was een '1', behandelt het een estafette. Als het was een '2', behandelt het andere. Iets anders, en het gaat voorbij aan het bericht.
Onze apparaat niet over een manometer, dus er geen manier voor de Android app om te weten is of de vaten zijn drukkend of niet. Dientengevolge, is gezien genoeg perslucht, het mogelijk dat er nog genoeg druk links om te schieten twee keer zonder te vullen van de tank worden. Om dit te verklaren, zal de Arduino automatisch sluiten de estafette één seconde, nadat het is geopend. Hiermee voorkomt u dat extra lucht wordt verspild wanneer het vat leeg is. De code waarmee verwerkt schakelen de Relais is beschikbaar in relay.cpp.
Om deze automatisch sluiten, we gebruiken een timer. Meeste microcontrollers hebben hardware timers voor hoge-precisie timing, dus in dit voorbeeld een goede introductie is. Neem een kijkje op timer.h en timer.cpp als u geïnteresseerd bent in het leren meer over de werking van de timer. Zodra een geldig Bluetooth-bericht heeft ontvangen, de bijbehorende estafette is onmiddellijk gesloten (evt_loop.cpp de evt_loop_proc functie), waardoor de huidige stroom van de batterij naar de sprinkler-klep. Vervolgens is een timer ingesteld op verlopen in één seconde (1.000.000 microseconden in de code). Vervolgens is de callback functie ingesteld op evt_loop_handle_timer, die de timer-module noemen zullen zodra de opgegeven hoeveelheid tijd is verstreken.
Binnen evt_loop_handle_timer, worden beide Relais geopend, die stopt de luchtstroom uit beide vaten. We dachten dat dit zou de eenvoudigste benadering. Zodra een opdracht is verwerkt, evt_loop_proc heet weer (van cannon.pde) en het proces herhaalt.
Zodra je Arduino is geprogrammeerd, wordt deze automatisch gestart met het uitvoeren van uw programma wanneer u de stroomtoevoer via een 9V batterij.