Está en la página 1de 20

LENGUAJES DE PROGRAMACIÓN

II Ciclo

Laboratorio 10-11: Python-ESP32 NOTA

Alumnos: <colocar aquí los apellidos y nombres del alumno>


<colocar aquí los apellidos y nombres del alumno>

Fecha de realización: 00-00-2021


Fecha de entrega: 00-00-2021

1. Objetivos
● Identificar los conceptos de protocolos de comunicación

● Implementar aplicaciones con el protocolo Firmata usando Python

● Implementar aplicaciones para programar microcontroladores en Python

2. Seguridad
Advertencia:
●Obligatorio el uso de Mascarilla y careta de protección
●Desinfectar las manos con alcohol al ingreso del laboratorio
●Mantener siempre la distancia durante el laboratorio
●No obstruir las vías de evacuación con mochilas, sillas en mala
posición, etc.
●Ubicar maletines y/o mochilas al final del aula o en los casilleros
asignados al estudiante.
●No ingresar con líquidos, ni comida al aula de Laboratorio.
●Al culminar la sesión de laboratorio apagar correctamente la
computadora y la pantalla, y ordenar las sillas utilizadas.
●En este laboratorio está prohibida la manipulación del hardware,
conexiones eléctricas o de red

3. Equipos y Materiales
Una computadora con:
● Windows 7 o superior
● Conexión a la red
● Python 3.9 o superior, VS Code
● PlatformIO IDE, VSPD, PICSimLab
● Pyfirmata

4. Fundamento Teórico
MicroPython Tool (Ampy): Herramienta para interactuar con un tarjeta con Python o MicroPython a
través de comunicación serial, con ampy puedes enviar archivos desde tu computadora al sistema
de archivos de la placa, descargar archivos desde una placa a tu computadora e incluso enviar un
script de Python a una placa para que se ejecute.
esptool: Es una herramienta de línea de comando para comunicarse con el ROM bootloader en
microcontroladores ESP8266 & ESP32, nos permite actualizar el firmware, leer el firmware,
consultar los parámetros del chip, etc.
Lab. N° 11 Python-ESP32

Docente: Armando Sarco Montiel Pág. 1


Lab. N° 11 Python-ESP32
5. Procedimiento:
Instalación de los drivers del ESP32
Primero revisamos si se reconoce el ESP32, en la figura de abajo podemos observar que si reconoce
el ESP32 pero se observa que no están instalados los drivers.

Para instalar los drivers vamos a la página de los fabricantes e instalamos los drivers, generalmente
la página se encuentra al reverso de la tarjeta de desarrollo.

https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers http://www.wch.cn/product/CH340.html

Presionamos Win+X y seleccionamos el administrador de dispositivos y revisamos que esté instalado


el driver del ESP32

Docente: Armando Sarco Montiel Pág. 2


Lab. N° 11 Python-ESP32

Configuración del PlatformIO IDE (PIO IDE) para el ESP32


Primero revisamos el tipo de tarjeta de desarrollo que tenemos

Por lo general podemos encontrar el modelo en el chip y reverso de la tarjeta, por ejemplo en la
figura podemos observar que el modelo de nuestro ESP32 es un DEVKIT V1

En el PIO IDE configuramos un nuevo proyecto con el modelo de nuestro ESP32, en la figura de
arriba podemos observar que tenemos el modelo DEVKIT V1, del fabricante DOIT.

Docente: Armando Sarco Montiel Pág. 3


Lab. N° 11 Python-ESP32

Carga de un programa en el ESP32


El ESP8266 ó ESP32 vienen por defecto con un firmware preconfigurado que nos permite
programarlo de inmediato, para lo cual vamos a prender el led conectado en el pin 2 el ESP8266 ó
pin 2 en el ESP32

#include <Arduino.h>
void setup() {
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
}

Ejercicio 1: Crear un programa utilizando el PIO IDE, para prender y apagar un led desde el Python.
Copiar el programa de abajo, compilar, analizar y comentar lo que sucede.

Pegamos el ejemplo en main.cpp, para mostrar el PlatformIO Toolbar presionamos F1 y escribimos


Developer: Reload Windows, finalmente hacemos clic en la flechita a la derecha (Upload) para cargar
el programa al ESP32
Nota: si no carga el PlatformIO Toolbar, presionamos F1 y escribimos PlatformIO: Upload
Nota: si no ejecuta los comandos con F1, abrimos un terminal IDE de PlatformIO y escribimos pio
home, el comando obligará a PIO Core a descargar todos los paquetes necesarios, finalmente
reiniciamos el IDE de PlatformIO

