La imagen de arriba es el resultado del código python descrito abajo, recogiendo las variables por puerto usb de la tarjeta ESP32 y mostrandolas en una pantalla.
import tkinter as tk
import serial
from PIL import Image, ImageTk
window=tk.Tk()
def end_fullscreen(event=None):
window.attributes('-fullscreen', False)
window.geometry('500x500')
def close_window(event):
window.destroy()
window.title("Ventana de control")
window.attributes('-fullscreen', True)
#window.bind('<F10>', end_fullscreen)
window.bind('f', end_fullscreen)
#window.bind('<F11>', close_window)
window.bind('c', close_window)
image1 = Image.open("/Users/cesarhernandez/Desktop/video/video2/planta.jpg")
image1=image1.resize((200, 200))
photo1 = ImageTk.PhotoImage(image1)
image2 = Image.open("/Users/cesarhernandez/Desktop/video/video2/sol.jpg")
image2=image2.resize((200, 200))
photo2 = ImageTk.PhotoImage(image2)
frame1 = tk.Frame(window, bg='white')
frame1.pack(side='left', fill='both', expand=True)
label1=tk.Label(frame1, image=photo1)
label1.pack(padx=10, pady=10)
frame2 = tk.Frame(window, bg='white')
frame2.pack(side='right', fill='both', expand=True)
label2=tk.Label(frame2, image=photo2)
label2.pack(padx=10, pady=10)
esp32_1_label=tk.Label(frame1, text="")
esp32_1_label.pack()
esp32_2_label=tk.Label(frame2, text="")
esp32_2_label.pack()
#Centrar la ventana
window_width=window.winfo_reqwidth()
window_height=window.winfo_reqheight()
position_top=int(window.winfo_screenmmheight() / 2 - window_height / 2)
position_right=int(window.winfo_screenmmwidth() / 2 - window_width / 2)
window.geometry("+{}+{}".format(position_right, position_top))
ser=serial.Serial('/dev/tty.usbserial-0001', 9600)
#ser=serial.Serial('/dev/ttyUSB0', 9600)
def update_label():
if ser.in_waiting > 0:
line=ser.readline().decode('utf-8', 'ignore').rstrip()
values=line.split(',')
if values[0] == 'moisture':
numero=int(values[1])
humedadPlanta=int(100-(numero/4095.00)*100)
esp32_1_label.config(text=f"La humedad de la planta es:\n {humedadPlanta} %")
if values[0] == 'dht':
esp32_2_label.config(text="La temperatura que hace es:" + "\n" + values[3] + " °C" + "\nLa humedad que hace es de:" + "\n" + values[2] + " %")
window.after(100, update_label)
update_label()
window.mainloop()
Antes de nada necesitamos tener instalado python en nuestro ordenador y lo podemos descargar desde la página oficial de python:
A parte de tener instalado python necesitaremos manejar librerias de este código, y lo podemos hacer con el gestor de paquetes de python llamado «pip» o «pip3» para python version 3.
Explicando el código python de arriba, comenzaremos por ver la importación de las librerias:
import tkinter as tk
import serial
from PIL import Image, ImageTk
- tkinter: Esta es una librería de Python que proporciona una interfaz gráfica de usuario (GUI) para crear aplicaciones. Permite crear ventanas, botones, cuadros de texto y otros elementos de interfaz gráfica. En el código, se importa como tk para abreviar. La librería tkinter generalmente viene incluida con las instalaciones estándar de Python, por lo que no es necesario descargarla por separado.
- serial: Esta librería permite la comunicación con puertos serie en Python. Se utiliza para interactuar con dispositivos serie, como Arduino, a través de una conexión serial. Si no tienes instalada la librería serial, puedes descargarla e instalarla utilizando el gestor de paquetes pip. En la terminal de tu sistema operativo iOS, puedes ejecutar el siguiente comando:
pip install pyserial
Esto descargará e instalará la librería pyserial, que es la implementación de Python de la comunicación serial.
- PIL (Python Imaging Library): Ahora conocida como Pillow, esta librería proporciona capacidades de procesamiento y manipulación de imágenes en Python. Permite abrir, modificar y guardar imágenes en varios formatos. Para instalar la librería Pillow, puedes ejecutar el siguiente comando en la terminal:
pip install pillow
Esto descargará e instalará la librería Pillow, que incluye el módulo ImageTk utilizado en el código.
El siguiente código estableceremos la ventana que vamos a utilizar e indicaremos las caracteristticas que va a tener:
window=tk.Tk()
def end_fullscreen(event=None):
window.attributes('-fullscreen', False)
window.geometry('500x500')
def close_window(event):
window.destroy()
window.title("Ventana de control")
#window.attributes('-fullscreen', True)
window.geometry("500x500")
window.bind('<F10>', end_fullscreen)
window.bind('<F11>', close_window)
Este es un script de Python que utiliza la biblioteca Tkinter para crear una interfaz gráfica de usuario (GUI). Aquí está el desglose de cada parte del código:
Primero definimos una variable o instancia «window» que va representar la ventana que se abrirá, para ello escribimos «window=tk.Tk()», con tk estariamos llamando a la libreria «tk», y Tk() estariamos llamando a la clase Tk() que es una ventana.
- def end_fullscreen(event=None): – Esta es la definición de una función llamada end_fullscreen. Esta función se activará cuando ocurra un evento específico (que se definirá más adelante). El parámetro event se establece en None por defecto, lo que significa que la función puede ser llamada sin ningún argumento.
- window.attributes(‘-fullscreen’, False) – Dentro de la función end_fullscreen, esta línea cambia el atributo de pantalla completa de la ventana a False, lo que significa que la ventana no estará en modo de pantalla completa.
- window.geometry(‘500×500’) – Esta línea establece la geometría de la ventana a 500×500 píxeles. Esto se hace después de salir del modo de pantalla completa para asegurar que la ventana tenga un tamaño específico.
- def close_window(event): – Esta es la definición de otra función llamada close_window. Esta función se activará cuando ocurra otro evento específico.
- window.destroy() – Dentro de la función close_window, esta línea destruye la ventana, esencialmente cerrándola.
- window.title(«Ventana de control») – Esta línea establece el título de la ventana como «Ventana de control».
- window.geometry(«500×500») – Esta línea establece la geometría inicial de la ventana a 500×500 píxeles.
- window.bind(‘<F10>’, end_fullscreen) – Esta línea vincula el evento de presionar la tecla F10 a la función end_fullscreen. Esto significa que cuando se presiona la tecla F10, se llama a la función end_fullscreen y la ventana sale del modo de pantalla completa.
- window.bind(‘<F11>’, close_window) – Similarmente, esta línea vincula el evento de presionar la tecla F11 a la función close_window. Cuando se presiona la tecla F11, se llama a la función close_window y la ventana se cierra.
Por lo tanto, este script crea una ventana con el título «Ventana de control» y un tamaño de 500×500 píxeles. Cuando se presiona la tecla F10, la ventana sale del modo de pantalla completa y cuando se presiona la tecla F11, la ventana se cierra.
image1 = Image.open("/Users/cesarhernandez/Desktop/video/video2/planta.jpg")
image1=image1.resize((200, 200))
photo1 = ImageTk.PhotoImage(image1)
Este código utiliza dos bibliotecas de Python: PIL (Python Imaging Library) y ImageTk. Aquí está lo que hace cada línea:
- image1 = Image.open(«/Users/cesarhernandez/Desktop/video/video2/planta.jpg»): Esta línea abre una imagen que se encuentra en la ruta especificada en tu sistema de archivos local. La imagen se carga en memoria y se asigna a la variable image1.
- image1=image1.resize((200, 200)): Esta línea toma la imagen que acabamos de abrir y la redimensiona a un tamaño de 200×200 píxeles. La imagen redimensionada se vuelve a asignar a la variable image1.
- photo1 = ImageTk.PhotoImage(image1): Esta línea convierte la imagen redimensionada en un formato que puede ser utilizado por la biblioteca Tkinter de Python, que se utiliza para crear interfaces gráficas de usuario. La imagen convertida se asigna a la variable photo1.
Por lo tanto, el propósito general de este código es cargar una imagen de tu sistema de archivos local, redimensionarla a 200×200 píxeles, y luego convertirla a un formato que puede ser utilizado en una interfaz gráfica de usuario Tkinter.
frame1 = tk.Frame(window, bg='white')
frame1.pack(side='left', fill='both', expand=True)
label1=tk.Label(frame1, image=photo1)
label1.pack(padx=10, pady=10)
En el siguiente código se está utilizando la biblioteca Tkinter de Python para crear una interfaz gráfica de usuario (GUI). Aquí está lo que hace cada línea:
- frame1 = tk.Frame(window, bg=’white’): Esta línea crea un nuevo marco (Frame) en la ventana proporcionada. Un marco es un contenedor que se puede utilizar para agrupar y organizar otros widgets en la GUI. En este caso, el marco tiene un fondo blanco.
- frame1.pack(side=’left’, fill=’both’, expand=True): Esta línea coloca el marco en la ventana. El método pack es uno de los tres métodos de geometría disponibles en Tkinter para controlar la disposición de los widgets. En este caso, el marco se coloca en el lado izquierdo de la ventana, se expande para llenar tanto el espacio horizontal como el vertical disponible, y se permite expandirse si la ventana es redimensionada.
- label1=tk.Label(frame1, image=photo1): Esta línea crea una nueva etiqueta (Label) en el marco que acabamos de crear. Una etiqueta es un widget que puede mostrar texto o imágenes. En este caso, la etiqueta está configurada para mostrar la imagen que se creó en el código anterior.
- label1.pack(padx=10, pady=10): Esta línea coloca la etiqueta en el marco. La etiqueta se coloca en el centro del marco, con un relleno de 10 píxeles en las direcciones x (horizontal) y y (vertical).
Por lo tanto, el propósito general de este código es crear un marco en una ventana, y luego colocar una etiqueta con una imagen en ese marco.
esp32_1_label=tk.Label(frame1, text="")
esp32_1_label.pack()
En el código de arriba se esta utilizando la biblioteca Tkinter de Python para crear una interfaz gráfica de usuario (GUI). Aquí está lo que hace cada línea:
- esp32_1_label=tk.Label(frame1, text=»»): Esta línea crea una nueva etiqueta (Label) en el marco frame1 que se creó anteriormente. Una etiqueta es un widget que puede mostrar texto o imágenes. En este caso, la etiqueta está configurada para mostrar un texto vacío inicialmente.
- esp32_1_label.pack(): Esta línea coloca la etiqueta en el marco. El método pack es uno de los tres métodos de geometría disponibles en Tkinter para controlar la disposición de los widgets. En este caso, la etiqueta se coloca en el centro del marco.
Por lo tanto, el propósito de este código es crear una etiqueta vacía en el marco frame1. Más adelante, puedes cambiar el texto de esta etiqueta utilizando el método config de la etiqueta, como en esp32_1_label.config(text=»Nuevo texto»). Esto puede ser útil para mostrar información dinámica en la GUI, como los datos recibidos de un dispositivo ESP32.
#Centrar la ventana
window_width=window.winfo_reqwidth()
window_height=window.winfo_reqheight()
position_top=int(window.winfo_screenmmheight() / 2 - window_height / 2)
position_right=int(window.winfo_screenmmwidth() / 2 - window_width / 2)
window.geometry("+{}+{}".format(position_right, position_top))
El siguiente código se utiliza para centrar la ventana que abrimos y situarla en el centro del monitor que estemos utilizando.
ser=serial.Serial('/dev/tty.usbserial-0001', 9600)
El código de arriba está utilizando la biblioteca pySerial de Python, que es una biblioteca utilizada para la comunicación serial. Aquí está lo que hace la línea:
ser=serial.Serial(‘/dev/tty.usbserial-0001’, 9600)
Esta línea abre un puerto serial con el nombre /dev/tty.usbserial-0001 a una velocidad de baudios de 9600. La velocidad de baudios es la velocidad a la que se transmiten los datos a través del puerto serial. 9600 es una velocidad de baudios comúnmente utilizada.
La variable ser es ahora un objeto que puedes utilizar para leer y escribir datos a través del puerto serial. Por ejemplo, puedes usar ser.read() para leer datos del puerto serial, y ser.write(data) para escribir datos al puerto serial.
Este código es comúnmente utilizado para la comunicación con dispositivos de hardware como microcontroladores (por ejemplo, Arduino, ESP32) que están conectados al ordenador a través de un puerto serial.
def update_label():
if ser.in_waiting > 0:
line=ser.readline().decode('utf-8', 'ignore').rstrip()
values=line.split(',')
if values[0] == 'moisture':
numero=int(values[1])
humedadPlanta=int(100-(numero/4095.00)*100)
esp32_1_label.config(text=f"La humedad de la planta es:\n {humedadPlanta} %")
if values[0] == 'dht':
esp32_2_label.config(text="La temperatura que hace es:" + "\n" + values[3] + " °C" + "\nLa humedad que hace es de:" + "\n" + values[2] + " %")
window.after(100, update_label)
El código define una función llamada update_label que se utiliza para leer datos desde un puerto serial y actualizar las etiquetas en una interfaz gráfica de usuario (GUI) de Tkinter. Aquí está lo que hace cada parte:
- if ser.in_waiting > 0:: Esta línea verifica si hay datos disponibles para leer desde el puerto serial.
- line=ser.readline().decode(‘utf-8’, ‘ignore’).rstrip(): Esta línea lee una línea de datos desde el puerto serial, la decodifica como una cadena de texto UTF-8, y luego elimina cualquier espacio en blanco al final de la cadena.
- values=line.split(‘,’): Esta línea divide la cadena de texto en una lista de valores utilizando la coma como delimitador.
- Las siguientes líneas verifican el primer valor de la lista para determinar qué tipo de datos se han recibido. Si el primer valor es ‘moisture’, entonces los datos se interpretan como una lectura de humedad del suelo. Si el primer valor es ‘dht’, entonces los datos se interpretan como una lectura de temperatura y humedad del aire.
- esp32_1_label.config(text=f»La humedad de la planta es:\n {humedadPlanta} %») y esp32_2_label.config(text=»La temperatura que hace es:» + «\n» + values[3] + » °C» + «\nLa humedad que hace es de:» + «\n» + values[2] + » %»): Estas líneas actualizan el texto de las etiquetas en la GUI con los datos recibidos.
- window.after(100, update_label): Esta línea programa la función update_label para ser llamada de nuevo después de 100 milisegundos. Esto crea un bucle que continúa leyendo datos del puerto serial y actualizando las etiquetas en la GUI.
Por lo tanto, el propósito general de este código es leer datos de un sensor de humedad del suelo y un sensor DHT (temperatura y humedad del aire) a través de un puerto serial, y luego actualizar las etiquetas en una GUI de Tkinter con estos datos.
update_label()
window.mainloop()
Estas dos líneas de código son la finalización de la aplicación de interfaz gráfica de usuario (GUI) típica en Tkinter. Aquí está lo que hacen:
- update_label(): Esta línea llama a la función update_label que definiste anteriormente. Esta función lee datos del puerto serial y actualiza las etiquetas en la GUI. Además, programa a sí misma para ser llamada de nuevo después de 100 milisegundos, creando un bucle que continuará mientras la aplicación esté en ejecución.
- window.mainloop(): Esta línea inicia el bucle principal de eventos de Tkinter. Este bucle es lo que hace que la GUI se muestre en la pantalla y responda a las interacciones del usuario. El bucle continuará hasta que la ventana de la GUI se cierre.
Por lo tanto, estas dos líneas de código inician la lectura de datos del puerto serial y la actualización de las etiquetas en la GUI, y luego inician la GUI para que se muestre en la pantalla y responda a las interacciones del usuario.
Deja una respuesta Cancelar la respuesta