Automatiska bevattningssystem (3 / 5 steg)
Steg 3: Programvaran
Den grundläggande strukturen av programvaran är en start-up rutin som initierar alla kringutrustning följt av ett statligt block som gör att systemet att växla mellan olika lägen. Det finns också flera timers och avbryta hanterare som bearbetar information på ett visst intervall eller monitor utanför kringutrustning för indata. Var och en av sensorerna kan delas upp i enskilda moduler (utom inre temperatursensorn). Du hittar modulerna som bibliotek i katalogen drivers. De metoder som skall användas offentligt utanför modul start med moduler namnen. Koden bör vara ganska väl kommenterade.
Jag har postat programvaran på min git konto så att jag kan publicera uppdateringar som jag expandera systemet och rätta buggar jag stött på.
Den grundläggande fördelas enligt följande:
Zoner:
Zonerna är definierade på tiggeri av main.c. Vi har:
#define NUMBER_OF_ZONES 4
Zonen zone0 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTD_BASE, GPIO_PIN_3, 16, 53, 5};
Zonen zone1 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_1, 16, 54, 3};
Zonen zon†2 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_2, 16, 59, 3};
Zon 3 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_3, 16, 57, 3};
Zonen * zoner [NUMBER_OF_ZONES] = {& zone0, & zone1, & zon†2, & 3};
Under hela programvaran använder vi NUMBER_OF_ZONES #define för att iterera igenom zonerna. Vi använder en matris med pekare till alla zoner snabbt åt dem utan att behöva göra flera kopior i minnet. Definitionerna är sedan ganska enkelt. Varje zon är en struktur som innehåller egenskaperna: Status, OverrideStatus, Port, Pin, OnHour, OnMinute och OnLength. Du kan lägga till så många som du kan hitta GPIO för, lägga pekaren till i matrisen och uppdatera NUMBER_OF_ZONES #define för att ange antalet zoner du har.
Systemet lägen:
KÖR:
Detta är vår primära läge. För detta läge vi ange status LED färg till grön, väl dra den aktuella tiden från DS1307 och vi kontrollera aktuell zon status baserat på vår nya tid.
OMSTÄLLNING:
ÅSIDOSÄTTA är utformat för en omställning av hela systemet. Detta inträffar när användaren trycker på knappen kapacitiv för en viss tid. I detta läge ange vi status LED färg till rött och sedan kontrollera om systemet har varit igång i åsidosätter i 24 timmar. Om vi har vi klara omställning status och återvända för att köra läge. Om vi inte har vi fortsätta att lämna systemet i åsidosätter.
SYSTEM_SHUTDOWN:
SYSTEM_SHUTDOWN läge är avsett för säkerhet kritisk avstängning. För närvarande är den enda modul som kunde genomföra avstängning av interna temperaturgivaren. Varje gång vi kontrollera inre temperatursensor vi jämför det med en tröskel. Om vi antar den tröskel som vi går in i detta läge var vi rensa alla zoner, vända den röda lysdioden på stadig, inaktivera alla timers och avbrott och sedan gå in i viloläge. Det enda sättet att gå ur detta läge är av en användare trycka på aktiveringsknappen i startfönstret själv.
Avbrotten:
Knappen Avbryt:
Knappen avbrottshanterare har två delar. De första handtag när knappen är nedtryckt. Detta kommer att växla en flagga som säger att vi såg en knapp tryck, vrid den blå lampan och starta Timer 0 som helt enkelt kommer att öka en räknare. När knappen släpps kommer vi stänga av den blå lampan, inaktivera timern 0 och utvärdera hur länge du trycker på knappen. För närvarande är det enda villkoret kontrolleras för ett system omställning som är ett knapptryck på 2 sekunder. Om vi upptäcker en systemåtgärd omställning vi växla baserat på det nuvarande körningsläget. För att ange systemet åsidosätter vi flash röd lysdiod för bekräftelse och anger läget till omställning. För att lämna systemet omställning vi klara alla zon åsidosättningar, flash grön LED för bekräftelse, och Ställ in läge för att köra.
General Timer 1 avbrott:
Detta är en en andra timer som vi använder för att kontrollera sensorn input och skriva ut till UART. När man kommer in på avbryta tydliga vi flagg. Så kolla vi intern temperaturgivare temperaturgivaren luftfuktighet/ext. och fukt sensorn. Dessa värden sparas i respektive område. Vi trycker sedan status för alla mätningar och zoner till UART. Om en användare har USB debug porten ansluten till en PC och öppnade en terminal de bör se ett meddelande som följande utskrift varje sekund:
TID: 18:46:27
INT TEMP: 86
EXT TEMP: 78
REL HUM: 53
FUKT: 54
ZON 0: INTE AKTIV
ZON 1: INTE AKTIV
ZON 2: INTE AKTIV
ZON 3: INTE AKTIV
Innan vi lämnar allmänna timer avbrottet kontrollerar vi om våra en andra timer har drabbat en multipel av 10. Om det har växla vi status ledde på, om inte vi växla led av, och då vi ökar värdet för räknaren. Detta ger oss en fin indikator till användaren visar att systemet körs fortfarande och vilket läge det är för närvarande i. LED ger bara en snabb blixt varje tio andra
Moduler:
AMS:
AMS_InitSensor - initialiserar AMS på ADC1 sekvens 0
AMS_ReadSensor - läser sensor medelvärde (256 prover)
DS1307:
DS1307_GetTime - blir aktuell tid från DS1307
DS1307_SetTime - uppsättningar DS1307 till angiven tid
bcdToDec - konverterar binary coded decimal värde till decimalvärde
decToBcd - konverterar decimaltal till binary coded decimal värde
HIH6130:
HIH6130_UpdateData - läser data från HIH6130
HIH6130_GetStatus - returnerar HIH6130 status
HIH6130_GetHumidity - returnerar HIH6130 luftfuktighet läsning
HIH6130_GetTemperature - returnerar HIH6130 temperaturavläsningen
I2C:
I2C_SetupI2C3 - Setup förlopp för I2C3
I2C_SendSlaveStart - skickar slavadress och börja lite följt av en stoppbit
I2C_ReadBytes - läser n antal byte
I2C_ReadBytesFromAddress - läser n antalet byte från adress
I2C_ReadSingleByte - läser enda byte från adress
I2C_WriteByte - skriver enda byte till adress
I2C_WaitForDone - väntar på ledar-I2C bussen att rensa
I2C_Delay - förseningar millisekunder
UART:
UART_SetupUART0 - Setup rutin för UART0
UART_PrintMessage - utskrifter rad tecken till UART
UART_PrintLong - utskrifter lång värde till UART