Programación en Python: de la consola al CircuitPython
Saberes esenciales: entorno, tipos, operadores, control de flujo, listas, tuplas, diccionarios, funciones, archivos, errores, librerías, POO, innovación e IoT / IIoT con CircuitPython. Teoría corta y ejemplos para copiar en Thonny.
1. Preparación del software
Python es un lenguaje interpretado. El estudiante escribe un archivo .py y el intérprete lo ejecuta línea por línea. En el CTP conviene un IDE simple: Thonny (también sirve para CircuitPython) o IDLE que viene con la instalación oficial.
Descarga
- Sitio oficial: python.org → Downloads. En Windows marcar Add python.exe to PATH.
- Thonny: thonny.org (trae su propio Python; útil si el laboratorio no deja instalar como administrador).
- Versión recomendada de taller: 3.11 o 3.12. No usar Python 2.
Instalación
| Paso | Qué hacer | Cómo comprobar |
|---|---|---|
| 1 | Ejecutar el instalador. PATH activado. | Reiniciar la terminal. |
| 2 | Abrir CMD o PowerShell. | python --version debe mostrar 3.x |
| 3 | Probar el REPL. | python → sale >>> |
| 4 | Salir del REPL. | exit() o Ctrl+Z Enter |
Configuración
- Thonny: Herramientas → Opciones → Intérprete → Python 3 local, o CircuitPython (generic) cuando haya una placa.
- Sangría: 4 espacios. Nunca mezclar tabuladores. Thonny lo fuerza.
- Codificación del archivo: UTF-8 (tildes y eñes).
- Carpeta de trabajo del curso, por ejemplo
Documentos/python-ctp/. Un archivo por práctica.
print("Hola, taller de Electrónica")
print(2 + 3)
2. Tipos de datos
Un tipo dice qué clase de valor guarda la variable y qué operaciones admite. La función nativa type() lo revela.
| Familia | Tipo en Python | Ejemplo | Uso en taller |
|---|---|---|---|
| Texto | str | "Pico", 'LED' | Nombre de sensor, mensaje serial |
| Numéricos | int | 12, -3 | Contador, pin, samples |
float | 3.3, 12.0 | Voltaje, temperatura | |
| Booleanos | bool | True, False | Pulsador, alarma, habilitar |
| Secuencias | list, tuple | [1,2], (1,2) | Muestras, coordenadas |
| Mapeo | dict | {"V":12} | Hoja de datos resumida |
tension = 12 # int rizado = 0.35 # float placa = "Pico W" # str alarma = True # bool print(type(tension), type(rizado), type(placa), type(alarma))
True y False van con mayúscula. true es un NameError. En electrónica, 1 y 0 no son lo mismo que True y False hasta que se convierten.3. Palabras reservadas y variables
Palabras clave (no se pueden usar como nombre)
Python reserva palabras para la gramática del lenguaje. Si las usa como variable, hay SyntaxError.
import keyword print(keyword.kwlist)
Las que más salen en 10°/11°: if elif else while for def return class import from as try except finally True False None and or not in is pass break continue global.
Manejo de variables
- Nombre: letras, dígitos y
_. No empieza con dígito. Sensible a mayúsculas:Vout≠vout. - Estilo del curso:
snake_case→voltaje_salida,pin_led. - Asignación con
=. El valor de la derecha se guarda a la izquierda. - Se puede reasignar y hasta cambiar de tipo (tipado dinámico).
pin_led = 25
pin_led = "GP25" # ahora es texto; legal, pero confunde
v_in, v_out = 12.0, 5.0
print(v_in - v_out)
l, O, list, type, str. Chocan con funciones nativas o se leen mal en pizarra.4. Operadores, prioridad y conversiones
Aritméticos
| Op | Nombre | Ejemplo | Resultado |
|---|---|---|---|
+ - * | suma, resta, producto | 10 - 3 | 7 |
/ | división real | 10 / 4 | 2.5 (siempre float) |
// | división entera | 10 // 4 | 2 |
% | módulo (resto) | 10 % 4 | 2 |
** | potencia | 2 ** 10 | 1024 |
Comparación, lógicos, identidad, asignación, concatenación
| Familia | Operadores | Idea |
|---|---|---|
| Comparación | == != < > <= >= | Devuelven bool. == no es =. |
| Lógicos | and or not | Combinan condiciones. |
| Identidad | is / is not | ¿Es el mismo objeto en memoria? Para None use is None. |
| Pertenencia | in / not in | ¿Está en la cadena, lista o dict? |
| Asignación | = += -= *= /= //= %= **= | n += 1 equivale a n = n + 1. |
| Concatenación | + entre str o listas | "GP" + "25" → "GP25" |
v = 11.4 print(v >= 11.0 and v <= 12.6) # rango de batería 12 V print("LED" in "LED rojo") print(5 == 5.0) # True: mismo valor print(5 is 5.0) # False: no es el mismo objeto
Prioridad de operadores (de mayor a menor)
()paréntesis***///%+-- Comparaciones
notandor
print(2 + 3 * 4) # 14, no 20 print((2 + 3) * 4) # 20 print(not False and True)
Conversiones de tipo
adc = "847"
volts = int(adc) * 3.3 / 65535
print(volts)
print(str(12) + " V")
print(bool(0), bool(5), bool(""))
5. Manejo de cadenas de texto
Una cadena (str) es inmutable: los métodos devuelven otra cadena, no cambian la original.
msg = " Sensor DHT22 "
print(len(msg))
print(msg.strip())
print(msg.lower())
print(msg.upper())
print("DHT22" in msg)
print(msg.replace("DHT22", "LM35"))
print(f"Temperatura = {26.4:.1f} °C")
print("GP25".startswith("GP"))
pines = "2,3,4,5".split(",")
print(pines)
print("-".join(pines))
Ejemplo de taller — etiqueta de medición
canal = 1
v = 4.97
print(f"CH{canal}: {v:.2f} V")
6. Estructuras condicionales y bucles
Indentación
Python no usa llaves. El bloque que “pertenece” a un if, for o def va sangrado 4 espacios. Si la sangría se rompe, IndentationError.
if, if-else, elif
vbat = 11.2
if vbat >= 12.4:
estado = "cargada"
elif vbat >= 11.8:
estado = "normal"
elif vbat >= 11.0:
estado = "baja"
else:
estado = "crítica — no arrancar"
print(estado)
while
Repite mientras la condición sea True. Hay que cambiar la variable o el bucle no termina.
n = 3
while n > 0:
print("tick", n)
n -= 1
print("listo")
for, range, break y continue
for i in range(5): # 0 1 2 3 4 print(i, end=" ") print() for i in range(1, 6): # 1 a 5 if i == 3: continue # salta este giro if i == 5: break # sale del for print(i)
| Herramienta | Qué hace |
|---|---|
range(n) | 0, 1, …, n−1 |
range(a, b) | a … b−1 |
range(a, b, paso) | con salto (puede ser negativo) |
break | Sale del bucle enseguida |
continue | Pasa al siguiente giro, no ejecuta el resto del cuerpo |
7. Listas
La lista es una secuencia mutable y ordenada. Admite tipos mezclados, pero en taller se usa un solo tipo (muestras, pines, nombres).
Crear, usar, agregar y quitar
muestras = [512, 520, 498, 530] pines = ["GP2", "GP3", "GP4"] vacia = [] print(muestras[0], muestras[-1]) # primero y último print(muestras[1:3]) # rebanada: índices 1 y 2 muestras.append(505) # al final muestras.insert(0, 500) # en una posición muestras.remove(498) # por valor (primera aparición) ultimo = muestras.pop() # saca el último del muestras[0] # por índice print(len(muestras), min(muestras), max(muestras), sum(muestras))
Ordenamiento y funciones nativas
temps = [26.1, 24.0, 27.3, 25.5] ordenadas = sorted(temps) # nueva lista temps.sort(reverse=True) # cambia la original print(ordenadas) print(temps) print(temps.index(24.0)) print(temps.count(24.0))
| Método / función | Efecto |
|---|---|
append insert extend | Agregar |
remove pop clear | Quitar |
sort / sorted / reverse | Orden |
len min max sum | Nativas que recorren la lista |
index count | Buscar |
Promedio de 5 lecturas ADC
lecturas = [1840, 1855, 1832, 1860, 1848] prom = sum(lecturas) / len(lecturas) print(round(prom, 1))
8. Matrices: concepto y operaciones
En Python básico una matriz es una lista de listas (filas). Todas las filas deben tener la misma cantidad de columnas.
A = [
[1, 2, 3],
[4, 5, 6],
]
print(A[1][2]) # fila 1, columna 2 → 6
filas, cols = len(A), len(A[0])
# suma elemento a elemento con B
B = [[7, 8, 9], [1, 1, 1]]
C = []
for i in range(filas):
fila = []
for j in range(cols):
fila.append(A[i][j] + B[i][j])
C.append(fila)
print(C)
Operaciones de taller: recorrer, sumar dos matrices iguales, multiplicar por un escalar, transponer. El producto matricial completo se deja para cuando se importe numpy (12° o proyecto).
9. Tuplas
La tupla es una secuencia inmutable: una vez creada no se le agregan ni cambian elementos. Sirve para datos que no deben “moverse” (tamaño de pantalla, color RGB, pines fijos).
rgb = (255, 80, 0) origen = (0, 0) uno = (7,) # la coma hace la tupla de un solo dato print(rgb[0], len(rgb)) print(rgb.count(0), rgb.index(80)) x, y, z = rgb # desempaquetado print(z)
| Lista | Tupla | |
|---|---|---|
| Se escribe | [1, 2] | (1, 2) |
| ¿Se cambia? | Sí (mutable) | No (inmutable) |
| Métodos | muchos | casi solo count e index |
| Uso | colección que crece | registro fijo, clave de dict, return múltiple |
10. Diccionarios
El diccionario mapea clave → valor. Las claves son únicas y, en la práctica del curso, textos o números.
sensor = {
"nombre": "LM35",
"unidad": "°C",
"escala": 10.0, # mV / °C
"pines": (26,),
}
print(sensor["nombre"])
sensor["offset"] = 0.0
print(sensor.get("rango", "no definido"))
for clave, valor in sensor.items():
print(clave, "=", valor)
print(list(sensor.keys()))
print(list(sensor.values()))
| Método | Para qué | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
d[k] / d.get(k, default) | Leer. get no explota si falta la clave | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
d[k] = v | Crear o actualizar | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pop del | Borrar | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
keys values <
Electrónica Industrial · CTP · Material audiovisual
Programación en Python: videos e imágenes sugeridasPulse la miniatura: se abre YouTube. No se embebe el reproductor (en archivo local el embed suele fallar). Teoría y ejemplos: programacion-python.html. En clase: el estudiante abre el video, anota lo de Observe y vuelve a la guía. Si YouTube está bloqueado, copie el título de la tabla final. Hay dos cursos largos con capítulos (freeCodeCamp Español y HolaMundo): úselos como “salto al minuto”, no para verlos enteros en una lección.
1. Preparación del software
Imagen sugerida: instalador oficial con Add python.exe to PATH marcado. Busque: Python Windows installer Add to PATH.
Thonny: editor + Shell + variables. Ideal en el CTP. Busque: Thonny IDE screenshot. ![]() Cómo instalar Thonny en WindowsRoelcode · 5:49
Observe: thonny.org → instalador → primer Run. No necesita PATH del sistema. Abrir en YouTube![]() Instalar Python y empezar (Thonny / VS Code / Replit)Silvia Te Explica · 7:37
Observe: tres caminos. En el laboratorio, Thonny primero. PATH solo si instalan el oficial. Abrir en YouTube![]() Cómo instalar Python: PATH y pipPyarmando Academy · 28:10
Observe: casilla PATH; 2. Tipos, variables, operadores y cadenas![]() Tipos, operadores y variablespildorasinformaticas · 21:27
Observe: int / float / str; ![]() Curso Python desde cero (capítulos)freeCodeCamp Español · 4:36:43
Observe por minuto: 19:34 variables · 31:22 tipos · 36:37 cadenas · 1:10:07 operadores. No lo vea de un tirón. Abrir en YouTubeHolaMundo (mismo estilo de capítulos): tQZy0U8s9LY — strings 52:26, math 1:25:31, conversión de tipos 1:37:25.
3. Condicionales y bucles![]() if / elif / else, for y whileHolaMundo · ir a 1:45:54
Observe: indentación de 4 espacios; ![]() for, range y while (mismos capítulos)freeCodeCamp Español · 2:37:26 / 2:55:30
Observe: 4. Listas, tuplas, matrices y diccionarios![]() Listas, tuplas, conjuntos y diccionariosFRIKIdelTO · 30:48
Observe: append / insert / remove / pop; tupla inmutable; dict se recorre con
Imagen sugerida: panel Variables de Thonny al inspeccionar una lista y un dict. Busque: Thonny variables pane list. Matriz = lista de listas. No hay video corto obligatorio: en clase armamos
A[fila][col] en la pizarra y lo corren en Thonny (bloque 8 de la guía).5. Funciones, return y recursividad![]() Funciones y recursiónfreeCodeCamp Español · 3:03:42 y 3:29:47
Observe: parámetro ≠ argumento; ![]() Parámetros, return y alcanceHolaMundo · 2:40:52
Observe: argumento nombrado; variable local vs global; por qué evitar 6. Archivos y rutas![]() Manejo de archivosfreeCodeCamp Español · 3:43:34
Observe: modos r / w / a; ![]() Archivos, excepciones y JSONProgramming Pills · 1:22:55
Observe: 7. Errores y try-except![]() Manejo de excepciones (try-except)La Geekipedia De Ernesto · 28:30
Observe: sintaxis vs excepción; ValueError y ZeroDivisionError; else y finally. Abrir en YouTube![]() try, except, else, finally, raiseSergio A. Castaño · 34:45
Observe: no tragar todos los errores con 8. Librerías e instalación con PIP![]() Cómo instalar librerías: pip o condaLa Cartilla · 10:59
Observe: en el CTP use Comando de pizarra:
python -m pip install --upgrade pip y luego el paquete. Thonny: Herramientas → Administrar paquetes (evita el pip “del otro Python”).9. POO: clase, objeto, herencia y polimorfismo![]() Los cuatro pilares en un solo ejemploBitBoss · 27:31
Observe: abstracción 0:44 · encapsulamiento 10:37 · herencia 15:02 · polimorfismo 23:05. Tradúzcalo a un Sensor, no a un videojuego, al volver a la guía. Abrir en YouTube![]() Herencia en PythonTurbo Código · 35:07
Observe: clase base / derivada; Intro corta de clase/objeto si hace falta el arranque: Sergio Castaño, Programación Orientada a Objetos en Python [Introducción] — 10. IoT / IIoT y CircuitPython
Placa de taller: Pico / Pico 2. Botón BOOTSEL + USB = disco RPI-RP2. Luego CIRCUITPY. Busque: Raspberry Pi Pico board BOOTSEL. ![]() Instalar CircuitPython (Playground y Pico)Build With Prof. G. · 7:51
Observe: UF2 de circuitpython.org; BOOTSEL en Pico; el disco cambia de nombre. Abrir en YouTube![]() Pico + CircuitPython: primer códigoguía paso a paso · ~10 min
Observe: copiar librerías a ![]() Getting Started with CircuitPythonAdafruit · Dan Halbert · 1:01:08
Observe (en inglés, subtítulos): qué es CircuitPython 5:45 · instalar 15:16 · code.py 31:16 · librerías 43:36. Use 10 minutos, no la hora. Abrir en YouTube![]() Pico + Thonny: primer LED (MicroPython)Sam · 7:43 · español
Observe y distinga: Electrónica Industrial · CTP · Programación
Programación en Arduino IDE: del Blink al sensorEntorno, sketch, tipos, operadores, Serial, if/bucles, arreglos, funciones, pines, PWM, millis, librerías, errores, sensores/actuadores, nociones de clase e IoT. Ejemplos para pegar en el IDE. Videos: programacion-arduino-videos.html. 1. Preparación del IDE ArduinoEl IDE (entorno de desarrollo) escribe, compila y carga el programa (sketch) a la placa. En el CTP use Arduino IDE 2.x desde Descarga e instalación
Configuración mínima antes de cargar
IDE 2: verificar (✓), cargar (→), selector de placa y puerto, Monitor Serie. Falla #1 del laboratorio: “no hay puerto COM”. Causas: cable solo de carga, driver CH340/CP2102 ausente, placa china Nano con Old Bootloader. Desconecte, mire qué COM desaparece, reconecte.
2. El sketch: setup() y loop()Un programa de Arduino es un archivo void setup() {
// corre UNA vez al reset o al energizar
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// corre para siempre
digitalWrite(LED_BUILTIN, HIGH);
delay(300);
digitalWrite(LED_BUILTIN, LOW);
delay(300);
}
En UNO, LED_BUILTIN es el pin 13. En algunas ESP32 es el pin 2. No lo adivine: mire la seda de la placa.
3. Tipos de datosEn Arduino el tipo se declara. No es Python:
int cuentas = 512; float volts = cuentas * (5.0 / 1023.0); bool alarma = volts > 3.3; char unidad = 'V'; En UNO,
int son 16 bit. Un resultado de millis() no cabe en int. Use unsigned long.4. Variables, constantes y palabras reservadas
Palabras que no se usan como nombre: const int PIN_LED = 13; // global, no cambia int cuenta = 0; // global, sí cambia void loop() { int instantaneo = analogRead(A0); // local cuenta++; } 5. Operadores
int adc = analogRead(A0);
float v = adc * 5.0 / 1023.0;
if (v >= 1.0 && v <= 4.0) {
// rango válido
}
6. Monitor Serie y textoEl Monitor Serie (lupa / ícono de la derecha en IDE 2) es la “consola”. Baudios del sketch = baudios de la ventana. 9600 es el valor de aula. void setup() {
Serial.begin(9600);
}
void loop() {
int adc = analogRead(A0);
Serial.print("ADC=");
Serial.print(adc);
Serial.print(" V=");
Serial.println(adc * 5.0 / 1023.0, 2); // 2 decimales
delay(300);
}
7. Condicionales y buclesint adc = analogRead(A0);
if (adc < 200) {
digitalWrite(13, LOW);
} else if (adc < 800) {
analogWrite(9, 80); // pin PWM
} else {
analogWrite(9, 255);
}
switch (modo) {
case 0: break;
case 1: digitalWrite(13, HIGH); break;
default: break;
}
for (int i = 0; i < 5; i++) {
digitalWrite(13, HIGH);
delay(80);
digitalWrite(13, LOW);
delay(80);
}
int n = 3;
while (n > 0) {
n--;
}
8. Arreglos (el equivalente a listas)Arduino no trae listas ni diccionarios de Python. El arreglo tiene tamaño fijo y un solo tipo. const int N = 8;
int muestras[N];
int pines[] = {2, 3, 4, 5}; // el compilador cuenta = 4
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(pines[i], OUTPUT);
}
}
void loop() {
long suma = 0;
for (int i = 0; i < N; i++) {
muestras[i] = analogRead(A0);
suma += muestras[i];
delay(10);
}
int promedio = suma / N;
}
Una “matriz” es un arreglo de dos índices: Índice desde 0.
pines[4] cuando hay 4 elementos es basura o un reset misterioso. No hay append.9. Funciones: parámetros, return e indentaciónfloat adcAVolt(int cuentas, float vref = 5.0) {
return cuentas * vref / 1023.0;
}
void parpadear(int pin, int veces) {
for (int i = 0; i < veces; i++) {
digitalWrite(pin, HIGH);
delay(80);
digitalWrite(pin, LOW);
delay(80);
}
}
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop() {
float v = adcAVolt(analogRead(A0));
if (v > 3.0) parpadear(13, 3);
Serial.println(v, 2);
delay(200);
}
Declare la función antes de usarla, o ponga solo el prototipo arriba y el cuerpo abajo. Recursión: posible, pero la pila del UNO es chica; un factorial didáctico sí, un árbol profundo no. 10. Pines digitales
const int PIN_BTN = 2;
const int PIN_LED = 13;
void setup() {
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_BTN, INPUT_PULLUP);
}
void loop() {
if (digitalRead(PIN_BTN) == LOW) { // presionado
digitalWrite(PIN_LED, HIGH);
} else {
digitalWrite(PIN_LED, LOW);
}
}
UNO R3: digitales 0–13 (PWM con ~), analógicos A0–A5, 5 V / 3.3 V / GND. Pines 0 y 1 son RX/TX: no los use si el Monitor Serie está abierto. 11. Analógico y PWMADC del UNO: 10 bit → V = cuentas × 5.0 / 1023.0 | LM35: °C ≈ (V × 100) si está a 5 V y 10 mV/°C PWM: pines con int adc = analogRead(A0); int pwm = map(adc, 0, 1023, 0, 255); analogWrite(9, pwm);
12. Tiempo: delay vs millis
unsigned long t0 = 0;
bool ledOn = false;
void loop() {
if (millis() - t0 >= 300) {
t0 = millis();
ledOn = !ledOn;
digitalWrite(LED_BUILTIN, ledOn);
}
// aquí puede leer el pulsador en cada giro
}
Reste
millis() - t0 y compare. No escriba if (millis() == t0 + 300): se le pasa el instante exacto.13. Librerías (el “pip” de Arduino)Una librería es código ajeno que se incluye con
#include <Servo.h>
Servo puerta;
void setup() {
puerta.attach(9);
}
void loop() {
puerta.write(90);
delay(800);
puerta.write(0);
delay(800);
}
Incluir de más no “pesa” tanto como en PC, pero cada objeto (Servo, SoftwareSerial) se come timers y RAM. En clones, si el Library Manager falla, se baja el .zip y se usa Croquis → Incluir biblioteca → Añadir biblioteca .ZIP. 14. Errores y fallas
No hay int leerAdc(int pin) {
int x = analogRead(pin);
if (x < 0) return 0; // no debería, pero documenta la idea
if (x > 1023) return 1023;
return x;
}
El Monitor Serie + un LED de “estoy vivo” evitan cazar fantasmas. Si la placa se resetea sola: alimentación débil, corto o un arreglo fuera de rango. 15. Sensores y actuadoresSensor → magnitud a señal que el UNO entiende (0/5 V, 0–1023, pulso, I2C).
Actuador → el programa cambia el mundo.
const int TRIG = 8, ECHO = 7;
float distanciaCm() {
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long us = pulseIn(ECHO, HIGH, 30000); // timeout 30 ms
if (us == 0) return -1;
|




































