Programación Python w PITOP
Programación Python w PITOP
y electrónica en lenguaje
Python
Ingeniero en Mecatrónica
Hugo Contreras Camacho
Contacto:
[email protected]
2
Objetivo General
3
¿Qué es la Raspberry?
4
5
Consideraciones importantes
Consideraciones:
6
Introducción a Python
• Es totalmente gratuito
• Python es apto para todas las plataformas
• Sus aplicaciones no se limitan en un área en concreto
7
Introducción a Python
Características:
8
Introducción a Python
Ventajas.
9
Introducción a Python
10
Abrir una consola
11
Números y Operadores aritméticos 12
Requisitos previos
13
Función Print
Print imprime en la consola del usuario un dato tipo texto, el cual deberás
introducirlo entre comillas simples o dobles para estructurarlo, de esta
manera Python lo reconocerá como dato tipo texto.
Ejemplo:
14
Variables
15
Variables
Y = 34 Entero (int)
16
Variables
Declaración de variables en C
Int x;
Float z;
String color;
18
Características de las variables
Las variables tienen ciertas reglas para que Python las pueda
reconocer correctamente:
19
Usar variables en editor de código
20
Tipos de datos
Números enteros.
Los valores que puede tomar un int son todos los números
enteros:
21
Tipos de datos
Números reales.
22
Tipos de datos
Números reales.
23
Tipos de datos
Números reales.
24
Tipos de datos
Valores Booleanos.
25
Tipos de datos
Cadena de caracteres.
26
Tipos de datos.
Cadena de caracteres.
27
Tipos de datos
Cadena de caracteres.
28
Tipos de datos
Cadena de caracteres.
29
Comentarios
30
Comentarios
32
Resultado del ejercicio con variables 33
Imprimir datos en un print
35
Errores
Error de indentación
37
Flujo de programación
38
Indentación
39
Indentación
40
Indentación
41
Ejemplo de código indentado y sin indentado
42
Identado Sin identar
Palabras reservadas en Python
43
Palabras reservadas en Python
44
Palabras reservadas en Python
Or Operador lógico
48
Funciones de entrada y salida de datos
49
Función Print
Print imprime en la consola del usuario un dato tipo texto, el cual deberás
introducirlo entre comillas simples o dobles para estructurarlo, de esta
manera Python lo reconocerá como dato tipo texto.
Ejemplo:
50
Función Input
Ejemplo:
51
Función Input
Ejemplo:
52
Conversión de tipos
Por defecto, la función input entiende que el dato introducido es una cadena,
aunque se escriba un numero. Si se requiere hacer operaciones se producirá un
error.
Para evitarlo debemos convertir el dato al tipo que necesitemos. Esto se hace
de la siguiente manera:
53
Función Input
54
Ejercicio entrada y salida de datos
Resultado esperado:
55
Solución 56
Funciones
Definición.
57
Funciones
Asignación de variables
Definición de función
Cuerpo de la función
58
Manda a llamar a la función
Ejemplo
59
Funciones
Asignación de variables
Definición de función
Cuerpo de la función
Resultado 60
Funciones predefinidas.
Función abs()
Devuelve el valor absoluto de un número. El argumento puede ser un entero
normal o largo o un número de coma flotante. Si el argumento es un número
complejo, se devuelve su módulo.
61
Funciones predefinidas
Función Range()
62
Funciones predefinidas
La función range puede ser de 2 argumentos: range(m,n), creando una lista que
empieza desde m, y termina en n – 1.
63
Funciones predefinidas
Función Max()
64
Funciones predefinidas
Función Min()
65
Funciones predefinidas
Función Sum()
Ejemplos:
66
Funciones predefinas
Función round()
Ejemplos:
67
Bucle While
Bucle While
68
Bucle While
69
Tipos de comparaciones para condicionales
71
Bucle While
72
Bucle While
Otra ventaja del bucle while es que el número de iteraciones no está definida
antes de empezar el bucle, por ejemplo porque los datos los proporciona el
usuario. Por ejemplo, el siguiente ejemplo pide un número positivo al usuario
una y otra vez hasta que el usuario lo haga correctamente:
73
Bucles While
Bucles infinitos
Si la condición del bucle se cumple siempre, el bucle no terminará nunca de
ejecutarse y tendremos lo que se denomina un bucle infinito. Aunque a veces es
necesario utilizar bucles infinitos en un programa, normalmente se deben a
errores que se deben corregir.
74
Bucle While
75
Bucle While
76
Estructuras de control
77
Condicional IF
Sirve para verificar si una variable de tipo bool, int, float o string se iguala o
cumple con un dato especificado por el programador, a esto se le llama
Sentencia, el valor que devuelve es un booleano (True o False)
78
Condicional IF
If simple.
Estructura:
Si el dato de comparación 1 es igual al dato de comparación 2, realizara la
acción descrita en el cuerpo del IF, si no se cumple continuará con su flujo de
lectura del programa.
79
Condicional IF
If / Else.
Estructura:
Si el dato de comparación 1 es igual al dato de comparación 2,
realizara la acción descrita en el cuerpo del IF, si no se cumple
realizara lo que se describe en el cuerpo ELSE, else se puede
interpretar como ”en caso contrario”.
80
Condicional IF
Descripción:
• Si el dato de comparación 1 es igual al dato de
comparación 2, realizara la acción descrita en el cuerpo
del IF
• Si el dato de comparación 1 es menor o igual al dato de
comparación 2, realizara la acción descrita en el cuerpo
del ELIF1
• Si el dato de comparación 1 es mayor o igual al dato de
comparación 2, realizara la acción descrita en el cuerpo
del ELIF2
• Si no cumple ninguna condición, realizara la acción
descrita en el cuerpo del ELSE
81
Ejemplo de condicionales
82
Bucle For
84
Bucle For
88
Calculadora
Se tiene que crear en Python una calculadora con todo lo que hemos visto hasta
el momento, la calculadora deberá cumplir con las siguientes características:
Opcional:
• Después de la operación volver a preguntar al usuario que opción quiere
• Pedirle al usuario los números a operar
89
Try-Except-else
Utilizar una declaración except básica es la forma más básica de tratar los errores.
90
Try-Except-Finally
Funciona muy similar al ejemplo anterior lo único que cambia es el Finally por el
else, esto quiere decir que siempre se ejecutará el código que haya en el finally,
tanto si se produce error como sino.
91
Manejo de errores con tipo de error
92
Capturar cancelación de programa (Control + C)
93
Listas
94
Listas
Enteros y flotantes
Cadenas de datos
95
Listas
96
Listas
Ejemplo:
97
Listas
Ejemplo:
98
Listas
Ejemplo:
99
Listas
10
0
Listas
101
Listas
10
2
Listas
Ejemplo:
10
3
Listas
Ejemplos:
Para obtener la lista que contiene al segundo y tercer inscritos
podemos escribir:
10
4
Listas
10
5
Listas
10
6
Listas
10
8
Listas
10
9
Listas
110
Listas
Ejemplos:
Lista de nombres
112
Listas
En Python, las listas, las tuplas y las cadenas son parte del conjunto
de las secuencias. Todas las secuencias cuentan con las siguientes
operaciones:
113
Tuplas
Python cuenta con una gran variedad de tipos de datos que permiten
representar la información según cómo esté estructurada.
114
Tuplas
115
Tuplas
116
Tuplas
117
Tuplas
118
Tuplas
119
Tuplas
120
Diccionarios
122
Diccionarios
123
Diccionarios
124
Diccionarios
125
Diccionarios
126
Diccionarios
127
Diccionarios
12
8
Diccionarios
12
9
Diccionarios
13
2
Conjuntos
13
3
Conjuntos
13
4
Conjuntos
13
5
Conjuntos
13
6
Conjuntos
13
7
Conjuntos
138
Conjuntos
13
9
Conjuntos
14
0
Conjuntos
141
Conjuntos
14
2
Conjuntos
14
3
Conjuntos
14
4
Conjuntos
14
5
Conjuntos
Método Descripción
14
8
Clases
Aquí introducimos, además, la palabra reservada pass, que sirve para rellenar
un espacio que es requerido sintácticamente. En efecto, no tiene ninguna
función. Por lo que, por el momento, tenemos una clase de nombre Alumno que 14
está vacía. 9
Clases
Las clases pueden contener funciones. Para ello vamos a usar la misma
nomenclatura anterior, con la diferencia que esta vez todo nuestro código
estará indentado cuatro espacios o una tabulación, para indicar que
queremos ubicarlo dentro de la clase.
151
Clases
Una clase también puede contener variables, a las que se conoce con el
nombre de atributos. Para crear atributos definimos un método especial
llamado __init__(), que es invocado por Python automáticamente siempre que se
crea una instancia de la clase (conocido también
como constructor o inicializador).
Los argumentos del método __init__(), a partir del segundo, son requeridos
15
siempre que se quiera crear una instancia de la clase Alumno.
3
Herencias
15
4
Herencias
Los códigos son muy similares, a excepción del método area(). Pero dado que el
método __init__() es el mismo, podemos abstraerlo en una clase padre de la
cual hereden tanto Rectangulo como Triangulo.
15
5
Herencias
15
6
Sobre escritura de métodos
15
7
Fechas y Horas en Python
15
8
Horas
Los argumentos para inicializar una instancia time son opcionales, pero es
poco probable que el valor predeterminado de 0 sea correcto. 15
9
Horas
Una instancia time solo tiene valores de tiempo, y no una fecha asociada con
el tiempo.
16
0
Horas
161
Fechas
Los valores de la fecha del calendario se representan con la clase date. Las
instancias tienen atributos para year, month, y day. Es fácil crear una fecha que
represente la fecha actual usando el método de clase today().
16
2
Fechas
Al igual que con time, el rango de valores de fecha soportados puede ser
determinado usando los atributos min y max.
16
3
Fechas
16
4
Combinando Fechas y Horas
16
5
Combinando Fechas y Horas
Al igual que con date, datetime proporciona métodos de clase conveniente para
crear nuevas instancias. También incluye fromordinal() y fromtimestamp()
combine() crea instancias datetime de una instancia date y una instancia time
16
6
Zonas Horarias
16
7
Zonas Horarias
16
8
Lectura de archivos en Python
16
9
Lectura de archivos en Python
17
0
Lectura de archivos en Python
Con el método open() ya tenemos el fichero abierto y listo para usar, podemos
imprimir su contenido con read(). El siguiente código imprime todo el fichero
171
Lectura de archivos en Python
17
2
Lectura de archivos en Python
Existe otro método llamado readlines(), que devuelve una lista donde cada
elemento es una línea del fichero.
17
3
Lectura de archivos en Python
17
4
Lectura de archivos en Python
Hasta ahorita solo hemos visto la función open() con tan solo un argumento
de entrada, el nombre del archivo de texto. Podemos usar un segundo
argumento que se trata del modo de apertura del archivo de texto.
17
5
Lectura de archivos en Python
Otra cosa que debemos hacer cuando trabajamos con ficheros en
Python, es cerrarlos una vez que ya hemos acabado con ellos.
Aunque es verdad que el fichero normalmente acabará siendo cerrado
automáticamente, es importante especificarlo para evitar tener
comportamientos inesperados.
17
6
Escritura de archivos en Python
‘w’: Borra el fichero si ya existiese y crea uno nuevo con el nombre indicado.
‘a’: Añadirá el contenido al final del fichero si ya existiese (append end Inglés)
‘x’: Si ya existe el fichero se devuelve un error.
177
Escritura de archivos en Python
Ya hemos visto como crear el fichero. Veamos ahora como podemos añadir
contenido. Empecemos escribiendo un texto.
17
8
Escritura de archivos en Python
17
9
Escritura de archivos en Python
También podemos usar el método writelines() y pasarle una lista, este método
se encargara de guardar todos los elementos de la lista en el fichero.
18
0
Escritura de archivos en Python
181
Escritura de archivos en Python
18
2
Expresiones regulares
18
3
Expresiones regulares
Métodos básicos
18
5
Expresiones regulares
18
6
Expresiones regulares
18
7
Tkinter
Ventajas:
18
8
Tkinter
Los elementos como cajas de texto, texto, botones, etc., se conocen como
widgets.
18
9
Tkinter
Una ventana es una instancia de una clase de tkinter. Para crearla se hace
de la siguiente manera:
19
0
Tkinter
19
2
Tkinter
El tamaño esta definido por unidades de texto. Ambos valores son el tamaño
del numero 0 con el tipo de letra por defecto del sistema actual.
19
4
Creando una ventana
.
Evitar modificar el tamaño
▪ resizable (se agrega antes del mainloop):
.
Agregar etiquetas
.
Agregar etiquetas (método 2)
▪ Label (se requiere importar ttk)
. 1
9
Agregar botones
▪ Se agrega el botón:
200
.
Agregar botones
▪ Ventana antes y después de generado el evento (click):
201
.
Agregar una caja de texto
▪ Entry:
202
.
Agregar caja de texto
▪ Código completo:
203
.
Agregar caja de texto
▪ Ventana antes y después de generado el evento (click):
204
.
Objeto activo
.
Deshabilitar eventos
▪ configure:
206
.
Deshabilitar eventos
No se puede
▪ configure:
hacer click en el
evento
207
.
Listas desplegables
▪ Combobox:
208
.
Listas desplegables
▪ Combobox:
209
.
Botones de control
▪ Checkbutton:
210
.
Botones de control
▪ Checkbutton:
211
.
Botones para opciones
▪ Radiobutton (variables para colores):
212
.
Colores
▪ Lista de colores reconocidos por TK:
213
.
Botones para opciones
▪ Radiobutton:
214
.
Botones para opciones
▪ Radiobutton:
215
.
Botones para opciones
▪ Radiobutton:
216
.
Cajas de texto (varias líneas)
▪ Importar librería:
217
.
Cajas de texto (varias líneas)
▪ scrolledtext:
218
.
Cajas de etiquetas
219
.
Cajas de etiquetas
220
.
Cajas de etiquetas
221
.
Barra de Menús
▪ Importar biblioteca:
Crear Menú:
222
.
Barra de Menús
223
.
Barra de Menús
▪ Menú con una opción y submenús:
224
.
Barra de Menús
▪ Menú con 2 opciones y línea divisoria:
225
.
Barra de Menús
▪ Menú con 2 opciones:
226
.
Barra de Menús (salir)
▪ Evento salir (se modifica el menú para el manejo del evento):
227
.
Pestañas
▪ Ventana con pestaña:
228
.
Pestañas
229
.
Cajas de mensajes
▪ Importar librería para los mensajes (messagebox):
230
.
Cajas de mensajes
231
.
Cajas de mensajes
232
.
Cajas de mensajes
233
.
Cajas de mensajes
▪ Función para el manejo del evento:
234
.
¿Qué es un GPIO?
General Purpose Input Output (GPIO) es un sistema de entrada y salida de
propósito general, es decir, consta de una serie de pines o conexiones que se
pueden usar como entradas o salidas para múltiples usos. Estos pines están
incluidos en todos los modelos de Raspberry Pi aunque con diferencias.
23
5
Pines del GPIO
Amarillo (2): Alimentación a 3.3V.
Rojo (2): Alimentación a 5V.
Naranja (26): Entradas / salidas de propósito general.
Pueden configurarse como entradas o salidas. Ten
presente que el nivel alto es de 3.3V y no son
tolerantes a tensiones de 5V.
Gris (2): Reservados.
Negro (8): Conexión a GND o masa.
Azul (2): Comunicación mediante el protocolo I2C
para comunicarse con periféricos que siguen este
protocolo.
Verde (2): Destinados a conexión para UART para
puerto serie convencional.
Morado (5): Comunicación mediante el protocolo SPI
para comunicarse con periféricos que siguen este 23
protocolo. 6
Todos los pines son de tipo "unbuffered", es decir, no disponen de buffers
de protección y puedes dañar la placa con un mal uso.
23
7
Existen 2 formas de numerar los pines de la Raspberry Pi, en modo BOARD o
en modo BCM.
En el modo BOARD, los pines se numeran de forma física por el lugar que ocupan
en la placa (representados por el color gris) viene siendo igual para todas las
versiones (comenzamos a contar desde arriba a la izquierda y finalizamos abajo a
la derecha)
Por este mismo motivo pueden encontrar 2 nomenclaturas a la hora de realizar las
prácticas de electrónica con Raspberry Pi, cuando nos refiramos al modo BOARD
o al modo BCM. A continuación mostramos una tabla de equivalencias. 23
8
23
9
24
0
¿Cómo conectar Python con GPIO en Raspberry
Pi?
Por defecto, Python viene instalado en el sistema operativo de Raspbian para
Raspberry Pi. Con lo cual si estás utilizando otro sistema operativo en tu placa y
no tienes la librería GPIO instalada correctamente, tendrán que instalarla
mediante comandos
24
1
Al hacer uso de una sintaxis legible, la curva de aprendizaje es muy rápida, siendo de
este modo, uno de los mejores lenguajes para iniciarse en la programación en modo
texto.
24
2
Programar salidas GPIO
24
3
Configuración en programación
24
4
Test del Pin GPIO
Conectar un led con una resistencia de 220 al GPIO 2 del Rasberry, hacer que el
programa pida una letra por teclado, si la letra es “a” encender el led, si la letra es
“b” apagar el led, si la letra es “z” finalizar el Programa, otra letra no hacer caso..
24
5
El programa quedaría de la siguiente forma
GPIO.setmode(GPIO.BCM)
GPIO.setup(2,GPIO.OUT)
continuar = True
while continuar:
dato = input("Digite la letra de control: ")
if dato == "a":
GPIO.output(2,GPIO.HIGH)
elif dato == "b":
GPIO.output(2,GPIO.LOW)
elif dato == "z":
continuar = False
GPIO.cleanup()
24
print ("Fin del programa") 6
Librería Time
print(“Bienvenido”)
time.sleep(3)
print(“Como te llamas?”)
24
7
Led intermitente
24
8
Encendido de 1 Led intermitente
GPIO.setmode(GPIO.BCM)
GPIO.setup(2,GPIO.OUT)
try:
while true:
GPIO.output(2, True)
time.sleep(0.4)
GPIO.output(2, False)
time.sleep(0.2)
except:
print(“Fin del programa”)
24
GPIO.cleanup() 9
2 Led intermitente
Conectar un Led al Pin GPIO2 y otro al Pin GPIO3,hacer que los leds
parpadeen infinitamente, con tiempo de encendido de: 400 ms y un tiempo de
apagado de: 200ms
25
0
Encendido de 2 Leds intermitentes en forma de espejo
GPIO.setmode(GPIO.BCM)
GPIO.setup(2,GPIO.OUT)
GPIO.setup(3,GPIO.OUT)
try:
while True:
GPIO.output(2,GPIO.HIGH)
GPIO.output(3,GPIO.LOW)
time.sleep(0.4)
GPIO.output(2,GPIO.LOW)
GPIO.output(3,GPIO.HIGH)
time.sleep(0.2)
except:
print("Fin del programa")
25
GPIO.cleanup()
1
Led con Pulsador
25
2
Led con Pulsador
GPIO.setmode(GPIO.BCM)
GPIO.setup(2,GPIO.OUT)
GPIO.setup(20,GPIO.IN)
ty:
while True:
if GPIO.input(20) == GPIO.HIGH:
GPIO.output(2,GPIO.HIGH)
else:
GPIO.output(2,GPIO.LOW)
except:
GPIO.cleanup()
print("Fin del programa")
25
3
Encendido y apagado de led con Botones
Gráficos
Conectar un led con una resistencia de 220 al GPIO 2 del Rasberry, hacer que el
programa pida un botón para encender, otro para apagar y tener un lector que nos
indique el estado del Led.
25
4
import tkinter etiqueta=tkinter.StringVar()
import RPi.GPIO as GPIO ---- etiqueta.set("Apagado")
importamos la libreria fm = tkinter.Frame(w)
fm.grid(row=0,column=0)
def apagar():
print("Apagar")
GPIO.output(2,GPIO.LOW) b1 = tkinter.Button(fm,text =
etiqueta.set("Apagado") "Apagar",command=apagar)
def encender(): b1.grid(row=1,column=0)
print("Encender") b2 = tkinter.Button(fm,text =
GPIO.output(2,GPIO.HIGH) "Encender",command=encender)
etiqueta.set("Encendido") b2.grid(row=1,column=1)
lb =
GPIO.setmode(GPIO.BCM) ---- tkinter.Label(fm,textvariable=etiqueta)
Definimos nuestro GPIO lb.grid(row2,column=0,columnspan=2)
GPIO.setup(2,GPIO.OUT)
GPIO.output(2,GPIO.LOW) w.mainloop()
w = tkinter.Tk() 25
5
Programación del semáforo en Python
En esta lección se va a construir y programar en Python un sencillo semáforo. Para la programación
podemos utilizar el editor de PYthon 3 (IDLE) o el IDE Thonny Python que viene instalado en Raspbian
para Raspberry Pi.
Lo primero que debemos hacer es importar las librerías a utilizar. A continuación se declara el tipo de
pin que vamos a utilizar y por último se procede a la programación.
GPIO.setmode(GPIO.BCM)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
while True:
GPIO.output(11, GPIO.HIGH)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
time.sleep(5)
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.LOW)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.HIGH)
time.sleep(5)
25
7
¿Qué es PWM?
La modulación por ancho de pulsos o PWM (pulse-width modulation) de una señal es una técnica en la
que se modifica el ciclo de trabajo de una señal periódica para controlar la cantidad de energía que se envía,
o dicho de otro modo, modificamos el tiempo de la señal para simular una señal analógica.
Consiste en generar una señal periodica(Periodo T), donde el tiempo estara en estado alto y el resto en
estado bajo.
0<=Ton<=T
DC = 100%*(Ton/T
TON Periodo 25
8
25
Ejemplo grafico 9
Manejo del PWM en un led
Pedir por teclado un valor(Duty Cicle) de 0 a 100, y eso colocarle al led conectado al Raspberry en el GPIO2.
26
0
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BMC)
GPIO.setup(2,GPIO.OUT)
pwm = GPIO.PWM(2,500)
pwm.start(0)
continuar = True
while continuar:
dato = input("Digite el nuevo DC: ")
if dato == "z":
continuar = False
else:
pwm.ChangeDutyCycle(int(dato))
pwm.atop()
GPIO.cleanup()
print("Fin del programa")
26
1
Control de un servomotor por PWM
Controlar por PWM un micro servo SG90 colocado en el GPIO 2, hacer que el pida el dc al usuario
26
2
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(2,GPIO.OUT)
pwm = GPIO.PWM(2,50)
pwm.start(2.5)
continuar = True
while continuar:
dato = input("digite el dc para el Servomotor: ")
if dato == "z":
continual = False
else:
pwm.ChangeDutyCycle(float(dato))
pwm.stop()
GPIO.cleanup()
print("Fin del programa")
26
3
Sensor Digital Ultrasónido HCSR04
Trigger 10us
Tiempo t
Eco
D = v(m/s)*t(s)
2d = 340(m/s)*t(s)
2d = 340(100cm/s)*t(s) 26
2d = 3400(cm)*t 4
D = 1700*t(cm)
Calcular la distancia de un objeto en centímetros, el Trigger esta en el GPIO 2 y el
Echo en el GPIO 20
26
5
Formula
# Considerando que la distancia fue recorrida 2 veces y que la velocidad del sonido es de 343 m/s.
26
6
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.OUT)
GPIO.setup(21,GPIO.IN)
GPIO.setup(4,GPIO.LOW)
try:
while True:
GPIO.output(4,GPIO.HIGH)
time.sleep(0.00001)
GPIO.output((4,GPIO.LOW)
t1 = time.time()
t = t2-t1
d = 1700*t
print("Distancia: ",round(d,1),"cms")
time.sleep(0.2)
26
except: 7
GPIO.cleanup()
print("Fin del Programa")
Lectura DTH11 Con la Raspberry
Leer los valores de temperatura y humedad con el DTH11 e imprimirlos, conectar el DTH11 a pin GPIO 4
26
8
Instalar la libreria
sudo su
cd Adafruit_python_DHT
26
9
Conexión
27
0
import Adafruit_DHT as dht
sensor = dht.DHT11
continuar = True
while continuar:
dato = input("Digite algo para leer el sensor: ")
if dato == "z":
continuar = False
else:
h,t = dht.read_retry(sensor,4)
print("T=",t," ,H=",h)
print("Fin del programa")
27
1
Por su atención
¡MUCHAS
GRACIAS!
27
2