Ejercicio 2: Crear un programa utilizando el PIO IDE y el Python, para prender y apagar el led del pin
2 del ESP32, desde el Python usando el TKinter.
#include <Arduino.h>
String dataString = "";
bool dataComplete = false;

Docente: Armando Sarco Montiel Pág. 4


Lab. N° 11 Python-ESP32

int ledState = 0;
char inChar;

void serialEvent(){
while (Serial.available()){
inChar = (char)Serial.read();
dataString += inChar;
if(inChar == '\n'){
dataComplete = true;
}
}
}
void task(){
Serial.println(dataString);
if(ledState == 1){digitalWrite(2, HIGH);}
else{digitalWrite(2, LOW);}
delay(20);
}
void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
}
void loop() {
if(Serial.available()) serialEvent();
if (dataComplete){
ledState = dataString.toInt();
task();
dataString = "";
dataComplete = false;
}
}

import serial #pip install pyserial


from tkinter import*
import tkinter.font as font

try:
arduino = serial.Serial('COM3',115200)
except:
print('Cannot conect to the port')

def onClosing():
root.destroy() #Cierra la ventana creada
arduino.close()
def pressButton1():
arduino.write(('1\n').encode())
label_0['text'] = "ON"; label_0["bg"]="white"; label_0["fg"]="Black"
c.itemconfig(id, fill="white")
def pressButton2():
arduino.write(('0\n').encode())
label_0['text'] = "OFF"; label_0["bg"]="gray35"; label_0["fg"]="White"
c.itemconfig(id, fill="gray35")
root = Tk()
root.protocol("WM_DELETE_WINDOW", onClosing)
root.title('Tecsup')#Titulo de la ventana
root.config(bg='#213141')
myFont = font.Font(size=10)
fm1 = Frame(root,padx=0,pady=0) #Frame
c = Canvas(fm1,width=80,height=80,bg='#213141')
id=c.create_oval(2,2,80,80,outline="gray0",fill="gray32")

Docente: Armando Sarco Montiel Pág. 5


Lab. N° 11 Python-ESP32

label_0 = Label(fm1,width=4,height=1,text="...",font="calibri 16
bold",bd=0,highlightthickness=0)
fm1.pack() #Posicionamiento relativo (pack)
c.grid(row=0, column=0)
label_0.grid(row=0, column=0)

button1 = Button(root,text
='ON',command=pressButton1,bg='#00aeef',fg='#ffffff',height=2,width=20)
button1['font'] = myFont
button1.pack(padx=20,pady=10)
button2 = Button(root,text
='OFF',command=pressButton2,bg='#00aeef',fg='#ffffff',height=2,width=20)
button2['font'] = myFont
button2.pack(padx=20,pady=10)
root.mainloop()

Ejercicio 3: Reto Tecsup, crear un programa utilizando el PIO IDE, para prender y apagar un led RGB
desde el Python, emulando el funcionamiento de un semáforo.

ESP32 sensor de temperatura interno


Ejercicio 4: Copiar el programa de abajo y ejecutarlo, explicar el funcionamiento.
#include <Arduino.h>
#ifdef __cplusplus
extern "C" {
#endif
uint8_t temprature_sens_read();
#ifdef __cplusplus
}
#endif

Docente: Armando Sarco Montiel Pág. 6


Lab. N° 11 Python-ESP32

uint8_t temprature_sens_read();

void setup() {
Serial.begin(115200);
}
void loop() {
Serial.print("Temperatura: ");
// Convierte la temperatura a Centígrados.
Serial.print((temprature_sens_read() - 32) / 1.8);
Serial.println(" C");
delay(2000);
}

ESP32 sensor de efecto Hall


Ejercicio 5: Copiar el programa de abajo y ejecutarlo, explicar el funcionamiento, usar un imán para
probar el funcionamiento.
#include <Arduino.h>
void setup() {
Serial.begin(115200);
}
void loop() {
int medida = 0;
medida = hallRead();
Serial.print("Hall: ");
Serial.println(medida);
delay(1000);
}

ESP32 señal analógica


Ejercicio 6: Conectar un potenciómetro de 5K al puerto 34 GPIO del ESP32 y verificar el valor en el
monitor serial, explicar los valores mostrados.

Docente: Armando Sarco Montiel Pág. 7


Lab. N° 11 Python-ESP32

#include <Arduino.h>
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
int pot = analogRead(34);
Serial.println(pot);
delay(100);
}

