Étape 3: Le logiciel
La structure de base du logiciel est une routine de démarrage qui initialise tous les périphériques, suivis d’un bloc d’État qui permet au système de basculer entre différents modes. Il y a également plusieurs minuteries et les gestionnaires d’interruption qui traitent l’information à un certain intervalle ou moniteur en dehors des périphériques d’entrée. Chacun des capteurs sont répartis en différents modules (sauf la sonde de température interne). Vous trouverez les modules comme bibliothèques dans le répertoire drivers. Les méthodes qui doivent être utilisées publiquement à l’extérieur le début du module avec les noms de modules. Le code devrait être assez bien commenté.
J’ai posté le logiciel sur mon compte de git pour que je peux publier des mises à jour que je développe le système et les bogues corrects, que j’ai rencontré.
La répartition de base est la suivante :
Les Zones :
Les zones sont définies à la mendicité de main.c. Nous avons:
#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} ;
Zone3 zone = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_3, 16, 57, 3} ;
Zone * Zones [NUMBER_OF_ZONES] = {& zone0, & zone1, & zone2, & zone3} ;
Dans l’ensemble du logiciel, nous utilisons le NUMBER_OF_ZONES #define pour parcourir les zones. Nous utilisons un tableau de pointeurs vers chacune des zones d’y accéder rapidement sans avoir à faire plusieurs copies dans la mémoire. Les définitions sont alors assez simples. Chaque zone est une structure qui contient les propriétés : statut, OverrideStatus, Port, Pin, OnHour, OnMinute et OnLength. Vous pouvez en ajouter autant que vous pouvez trouver GPIO, ajouter le pointeur vers le tableau et mettre à jour la NUMBER_OF_ZONES #define pour indiquer le nombre de zones que vous avez.
Modes du système :
RUN :
Il s’agit de notre principal mode. Pour ce mode, nous avons mis le statut LED couleur vert, bien tirer l’heure actuelle le DS1307, et puis nous avons vérifier l’état actuel de la zone basée sur notre nouvel horaire.
SUBSTITUER :
SUBSTITUER le mode est conçu pour un remplacement de l’ensemble du système. Cela se produit lorsqu’un utilisateur appuie sur le bouton capacitif pendant un certain temps. Dans ce mode, nous avons mis le statut LED de couleur rouge, puis vérifiez si le système a fonctionné en mode remplacement pendant 24 heures. Si nous avons été nous effacer l’état de substitution et retourner au mode d’exécution. Si nous n’avons pas nous continuons à laisser le système en mode de remplacement.
SYSTEM_SHUTDOWN :
Le mode SYSTEM_SHUTDOWN est destiné pour arrêt critique de sécurité. Actuellement, le seul module qui pourrait mettre en œuvre de système d’arrêt est le capteur de température interne. Chaque fois que nous vérifions la sonde de température interne, on le compare à un seuil. Si nous passons le seuil que nous entrons dans ce mode où nous avons chacune des zones claires, éteindre le voyant rouge sur l’équilibre, désactiver toutes les minuteries et les interruptions et passez en mode hibernation. La seule façon de sortir de ce mode est par un utilisateur en appuyant sur le bouton veille sur Launchpad lui-même.
Les interruptions :
Bouton interrompre:
Le gestionnaire d’interruption bouton comporte deux parties. Les premières poignées lorsque le bouton est enfoncé. Ceci va basculer un drapeau en disant : nous avons vu un bouton appuyer sur allumer la LED bleue et démarrer la minuterie 0 qui sera simplement incrémenter un compteur. Lorsque le bouton est relâché nous éteindre la LED bleue, désactiver le Timer 0 et évaluer la durée de la touche. Actuellement, la seule condition vérifiée est une substitution de système qui est un bouton de 2 secondes. Si nous détectons une action de substitution de système que nous basculons basé sur le mode de fonctionnement actuel. Pour passer en mode remplacement système nous clignoter la LED rouge pour confirmation et définir le mode de remplacement. Pour quitter override système que nous effacer tous les remplacements de zone, clignoter la LED verte pour confirmation et définir le mode d’exécution.
Interrupt général Timer 1 :
Il s’agit d’une deuxième une minuterie que nous utiliserons pour vérifier l’entrée de capteur et d’imprimer à l’UART. En entrant dans l’interruption nous effacer l’indicateur. Ensuite, nous vérifions la sonde de température interne, la sonde de température humidité/ext. et la sonde d’humidité. Ces valeurs être sauvés dans leurs domaines respectifs. Nous imprimons ensuite l’état de toutes les mesures et les zones de l’UART. Si un utilisateur a l’USB debug port branché à un PC et a ouvert un terminal qu’ils devraient voir un message comme suit chaque seconde d’impression :
HEURE : 18:46:27
INT TEMP : 86
TEMP EXT : 78
REL HUM : 53
HUMIDITÉ : 54
ZONE 0: NON ACTIF
ZONE 1: PAS ACTIF
ZONE 2: PAS ACTIF
ZONE 3: PAS ACTIF
Avant de nous quitter l’interruption timer générales, nous vérifions si notre deuxième une minuterie a frappé un multiple de 10. Si elle a nous activer/désactiver le statut led allumée, si non nous désactiver la led, et puis on incrémente le compteur. Cela nous donne un bon indicateur à l’utilisateur de montrent que le système fonctionne toujours et quel mode il est actuellement en. La LED donnera juste un flash rapide toutes les dix secondes
Les Modules :
AMS :
AMS_InitSensor - Initialise AMS sur ADC1 séquence 0
AMS_ReadSensor - lit moyenne valeur de la sonde (256 échantillons)
DS1307 :
DS1307_GetTime - récupère l’heure actuelle du DS1307
DS1307_SetTime - ensembles DS1307 à temps spécifié
bcdToDec - valeur décimale codée en binaire convertit en valeur décimale
decToBcd - convertit la valeur décimale en valeur décimale codée en binaire
HIH6130 :
HIH6130_UpdateData - lit les données de HIH6130
HIH6130_GetStatus - statut de retours HIH6130
HIH6130_GetHumidity - humidité retours HIH6130 lecture
HIH6130_GetTemperature - lecture de la température retour HIH6130
I2C :
I2C_SetupI2C3 - procédure d’installation pour I2C3
I2C_SendSlaveStart - adresse esclave envoie et start bit suivie d’un bit d’arrêt
I2C_ReadBytes - lit n nombre d’octets
I2C_ReadBytesFromAddress - lit n nombre d’octets d’adresse
I2C_ReadSingleByte - lectures sur un seul octet de l’adresse
I2C_WriteByte - écrit un octet à l’adresse
I2C_WaitForDone - attend pour bus I2C maître effacer
I2C_Delay - millisecondes de retard
UART :
UART_SetupUART0 - routine de configuration pour UART0
UART_PrintMessage - tableau imprime des caractères d’UART
UART_PrintLong - valeur de type long tirages d’UART