Paso 25: Cómo los programas de Python funcionan
Hay dos cliente programas Python utilizados en este instructable para crear al Raspberry Pi Internet Monitor.
RPI-internet-monitor.py
El primer programa de "rpi-internet-monitor.py" se inicia con el comando:
en el archivo de sistema "/ etc/network/interfaces". Se ejecuta el comando "después en" cuando las interfaces de red están funcionando.
Listados 1 a 5 muestran el código fuente del programa rpi-internet-monitor.py:
Líneas 3-17 (Listado 1) las bibliotecas de importación necesitada y definir constantes que se utilizarán en el programa.
- Líneas 3-6 importar las bibliotecas que se requiere para emitir comandos del sistema, obtener el tiempo y permitir el programa de lectura y escritura de los pines GPIO.
- Línea 8 define el pin GPIO decía si se presionó el botón del interruptor de apagado.
- Línea 9 definir el pin GPIO usado para controlar la iluminación de la luz en el interruptor de apagado.
- Líneas 10-12 define los pines GPIO usados para controlar la iluminación de los LEDs en la luz de la torre.
- Línea 14 establece el número de segundos de espera entre el comando "ping".
- Línea 15 establece el número de segundos de espera entre la emisión de las pruebas de qué tan bien está funcionando la conexión a internet.
- Línea 17 enumera los sitios que son un ping para ver qué tan bien está funcionando la conexión a internet. Google siempre es una buena opción. Elegí a Comcast por ser mi proveedor de internet. Estos pueden cambiarse por lo que usted desee y puede otros sitios a la lista así.
Líneas 19-22 (Listado 1) definir la función de "debug_message". Esta función se utiliza para imprimir mensajes que ayudan a depurar el programa de Python "rpi-internet-monitor.py" si no funciona correctamente. Depuración se activa ejecutando el programa con el debug switch - como sigue:
- Líneas 21-22 Compruebe ver si la variable de entrada "debug_indicator" se establece en "True" y si es así, imprimir el mensaje especificado "output_message", caso contrario no hay mensajes se imprimen.
Líneas 24-34 (Listado 2) definen la función "ping". La función de ping emite el comando "ping" del sistema para determinar si el sitio especificado por "sitio" es accesible. Esta función devuelve un cero si el ping no fue exitoso y uno si el ping fue exitoso.
- Línea 26 construye el comando de Linux para hacer el ping.
- Línea 28 emite el comando mediante la función "check_output" de la biblioteca "subproceso".
- Línea 29 dice el python del programa para ejecutar las líneas 30 y 31 si falla el comando (por ejemplo, el sitio no es accesible).
- Línea 30 imprime un mensaje de depuración que indica que el sitio no es accesible.
- Línea 31 devuelve un cero a la función que se llama "ping".
- Línea 32 es donde continúa la ejecución si el ping fue exitoso.
- Línea 33 imprime un mensaje de depuración que indica que el sitio es accesible.
- Línea 34 devuelve uno a la función que se llama "ping".
Líneas de 36-46 (Listado 2) definir la función de "ping_sites". El "ping_sites" función pings cada uno de los sitios especifican en "site_list" el número de veces especificado por "tiempos" con un retraso en segundos entre los pings especificados por "wait_time".
- Línea 39 establece el número de pings éxito a cero.
- Línea 40 establece el número de pings que se intentará multiplicando el número de intentos especificado por "tiempos" por el número de los sitios enumerados en "site_list".
- Línea 41 crea un bucle que se ejecuta el número de veces especificado por "times".
- Línea 42 crea otro bucle que se ejecutará para cada sitio en "site_list".
- Línea 43 llama ping y agrega el valor devuelto por "ping" (cero si no se consigue, uno si tiene éxito) para el número de pings de éxito.
- Línea 44 llama a la función del sistema "time.sleep" a esperar a que el número de segundos especificado por "wait_time".
- Línea 45 se ejecuta después de han completado todos los lazos y grabados que se trató de un mensaje de depuración que indica qué porcentaje de los pings fueron exitosos.
- Línea 46 devuelve el porcentaje de pings que tuvieron éxito a la función que se llama "ping_sites".
Líneas 48-53 (Listado 3) definen la función de "lamp_amber_on". Esta función se llama para encender la lámpara color ámbar para indicar cuando la conexión a internet está funcionando pero no es óptima.
- Línea 50 imprime un mensaje de depuración que indica que la función fue llamada.
- La línea 51 utiliza la función "salida" en la biblioteca GPIO para asegurarse de que la lámpara roja está apagada.
- Línea 52 utiliza la función de "salida" en la biblioteca GPIO para encender la luz ámbar se enciende.
- Línea 53 utiliza la función de "salida" en la biblioteca GPIO para asegurarse de que la lámpara verde está apagada.
Líneas 55-60 (Listado 3) definen la función de "lamp_green_on". Esta función se llama para encender la lámpara verde para indicar cuándo está funcionando la conexión a internet.
- Línea 57 imprime un mensaje de depuración que indica que la función fue llamada.
- Línea 58 utiliza la función de "salida" en la biblioteca GPIO para asegurarse de que la lámpara roja está apagada.
- Línea 59 utiliza la función de "salida" en la biblioteca GPIO para asegurarse de que se apaga la lámpara color ámbar.
- Línea 60 utiliza la función "salida" en la biblioteca GPIO para encender la lámpara verde.
Líneas 62-67 (Listado 3) definen la función de "lamp_red_on". Esta función se llama para encender la lámpara roja para indicar cuando no funciona la conexión a internet.
- Línea 64 imprime un mensaje de depuración que indica que la función fue llamada.
- Línea 65 utiliza la función de "salida" en la biblioteca GPIO para encender la lámpara roja.
- Línea 66 utiliza la función de "salida" en la biblioteca GPIO para asegurarse de que se apaga la lámpara color ámbar.
- Línea 67 utiliza la función "salida" en la biblioteca GPIO para asegurarse de que la lámpara verde está apagada.
Líneas 69-74 (listado 4) definir la función de "lamp_all_off". Esta función se llama para apagar todas las lámparas.
- Línea 71 imprime un mensaje de depuración que indica que la función fue llamada.
- Línea 72 utiliza la función de "salida" en la biblioteca GPIO para asegurarse de que la lámpara roja está apagada.
- Línea 73 utiliza la función de "salida" en la biblioteca GPIO para asegurarse de que se apaga la lámpara color ámbar.
- Línea 74 utiliza la función "salida" en la biblioteca GPIO para asegurarse de que la lámpara verde está apagada.
Líneas 76-88 definen la función de "lamp_test". Esta función es consumida durante el arranque del programa para probar las lámparas. La función parpadea todas las lámparas en secuencia cinco veces con un décimo de una demora de segundos entre destellos.
- Línea 78 imprime un mensaje de depuración que indica que es a partir de la prueba de la lámpara.
- Línea 79 establece la demora entre destellos a una décima de segundo.
- Línea 80 crea un bucle que ejecutar ejecutar líneas 81-86 cinco veces.
- Línea 81 utiliza la función del sistema "time.sleep" a esperar a que un décimo de segundo.
- Línea 82 llamadas "lamp_red_on" para encender sólo la luz roja.
- Línea 83 espera una décima de segundo.
- Línea 84 llamadas "lamp_amber_on" para encender sólo la luz ámbar.
- Línea 85 espera una décima de segundo.
- Línea 86 llamadas "lamp_green_on" para encender sólo la luz verde.
- Línea 87 se ejecuta después de que el bucle termina y llama a la "lamp_all_off" para apagar todas las lámparas.
- Línea 88 imprime un mensaje de depuración que indica que ha completado la prueba de la lámpara.
Líneas 90-127 (listado 5) es el programa principal.
Líneas 92-99 verificar se deben imprimir las opciones pasadas al programa para determinar si los mensajes de depuración.
- Línea 93 establece "debug" en False, que indica que si el comando no tiene la opción de depuración especificados que mensajes de depuración no se deben imprimir.
- Línea 94 utiliza la variable de sistema "sys.argv" para ver si las opciones que fueron especificadas en la línea de comandos. Si fueran, se ejecutarán las líneas 95-99.
- Línea 95 comprueba si "-debug" fue especificado.
- 96 de línea se ejecuta si "-debug" fue especificado y establece el valor de "debug" True indicando que se deben imprimir los mensajes de depuración.
- Línea 97 hace líneas 98 y 99 si algo distinto "-debug" fue especificado.
- Línea 98 imprime un mensaje de error que indica que se ha especificado una opción desconocida y lo que era.
- Línea 99 se detiene el programa con un código de error de 1 debido a la opción desconocida.
Líneas 101-105 configuración de los pines GPIO utilizados el programa para el control de las lámparas.
- Línea 102 utiliza la función "setmode" de la biblioteca GPIO para establecer el esquema de numeración que se utilizará el programa para los pines GPIO
- Línea 103 utiliza la función "setup" de la biblioteca GPIO para configurar el pin utilizado para el control de la luz verde a un pin de salida.
- Línea 104 utiliza la función de "configuración" de la biblioteca GPIO para fijar el perno usado para controlar la lámpara ámbar a un pin de salida.
- Línea 105 utiliza la función "setup" de la biblioteca GPIO para configurar el pin utilizado para el control de la luz roja a un pin de salida.
Líneas 107-111 flash las luces para indicar que el programa es a partir y dejar la lámpara ámbar en hasta que el programa inicia las pruebas del estado de la conexión de internet.
- Línea 108 utiliza la función "turn_all_off" para apagar todas las lámparas.
- Línea 109 utiliza la función "lamp_test" a parpadear las luces en secuencia cinco veces.
- Línea 110 espera medio segundo.
- Línea 111 utiliza la función "lamp_amber_on" para encender la lámpara color ámbar.
Líneas 113-126 es el bucle principal que hace ping a sitios, enciende la lámpara adecuada en base a las repeticiones, los pings y esperas hasta que se pulsa el interruptor de apagado o se apaga.
- Línea 114 establece el número de pruebas a cero.
- Línea 115 crea un bucle que se ejecutará hasta que el interruptor de apagado se presiona o se apaga.
- Línea 116 agrega un número de pruebas de funcionamiento.
- Línea 117 imprime un mensaje de depuración que indica que es a partir de una prueba.
- Línea 118 llama a la función de "ping_sites" especificando la lista de sitios para probar, el retraso entre pings y el número de pings que hacer.
- Líneas 119 y 120 Compruebe para ver si el porcentaje de pruebas acertados fueron cero y, si es así, utilizan la función "lamp_red_on" para encender la lámpara roja.
- Líneas 121 y 122 Compruebe para ver si el porcentaje de pruebas fue menor o igual al 50% y, si es así, utilizan la función "lamp_amber_on" para encender la lámpara color ámbar.
- Líneas 123 y 124 se ejecutan si el porcentaje de pruebas acertados fueron entre 51% y 100% y utilizan el "lamp_green_on" para encender la lámpara verde.
- Línea 125 imprime un mensaje de depuración que indica que el programa esperará el número especificado de segundos antes de ejecutar la siguiente prueba.
- Línea 126 utiliza la función del sistema "time.sleep" para esperar el número de segundos especificado. Después de la demora, el programa vuelve a la línea 116.
RPI-alto-btn.py
El segundo programa "rpi-fin-btn.py" se inicia durante el proceso de arranque mediante el comando
en el archivo de sistema "/ etc/rc.local". El "&" al final del comando hacen que el programa ejecute como un proceso separado que sigue funcionando hasta que salga el programa.
El listado 6 muestra el código fuente del programa rpi-alto-btn.py:
Las líneas 2-13 inicializan el programa.
- Líneas 2-3 importar las librerías necesarias para controlar los dispositivos conectados a los pines GPIO, comandos de edición del sistema, permite al programa dormir.
- Líneas 6 y 7 definen el pin que supervisará el interruptor de apagado y el pin que controla la iluminación del LED en el interruptor.
- Línea 8 utiliza la función "setmode" de la biblioteca GPIO para establecer qué esquema de numeración el programa utilizará para los pines GPIO.
- Línea 9 utiliza la función "setup" de la biblioteca GPIO para configurar el pin GPIO para controlar el LED en el interruptor para ser un pin de salida.
- Línea 10 utiliza la función "setup" de la biblioteca GPIO para configurar el pin GPIO para monitorear el interruptor para prensas a un pin de entrada.
- Línea 11 utiliza la función de "salida" de la biblioteca GPIO para iluminar el LED en el interruptor por el valor del pin en true.
- Línea 13 imprime un mensaje que indica que el interruptor ahora se está controlando.
Línea 18 utiliza la función "wait_for_edge" de la biblioteca GPIO para causar el programa esperar el cambio a ser presionado.
Líneas 19-21 se utilizan para la depuración. Se ejecutará cuando el programa se ejecuta desde la línea de comandos y pulse Ctrl/C estas líneas.
- Línea 20 a imprimir un mensaje que indica que el usuario detiene el programa.
- Línea 21 utiliza la función de "limpieza" de la biblioteca GPIO para detener la supervisión de los pines GPIO.
Líneas 22-26 se ejecutan presionando el interruptor de apagado.
- Línea 23-25 causa el LED en el interruptor para apagar brevemente para proporcionar información al usuario que se presionó el interruptor.
- Línea 22 imprimirá un mensaje que indica que se oprimió el interruptor de apagado.
- Línea 23 utiliza la función de "salida" de la biblioteca GPIO para apagar el LED.
- Línea 24 hace que el programa a dormir durante medio segundo.
- Línea 25 nuevamente enciende el LED.
- La línea 26 utiliza la función "subprocess.call" para ejecutar el comando "sudo halt" que hará que el Pi de frambuesa para apagar.
Cuando el Raspberry Pi ha apagado el LED en el interruptor de apagado apaga indicando que es seguro desconectar la cámara de la toma de corriente.