Ejercicio 7 (Reto Tecsup): Realizar la interfaz gráfica en python para mostrar el valor del
potenciómetro de 0 a 100%.

Manejo de variables anlógicas sensor DHT22


Ejercicio 8: Crear un programa utilizando el PIO IDE, para monitorear el sensor DHT22, de
temperatura y humedad.

Para el manejo del sensor de temperatura-humedad DHT22 vamos a necesitar instalar la librería de
Adafruit, para los cual en el PlatformIO y en la opción librerías, buscamos e instalamos la librería.

Luego le damos agregar al proyecto y especificamos cual.

Docente: Armando Sarco Montiel Pág. 8


Lab. N° 11 Python-ESP32

Revisamos si la librería se encuentra en las dependencias de platformio.ini

En el PlatformIO vamos a la opción de librería, volvemos a buscar el DHT22, le damos clic a la


librería que instalamos con anterioridad y copiamos el ejemplo del DHT22

Docente: Armando Sarco Montiel Pág. 9


Lab. N° 11 Python-ESP32

Copiamos y pegamos el ejemplo en main.cpp que está en la carpeta src de nuestro proyecto en el
PlatformIO, no te olvides de completar la librería de Arduino.h al inicio, en este ejemplo vamos a usar
el PIN Nro. D2 para conectar el DHT22, tal como se muestra en el circuito esquemático.

Docente: Armando Sarco Montiel Pág.


10
Lab. N° 11 Python-ESP32

Estando en main.cpp compilamos el proyecto para ver errores, hacemos el upload al

ESP32 y finalmente abrimos el Serial Monitor del PlatformIO y revisamos si tenemos conexión
serial con el sensor DHT22.

Docente: Armando Sarco Montiel Pág.


11
Lab. N° 11 Python-ESP32

Ejercicio 9: Crear un programa utilizando el PIO IDE, para leer el sensor DHT22, de temperatura y
humedad y realizar el monitoreo en tiempo real en el python a través del canal serial.

#include <Arduino.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
DHT_Unified dht(2, DHT22);
uint32_t delayMS;

void setup(){
Serial.begin(115200);
dht.begin();
Serial.println(F("DHT22 Unified Sensor"));
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
delayMS = sensor.min_delay / 1000;
}
void loop(){
delay(delayMS);
// Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
}
else {
Serial.println(event.temperature);
}

Docente: Armando Sarco Montiel Pág.


12
Lab. N° 11 Python-ESP32

// Get humidity event and print its value.


dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println(F("Error reading humidity!"));
}
else {
Serial.println(event.relative_humidity);
}
}

import serial
import time
import collections
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.animation as animation
from tkinter import *
from threading import Thread
import sys

def getData():
time.sleep(1)
serialConnection.reset_input_buffer()
while (isRun):
global isReceiving
global ValueError
for i in range(sizeData):
value[i] = float(serialConnection.readline().strip())
isReceiving = True
def onClosing():
global isRun
isRun = False
thread.join()
serialConnection.close()
root.quit()
root.destroy()
def plotData(self,lines,lineValueText,lineLabel):
for i in range(sizeData):
data[i].append(value[i])
lines[i].set_data(range(samples),data[i])
lineValueText[i].set_text(lineLabel[i]+' = '+str(value[i]))
#Declaración de variables
serialPort = 'COM6'
baudRate = 115200
sizeData = 2
isReceiving = False
isRun = True
#Gráficas
samples = 100
sampleTime = 100
value = []
data = []

for i in range(sizeData):
data.append(collections.deque([0]*samples, maxlen=samples))
value.append(0)
xmin = 0
xmax = samples
ymin = 0
ymax = 100

Docente: Armando Sarco Montiel Pág.


13
Lab. N° 11 Python-ESP32

