Stap 3: De Software
De basisstructuur van de software is een start-up-routine die initialiseert alle van de randapparatuur gevolgd door een blok van de staat waarmee het systeem om te schakelen tussen verschillende modi. Er zijn ook verschillende timers en interrupt handlers die informatie op een bepaalde interval of monitor buiten randapparatuur voor input verwerken. Elk van de sensoren zijn opgesplitst in afzonderlijke modules (met uitzondering van de inwendige temperatuursensor). U vindt de modules als bibliotheken in de map drivers. De methoden die publiekelijk worden gebruikt buiten de module start met de namen van de modules. De code moet worden vrij goed commentaar.
Ik heb de software op mijn git account zodat ik updates publiceren kan als ik uit te breiden het systeem en de juiste bugs die ik tegengekomen ben.
De basis verdeling is als volgt:
De Zones:
De zones zijn gedefinieerd op het bedelen van main.c. We hebben:
#define NUMBER_OF_ZONES 4
Zone zone0 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTD_BASE, GPIO_PIN_3, 16, 53, 5};
Zone zone1 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_1, 16, 54, 3};
Zone zone2 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_2, 16, 59, 3};
Zone zone3 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_3, 16, 57, 3};
Zone * Zones [NUMBER_OF_ZONES] = {& zone0, & zone1, & zone2, & zone3};
In de software gebruiken we de NUMBER_OF_ZONES #define doorlopen van de zones. We gebruiken een serie van wijzers aan elk van de zones te snel openen zonder dat u hoeft te maken van meerdere exemplaren in het geheugen. De definities zijn dan vrij eenvoudig. Elke zone is een structuur met de eigenschappen: Status, OverrideStatus, poort, Pin, OnHour, OnMinute en OnLength. U kunt zo veel als de aanwijzer aan de array kunt u GPIO, toevoegen en bijwerken van de NUMBER_OF_ZONES #define om aan te geven van het aantal zones hebt.
Systeem de modi:
RUN:
Dit is onze primaire modus. Voor deze modus stellen we de status LED kleur groen, trekken ook de huidige tijd van de DS1307, en vervolgens controleren we de huidige status van de zone op basis van onze nieuwe tijd.
OVERSCHRIJVEN:
OVERSCHRIJVEN-modus is ontworpen voor een overschrijving van het gehele systeem. Dit gebeurt wanneer een gebruiker op de capacitieve drukt voor een vast bedrag van tijd. In deze modus Stel we de status LED kleur rood en vervolgens controleren als het systeem is uitgevoerd in de modus override voor 24 uur. Als we al we duidelijk de status van overschrijven en terug naar de uitvoermodus. If we haven't we doorgaan met het verlaten van het systeem in de modus override.
SYSTEM_SHUTDOWN:
De SYSTEM_SHUTDOWN-modus is bedoeld voor veiligheid kritieke afsluiten. Momenteel is de enige module die afsluiten van het systeem kon worden geïmplementeerd de interne temperatuursensor. Elke keer als we de interne temperatuursensor controleren we het vergelijken met een drempel. Als we de drempel die we invoeren deze modus waar wij duidelijk dat elk van de zones passeren, schakelt de rode LED op stabiele, alles van de timers en interrupts uitschakelen en dan in slaapstand gaan. De enige manier om af te sluiten van deze modus is door een gebruiker op de knop van de wake op de Launchpad zelf.
De Interrupts:
Knop onderbreken:
De knop interrupt handler bestaat uit twee delen. De eerste grepen wanneer de knop wordt gedrukt. Dit zal een vlag zeggen zagen we een knop druk op de blauwe LED inschakelen en Timer 0 die gewoon een teller zal ophogen start in-/ uitschakelen. Wanneer de knop wordt vrijgegeven zullen wij uitschakelen van de blauwe LED, uitschakelen van de Timer 0 en evalueren van de duur van de druk op de knop. Momenteel is de enige voorwaarde gecontroleerd voor een systeem overschrijven die een druk op de knop van 2 seconden is. Als we detecteren een systeem override actie die we overschakelen op basis van de huidige run modus. Voor het invoeren van de modus override de systeem we de rode LED voor bevestiging flash, en de modus instelt op OVERRIDE. Systeem overschrijven die we duidelijk alle zone overschrijvingen, flash de groene LED voor bevestiging, en verlaten de modus instelt op RUN.
Algemene Timer 1 onderbreken:
Dit is een een tweede timer die we gebruiken zullen om te controleren van de sensor input en afdrukken naar de UART. Bij binnenkomst van de interrupt wissen we de markering. Vervolgens controleren we de interne temperatuursensor en de vochtigheid/ext.-temperatuursensor de vocht sensor. Deze waarden krijgen opgeslagen in hun respectieve gebieden. Wij drukken vervolgens de status van alle metingen en zones aan de UART. Als een gebruiker de USB heeft-poort aangesloten op een PC debug en een terminal geopend moeten ze een bericht als het volgende zien elke seconde afdrukken:
TIJD: 18:46:27
INT. TEMP: 86
EXT TEMP: 78
REL HUM: 53
VOCHT: 54
ZONE 0: NIET ACTIEF
ZONE 1: NIET ACTIEF
ZONE 2: NIET ACTIEF
ZONE 3: NIET ACTIEF
Voordat we de algemene timer onderbreken vertrekken controleren we als de onze een tweede timer een veelvoud van 10 heeft getroffen. Als het schakelen we de status led op, als niet wij weg van een knevel het lampje, en dan we de teller verhogen. Dit geeft ons een mooie indicator om de gebruiker te laten zien dat het systeem nog draait en welke modus is het momenteel in. De LED zal enkel een snelle flits elke tien seconden
De Modules:
AMS:
AMS_InitSensor - geïnitialiseerd AMS op ADC1 volgorde 0
AMS_ReadSensor - leest gemiddelde waarde van de sensor (256 samples)
DS1307:
DS1307_GetTime - krijgt huidige tijd van DS1307
DS1307_SetTime - Sets DS1307 naar bepaalde tijd
bcdToDec - bekeerlingen binary coded decimal waarde naar decimale waarde
decToBcd - zet decimale waarde wilt binary coded decimal waarde
HIH6130:
HIH6130_UpdateData - leest gegevens uit HIH6130
HIH6130_GetStatus - geeft als resultaat HIH6130 status
HIH6130_GetHumidity - geeft als resultaat HIH6130 vochtigheid lezen
HIH6130_GetTemperature - geeft als resultaat HIH6130 temperatuurmetingen
I2C:
I2C_SetupI2C3 - Setup-proces voor I2C3
I2C_SendSlaveStart - stuurt slaaf adres en start bit gevolgd door een stopbit
I2C_ReadBytes - leest n aantal bytes
I2C_ReadBytesFromAddress - leest n aantal bytes van adres
I2C_ReadSingleByte - leest één byte van het adres
I2C_WriteByte - schrijft één byte naar adres
I2C_WaitForDone - wacht voor I2C Master bus wissen
I2C_Delay - vertragingen milliseconden
UART:
UART_SetupUART0 - installatieroutine voor UART0
UART_PrintMessage - Prints serie van karakters aan UART
UART_PrintLong - Prints lange waarde UART