Paso 3: El Software
La estructura básica del software es una rutina de puesta en marcha que inicializa todos los periféricos seguidos de un bloque de estado que permite el sistema cambiar entre diferentes modos. También hay varios temporizadores y controladores de interrupción que procesan la información en un cierto intervalo o monitor fuera de periféricos de entrada. Cada uno de los sensores se dividen en módulos individuales (excepto el sensor de temperatura interna). Encontrarás los módulos como las bibliotecas en el directorio drivers. Los métodos que se utilizan públicamente fuera el inicio de módulo con los nombres de los módulos. El código debe ser muy bien comentado.
Acabo de publicar el software en mi cuenta de git que puedo publicar actualizaciones como que ampliar el sistema y corregir errores que me cruzo.
La composición básica es la siguiente:
Las zonas:
Las zonas se definen en la mendicidad de main.c. Tenemos:
#define NUMBER_OF_ZONES 4
Zona zone0 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTD_BASE, GPIO_PIN_3, 16, 53, 5};
Zona zone1 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_1, 16, 54, 3};
Zona zone2 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_2, 16, 59, 3};
Zona zone3 = {ZONE_OFF, OVERRIDE_INACTIVE, GPIO_PORTE_BASE, GPIO_PIN_3, 16, 57, 3};
Zona * zonas [NUMBER_OF_ZONES] = {& zone0, & zone1, & zone2, & zone3};
Todo el software que utilizamos NUMBER_OF_ZONES #define para recorrer las zonas. Utilizamos una matriz de punteros a cada una de las zonas para acceder a ellos rápidamente sin tener que hacer múltiples copias en la memoria. Las definiciones son entonces bastante sencillas. Cada zona es una estructura que contiene las propiedades: Estado, OverrideStatus, puerto, Pin, OnHour, OnMinute y OnLength. Puede añadir tantos como usted puede encontrar GPIO, añadir el puntero a la matriz y actualizar NUMBER_OF_ZONES #define para indicar el número de zonas que tiene.
Modos:
EJECUTAR:
Este es nuestro modo primario. De este modo configura el estado LED de color verde, bien tirar el tiempo actual del DS1307, y luego revisamos el estado actual de la zona basado en nuestro tiempo nuevas.
ANULACIÓN:
ANULAR modo está diseñado para reemplazar todo el sistema. Esto ocurre cuando el usuario presiona el botón capacitivo para una cantidad de tiempo. En este modo configura el estado LED de color rojo y luego verificar si el sistema ha estado funcionando en el modo de anulación durante 24 horas. Si hemos sido claro el estado de anulación y volver al modo de ejecución. Si nosotros no seguimos a dejar el sistema en el modo de anulación.
SYSTEM_SHUTDOWN:
El modo SYSTEM_SHUTDOWN está diseñado para cierre crítico de seguridad. Actualmente el único módulo que podría implementar el sistema de cierre es el sensor de temperatura interna. Cada vez que compruebe el sensor de temperatura interno hacemos una comparación con un umbral. Si pasamos el umbral de en que entrar este modo donde tenemos claro cada una de las zonas, gire el LED rojo encendido fijo, desactivar todos los timers y las interrupciones y luego ir en modo de hibernación. La única manera de salir de este modo es un usuario presiona el botón wake en el Launchpad de sí mismo.
Las interrupciones:
Botón de interrupción:
El manejador de interrupción de botón tiene dos partes. La primera maneja cuando se presiona el botón. Esto alternará una bandera diciendo: vimos un botón Presione encender el LED azul e iniciar temporizador 0 que simplemente se incrementará un contador. Cuando se suelta el botón apagará el LED azul, desactivar a temporizador 0 y evaluar la duración de la pulsación. Actualmente la única condición que se comprueba es una anulación de sistema que es una prensa del botón de 2 segundos. Si se detecta una acción de anulación del sistema que cambiar basado en el modo de ejecución actual. Para entrar en el modo de anulación de sistema flash el LED rojo para confirmar y establecer el modo de anulación. Para dejar la anulación del sistema que tenemos claro todas anulaciones de zona, flash del LED verde para la confirmación y ajuste el modo a ejecutar.
Interrupción del temporizador general 1:
Se trata de un contador de un tiempo segundo que vamos a utilizar para comprobar la entrada del sensor e imprimir al UART. Al entrar en la interrupción tenemos claro la bandera. A continuación, comprobamos el sensor de temperatura interno, el sensor de temperatura humedad/EXT y el sensor de humedad. Estos valores se salva en sus respectivas áreas. Luego imprimimos el estado de todas las medidas y zonas a la UART. Si un usuario tiene el USB debug port conectado en una PC y abierto un terminal debería ver un mensaje como el siguiente impresión cada segundo:
HORA: 18:46:27
INT TEMP: 86
TEMP EXT: 78
REL HUM: 53
HUMEDAD: 54
ZONA 0: NO ACTIVO
ZONA 1: NO ACTIVO
ZONA 2: NO ACTIVO
ZONA 3: NO ACTIVO
Antes de irnos a la interrupción de temporizador general comprobamos si nuestro un segundo temporizador ha golpeado a un múltiplo de 10. Si tiene nos cambia el estado del led encendido, si no cambiar el led apagado, y luego aumentamos el contador. Esto nos da un buen indicador para el usuario al mostrar que el sistema sigue funcionando y que modalidad es actualmente. El LED dará sólo un rápido destello cada 10 segundos
Los módulos de:
AMS:
AMS_InitSensor - AMS inicializa ADC1 secuencia 0
AMS_ReadSensor - Lee promedio valor de sensor (256 muestras)
DS1307:
DS1307_GetTime - obtiene la hora actual de DS1307
DS1307_SetTime - sistemas DS1307 al tiempo especificado
bcdToDec - convierte binario codificado decimal valor en valor decimal
decToBcd - valor decimal se convierte a binario codificado decimal valor
HIH6130:
HIH6130_UpdateData - lee datos de HIH6130
HIH6130_GetStatus - regresa HIH6130 estado
HIH6130_GetHumidity - HIH6130 devuelve humedad
HIH6130_GetTemperature - devuelve HIH6130 de temperatura
I2C:
I2C_SetupI2C3 - proceso de configuración para I2C3
I2C_SendSlaveStart - dirección de esclavo envía y start bit seguido por un bit de parada
I2C_ReadBytes - Lee n número de bytes
I2C_ReadBytesFromAddress - Lee n número de bytes de la dirección
I2C_ReadSingleByte - Lee solo byte de dirección
I2C_WriteByte - escribe solo byte a la dirección
I2C_WaitForDone - espera para que el bus I2C maestro borrar
I2C_Delay - milisegundos de retraso
UART:
UART_SetupUART0 - rutina de configuración para UART0
UART_PrintMessage - matriz de impresiones de caracteres a UART
UART_PrintLong - valor long impresiones a UART