lineLabel = ['Temperatura','Humedad']
style = ['r-','b-']
lines = []
lineValueText = []
#Crear gráfica
fig = plt.figure(facecolor='0.94')
ax = plt.axes(xlim=(xmin,xmax), ylim=(ymin,ymax))
plt.title('Monitoreo en tiempo real')
plt.grid()
ax.set_xlabel('Muestras')
ax.set_ylabel('°C - %')
for i in range(sizeData):
lines.append(ax.plot([],[],style[i],label=lineLabel[i])[0])
lineValueText.append(ax.text(0.65,0.90-i*0.05, '',transform=ax.transAxes))
plt.legend(loc="upper left")
#Abrir puerto serial
try:
serialConnection = serial.Serial(serialPort,baudRate)
except:
sys.exit('No se puede conectar al puerto')
#Recivir datos en segundo plano
thread = Thread(target=getData)
thread.start()
while isReceiving != True:
print('Iniciando recepción de datos')
time.sleep(0.1)
#Interfaz Gráfica
root = Tk()
root.title("Tecsup")
root.protocol('WM_DELETE_WINDOW',onClosing)
canvas = FigureCanvasTkAgg(fig,master=root)
canvas._tkcanvas.grid(row=0,column=0)
anim =
animation.FuncAnimation(fig,plotData,fargs=(lines,lineValueText,lineLabel),
interval=sampleTime)
root.mainloop()

Comunicación Bluetooth Clásico


Docente: Armando Sarco Montiel Pág.
14
Lab. N° 11 Python-ESP32
Ejercicio 10: Crear un programa utilizando el PIO IDE, para la conexión Bluetooth clásico

El ESP32 Tiene dos tipos de Bluetooth el clásico y low energy (BLE), en este ejemplo vamos a
realizar el programa para configurar el Bluetooth clásico, para lo cual vamos a usar la librería
BluetoothSerial.h.

#include <BluetoothSerial.h>
BluetoothSerial BT;
const String deviceName = "ESP32BT";
void serialEvent(){
if(Serial.available())
BT.write(Serial.read());
if(BT.available())
Serial.write(BT.read());
delay(20);
}
void setup(){
Serial.begin(9600);
BT.begin(deviceName);
Serial.println(deviceName + " listo para emparejar...");
}
void loop(){
serialEvent();
}

Para esté ejercicio vamos a utilizar nuestro celular y la aplicación Serial Bluetooth Terminal

Una vez descargado el programa del Bluetooth, emparejamos el ESP32 con nuestro celular, para lo
cual vamos a las opciones de activar y configurar el Bluetooth.

Docente: Armando Sarco Montiel Pág.


15
Lab. N° 11 Python-ESP32

Docente: Armando Sarco Montiel Pág.


16
Lab. N° 11 Python-ESP32

Ejercicio 11: Crear un programa utilizando el PIO IDE, para la conexión Bluetooth clásico el cúal nos
permitirá prender y apagar un Led.

#include <BluetoothSerial.h>
BluetoothSerial BT;
const String deviceName = "ESP32ASM";
String message = "";
char incomingChar;
void serialEvent(){
if(Serial.available())
BT.write(Serial.read());
if(BT.available()){
incomingChar = BT.read();
if (incomingChar != '\n'){message += String(incomingChar);}
else{message = "";}
Serial.write(incomingChar);
}
if (message == "1"){digitalWrite(2, HIGH);}
else if (message == "2"){digitalWrite(2, LOW);}
delay(20);
}
void setup(){
Serial.begin(9600);
BT.begin(deviceName);
pinMode(2, OUTPUT);
Serial.println(deviceName + " listo para emparejar...");
}
void loop(){
serialEvent();
}

Ejercicio 12: (Reto Tecsup): Crear un programa utilizando el PIO IDE, para la conexión Bluetooth
clásico el cúal nos permitirá prender y apagar un Led desde el App Inventor 2

#include <BluetoothSerial.h>
BluetoothSerial BT;
const String deviceName = "ESP32ASM";
String mensaje = "";
char caracterEntrante;
void serialEvent(){
if(Serial.available())
BT.write(Serial.read());
if(BT.available()){
caracterEntrante = BT.read();
if(caracterEntrante != '\n')
mensaje += String(caracterEntrante);
else
mensaje = "";
Serial.write(BT.read());
}
if (mensaje == "1")
digitalWrite(2, HIGH);
else if (mensaje == "2")
digitalWrite(2, LOW);
delay(20);

Docente: Armando Sarco Montiel Pág.


17
Lab. N° 11 Python-ESP32

}
void setup(){
Serial.begin(115200);
BT.begin(deviceName);
pinMode(2, OUTPUT);
Serial.println(deviceName + "Listo para emparejar...");
}
void loop(){
serialEvent();
}

Docente: Armando Sarco Montiel Pág.


18
Lab. N° 11 Python-ESP32

Ejercicio 13: (Reto Tecsup): Crear un programa utilizando el PIO IDE y el AppInventor para la
conexión Bluetooth de la temperatura y humedad en el celular.

Docente: Armando Sarco Montiel Pág.


19

También podría gustarte