EuraStudy
Apuntes/Tecnología e Ingeniería/Programación e internet de las cosas
ES · Selectividad

Programación e internet de las cosas

Este tema reúne los fundamentos de la programación (variables, tipos, operadores, estructuras de control y funciones), el diseño y la depuración de algoritmos mediante diagramas de flujo y pseudocódigo, y la arquitectura del «internet de las cosas» (IoT): sensores, actuadores, microcontroladores y conectividad. Es contenido evaluable de Selectividad en Tecnología e Ingeniería: se pide razonar la salida o el coste de un algoritmo, trazar/corregir un programa, diseñar la lógica de un sistema con un microcontrolador y describir la cadena IoT extremo-a-extremo. Cierra el bloque de informática de la materia conectando la lógica del software con la electrónica de los proyectos tecnológicos.

4 secciones·~25 min de lectura·2 competencias·Revisado · 07/2026

T·0888 / 11
Perfil de examen
CE5 · Diseñar, crear y evaluar sistemas tecnológicos, aplicando conocimientos de programación informática, regulación automática y control, así como las posibilidades que ofrecen las tecnologías emergentes, para estudiar, controlar y automatizar tareas.I.5.3 · Conocer y comprender conceptos básicos de programación textual, mostrando el progreso paso a paso de la ejecución de un programa a partir de un estado inicial y prediciendo su estado final tras la ejecución.
Operadores:analizaexplicacalculajustificainterpretarazonarelacionadiseñatraducedepura

nivel básico

Como materia de modalidad, todo el tema es de nivel de profundización; lo mínimo exigible es saber leer y trazar un algoritmo con las tres estructuras de control, expresarlo en pseudocódigo y diagrama de flujo, y describir la cadena IoT sensor → microcontrolador → conectividad → actuador.

nivel avanzado

El dominio pleno añade la depuración sistemática (clasificar y corregir errores de sintaxis, ejecución y lógica), el cálculo del coste de un bucle y el diseño completo de la lógica de control de un sistema IoT con condiciones de histéresis y temporización.

Profundidad

Profundidad de lectura: En profundidad

Texto

Tamaño de texto: Estándar · Interlineado: Compacto

Cargar siempre los medios: desactivado

Contenido · 4 secciones▾
  1. Programación e internet de las cosas
    • 01Fundamentos de la programación: variables, control y funciones◐
    • 02Diseño de algoritmos: diagramas de flujo y pseudocódigo◐
    • 03Depuración y verificación de programas◐
    • 04Internet de las cosas (IoT) aplicado a proyectos●

4 secciones · 16 puntos clave · 3 fórmulas · 16 errores típicos

§ 01
§ 01

Fundamentos de la programación: variables, control y funciones#

~6 min de lectura●●○EstándarCVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Saberes básicos, bloque E (Sistemas informáticos. Programación): «Fundamentos de la programación textual. Características, elementos y lenguajes.»CVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Criterio de evaluación 5.3: «Conocer y comprender conceptos básicos de programación textual, mostrando el progreso paso a paso de la ejecución de un programa a partir de un estado inicial y prediciendo su estado final tras la ejecución.»

Anatomía de un programa: datos, operadores y control

Anatomía de un programaGrafo, Datos → Funciones, Operadores → Funciones, Control → Funciones, Funciones → Solución del problemaDatosOperadoresControlFuncionesSolución delproblema

Puntos clave

Programar es escribir, en un lenguaje que la máquina pueda ejecutar, la secuencia exacta de instrucciones que resuelve un problema. Todo programa se construye con un puñado de piezas elementales —datos que se guardan, operaciones que los transforman y decisiones que ordenan el flujo— y con la disciplina de que la computadora hace literalmente lo que se le dice, ni más ni menos. Por eso la precisión es la primera virtud del programador: un punto y coma de más, un operador confundido o una condición mal escrita producen un comportamiento incorrecto aunque la idea fuera buena.
Una variable es un espacio de memoria con un nombre al que se le asigna un valor que puede cambiar durante la ejecución; una constante es análoga pero su valor no varía. La asignación «x = 5» (o «x ← 5» en pseudocódigo) significa «guarda 5 en x», no una igualdad matemática: por eso «x = x + 1» es perfectamente válido y aumenta el contenido de x en uno. Cada variable tiene un tipo de dato que determina qué valores admite y qué operaciones tienen sentido: entero («int»), real o coma flotante («float»), carácter/cadena («char»/«string»), booleano («true»/«false») y los compuestos como vectores o listas («array»).
Los operadores combinan datos para producir nuevos valores. Los aritméticos (+\texttt{+}+, -\texttt{-}-, *\texttt{*}*, /\texttt{/}/, el módulo %\texttt{\%}% que da el resto de la división entera, y la potencia) operan sobre números; los relacionales («==» igualdad, «!=» distinto, «<», «<=», «>», «>=») comparan y devuelven un booleano; y los lógicos («AND»/«&&», «OR»/«||», «NOT»/«!») combinan booleanos siguiendo el álgebra de Boole. La precedencia importa: en 2 + 3 * 4\texttt{2 + 3 * 4}2 + 3 * 4 la multiplicación se evalúa antes, dando 14; los paréntesis fuerzan el orden: (2 + 3) * 4\texttt{(2 + 3) * 4}(2 + 3) * 4 vale 20. El operador módulo es clave en programación: «n % 2 == 0» comprueba si n es par y «n % 2 == 1» si es impar.
Las estructuras de control gobiernan el orden en que se ejecutan las instrucciones y son solo tres (teorema de la programación estructurada, Böhm-Jacopini). La secuencia ejecuta las instrucciones una tras otra de arriba abajo. La selección elige un camino según una condición booleana: «SI condición ENTONCES … SINO …» (en código «if … else»), con variantes anidadas o múltiples («else if», «switch»). La iteración o bucle repite un bloque: «MIENTRAS condición HACER …» («while», comprueba la condición antes de cada vuelta y puede no ejecutarse nunca), «REPETIR … HASTA condición» («do…while», se ejecuta al menos una vez) y «PARA i DESDE a HASTA b HACER …» («for», con un contador que recorre un rango conocido). Véase la Fig. 2 con la tabla-resumen de las tres estructuras.

Las tres estructuras de control y su sintaxis

Las tres estructuras de controlTabla con 3 columnas y 3 filas, Datos: Estructura · Pseudocódigo · Código; Secuencia · instr1; instr2; … · a; b; c;; Selección · SI cond ENTONCES … SINO · if … else; Iteración · MIENTRAS / REPETIR-HASTA / PARA · while / do-while / forEstructuraPseudocódigoCódigoSecuenciainstr1; instr2; …a; b; c;SelecciónSI cond ENTONCES … SINOif … elseIteraciónMIENTRAS /REPETIR-HASTA /PARAwhile / do-while / for
Fig. 2 ↓
Las funciones (o subprogramas, procedimientos, métodos) encapsulan un bloque de código bajo un nombre, reciben datos de entrada por sus parámetros y normalmente devuelven un resultado. Permiten descomponer un problema grande en piezas pequeñas y reutilizables —el principio «divide y vencerás»— y evitan repetir código. Una variable declarada dentro de una función es local (solo existe ahí); una declarada fuera es global. Modularizar con funciones mejora la legibilidad, facilita la depuración y permite probar cada pieza por separado.

Vocabulario

→ Tarjetas
  • VariableEspacio de memoria identificado por un nombre cuyo contenido puede cambiar durante la ejecución; una constante es igual pero su valor no varía.
  • AsignaciónOperación que guarda en una variable el valor de una expresión; se escribe x ← 5 en pseudocódigo y x = 5 en la mayoría de lenguajes, y no es una igualdad matemática.
  • Tipo de datoClase de valores que una variable admite y operaciones que tienen sentido con ella: entero, real, carácter, cadena, booleano o compuesto como un vector.
  • Operador móduloOperador que devuelve el resto de la división entera: n mod 2 = 0 identifica los pares, y n mod d = 0 indica que d divide exactamente a n.Se escribe % en la mayoría de lenguajes y mod en pseudocódigo.
  • Estructura de controlConstrucción que fija el orden en que se ejecutan las instrucciones; según el teorema de la programación estructurada solo hacen falta tres: secuencia, selección e iteración.
  • Función (subprograma)Bloque de código con nombre que recibe datos por sus parámetros y normalmente devuelve un resultado, de modo que puede reutilizarse sin repetirlo.
  • Variable localVariable declarada dentro de una función, que solo existe mientras esa función se ejecuta, frente a la global, visible desde todo el programa.

Asignación (incremento)

x←x+1x \leftarrow x + 1x←x+1

El nuevo contenido de la variable x es su valor anterior más uno; la flecha (o el signo =) indica asignación, no igualdad matemática.

Operador módulo y paridad

n mod 2=0  ⟺  n es parn \bmod 2 = 0 \iff n \text{ es par}nmod2=0⟺n es par

El resto de dividir n entre 2 es cero exactamente cuando n es par; de forma análoga, d \mid n equivale a (n \bmod d = 0).

La reproducción carga contenido de YouTube (Google).Abrir en YouTube ↗
Ejemplo resuelto

Traza de un bucle con contador y condición

Dado el siguiente pseudocódigo, indica el valor final de la variable «suma». INICIO; suma ← 0; PARA i DESDE 1 HASTA 6 HACER: SI (i módulo 2 = 0) ENTONCES suma ← suma + i; FIN PARA; ESCRIBIR suma; FIN.

  1. 01Inicialización

    Antes del bucle, suma vale 0. El contador i recorrerá los valores 1, 2, 3, 4, 5, 6.

  2. 02Condición del SI

    Solo se acumula i cuando i es par, es decir cuando (i mod 2) = 0.

  3. 03Vueltas i=1,2,3

    i=1 (impar): no suma → 0. i=2 (par): suma ← 0+2 = 2. i=3 (impar): no suma → 2.

  4. 04Vueltas i=4,5,6

    i=4 (par): suma ← 2+4 = 6. i=5 (impar): no suma → 6. i=6 (par): suma ← 6+6 = 12.

  5. 05Comprobación

    Se han sumado los pares de 1 a 6: 2 + 4 + 6, que efectivamente es 12.

Resultado: La variable «suma» vale 12 al finalizar: el programa acumula los números pares entre 1 y 6.

Objetivo Selectividad

  • Trazar a mano la ejecución de un fragmento con bucles y condiciones, anotando el valor de cada variable en cada vuelta hasta dar la salida final.
  • Evaluar expresiones aplicando la precedencia de operadores y el significado del módulo: paridad, divisibilidad y último dígito de un número.
  • Distinguir y justificar cuándo conviene un MIENTRAS, un REPETIR-HASTA o un PARA, y reconocer el caso en que un MIENTRAS no se ejecuta ninguna vez.
  • Encapsular un fragmento repetido en una función, indicando sus parámetros, su valor devuelto y qué variables quedan locales.

Errores frecuentes

  • Escribir «si (x = 5)», que asigna 5 a x, en lugar de «si (x == 5)», que compara: en la condición de una selección va siempre el operador de igualdad, nunca el de asignación.
  • Olvidar modificar la variable de control dentro del MIENTRAS, con lo que la condición nunca llega a ser falsa; toda iteración debe cambiar la variable que evalúa.
  • Rechazar «x ← x + 1» por parecer una ecuación imposible: primero se evalúa x + 1 con el valor antiguo y ese resultado se guarda en x, que queda con una unidad más.
  • Evaluar 2 + 3 * 4\texttt{2 + 3 * 4}2 + 3 * 4 de izquierda a derecha y responder 20: la multiplicación se resuelve antes que la suma, así que el valor es 14, y solo (2 + 3) * 4\texttt{(2 + 3) * 4}(2 + 3) * 4 vale 20.

§ 01

Repaso activo

Escribe en pseudocódigo un programa que lea un número entero N y muestre cuántos de los números del 1 al N son múltiplos de 3. Indica qué tipo de dato usas para cada variable y razona qué estructura de control empleas.

Practicar con ejercicios afines8 preguntas de este tema→

Recuerdo activo

Recuerda los puntos clave — luego revela.

Fuentes: Real Decreto 243/2022, de 5 de abril, por el que se establecen la ordenación y las enseñanzas mínimas del Bachillerato (Gobierno de España — Boletín Oficial del Estado (BOE)) · 4. Más herramientas para control de flujo (Python Software Foundation — Documentación de Python) · Estructuras de control: iteración (Universitat Politècnica de València — RiuNet)

§ 02
§ 02

Diseño de algoritmos: diagramas de flujo y pseudocódigo#

~5 min de lectura●●○EstándarCVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Saberes básicos, bloque E (Sistemas informáticos. Programación): «Proceso de desarrollo: edición, compilación o interpretación, ejecución, pruebas y depuración. Creación de programas para la resolución de problemas. Modularización.»CVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Criterio de evaluación 5.3: «Conocer y comprender conceptos básicos de programación textual, mostrando el progreso paso a paso de la ejecución de un programa a partir de un estado inicial y prediciendo su estado final tras la ejecución.»CVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Criterio de evaluación 5.1: «Controlar el funcionamiento de sistemas tecnológicos y robóticos, utilizando lenguajes de programación informática y aplicando las posibilidades que ofrecen las tecnologías emergentes, tales como inteligencia artificial, internet de las cosas, big data...»

Símbolos normalizados del diagrama de flujo (ISO 5807)

SIMBOLOGÍA NORMALIZADAinicio/finE/S datosprocesodecisiónflujo

Puntos clave

Antes de escribir una sola línea de código conviene diseñar el algoritmo: la descripción precisa, ordenada y finita de los pasos que resuelven un problema. Un algoritmo correcto debe cumplir tres propiedades fundamentales: ser finito (terminar en un número limitado de pasos), preciso (cada paso definido sin ambigüedad) y definido (con las mismas entradas produce siempre la misma salida). El diseño del algoritmo es independiente del lenguaje de programación: primero se piensa la lógica y solo después se traduce a un lenguaje concreto.
El pseudocódigo expresa el algoritmo en un lenguaje intermedio entre el natural y el de programación: usa palabras clave estandarizadas (INICIO/FIN, LEER, ESCRIBIR, SI…ENTONCES…SINO, MIENTRAS, PARA) y la indentación para marcar los bloques, pero sin la sintaxis estricta de ningún lenguaje real. Su ventaja es que cualquiera lo entiende y se traduce fácilmente a código; por eso es la herramienta habitual para comunicar la lógica de un programa en un examen o en la documentación de un proyecto.
El diagrama de flujo (u ordinograma) representa el mismo algoritmo de forma gráfica con símbolos normalizados (norma ISO 5807): el óvalo o terminal marca el inicio y el fin; el romboide o paralelogramo, la entrada/salida de datos (LEER/ESCRIBIR); el rectángulo, un proceso o cálculo (una asignación); el rombo, una decisión con dos salidas (Sí/No, Verdadero/Falso); y las flechas indican el sentido del flujo. Un diagrama bien construido tiene un único inicio y un único fin, y cada rombo de decisión gobierna una bifurcación o un bucle. Véase la Fig. 3.

Diagrama de flujo: contar los pares de 1 a N

Diagrama de flujo: contar los pares de 1 a NGrafo, INICIO → Leer N, Leer N → cont←0 ; i←1, cont←0 ; i←1 → ¿i ≤ N?, ¿i ≤ N? → ¿i mod 2 = 0?, ¿i ≤ N? → Escribir cont, ¿i mod 2 = 0? → cont←cont+1, ¿i mod 2 = 0? → i←i+1, cont←cont+1 → i←i+1, i←i+1 → ¿i ≤ N?, Escribir cont → FININICIOLeer Ncont←0 ; i←1¿i ≤ N?¿i mod 2 = 0?cont←cont+1i←i+1Escribir contFINSíNoSíNo
Fig. 3 ↓
Los bucles aparecen en el diagrama de flujo cuando una flecha «vuelve hacia atrás» a un punto anterior, formando un ciclo que se cierra a través de un rombo de decisión: mientras la condición sea verdadera se repite el cuerpo; cuando es falsa, el flujo sale del bucle. Es esencial que dentro del ciclo se modifique alguna variable que acabe haciendo falsa la condición —de lo contrario el bucle es infinito—. El contador (variable que cuenta repeticiones) y el acumulador (variable que va sumando o concatenando) son los dos patrones clásicos que aparecen casi siempre dentro de los bucles.
Pseudocódigo y diagrama de flujo son dos representaciones equivalentes del mismo algoritmo y la Selectividad pide a menudo traducir de una a otra. La traducción es sistemática: una asignación del pseudocódigo es un rectángulo; un SI es un rombo del que parten dos ramas; un MIENTRAS es un rombo con una rama que retrocede al propio rombo; un LEER/ESCRIBIR es un romboide. Saber pasar de la idea al pseudocódigo, de este al diagrama y finalmente al código de un lenguaje real es la competencia central del diseño de programas.

Vocabulario

→ Tarjetas
  • AlgoritmoDescripción precisa, ordenada y finita de los pasos que resuelven un problema, independiente del lenguaje de programación con el que después se implemente.
  • PseudocódigoNotación intermedia entre el lenguaje natural y uno de programación, con palabras clave fijas (INICIO, LEER, SI, MIENTRAS, PARA) e indentación, pero sin sintaxis estricta.
  • Diagrama de flujo (ordinograma)Representación gráfica del algoritmo con símbolos normalizados: óvalo de inicio y fin, romboide de entrada y salida, rectángulo de proceso y rombo de decisión.
  • Rombo de decisiónSímbolo del que parten dos ramas excluyentes, sí y no, según sea verdadera o falsa una condición; es el símbolo a través del cual se cierra todo bucle.
  • ContadorVariable que se incrementa una cantidad fija en cada vuelta para llevar la cuenta de las repeticiones o de los casos que cumplen una condición.
  • AcumuladorVariable que va sumando o concatenando los valores recorridos por el bucle; se inicializa a 0 si acumula sumas y a 1 si acumula productos.
  • Bucle infinitoIteración cuya condición nunca llega a ser falsa porque ninguna instrucción del cuerpo modifica la variable evaluada, de modo que el programa no termina.
La reproducción carga contenido de YouTube (Google).Abrir en YouTube ↗
La reproducción carga contenido de YouTube (Google).Abrir en YouTube ↗
Ejemplo resuelto

De pseudocódigo a diagrama: factorial de un número

Se da el algoritmo en pseudocódigo: INICIO; LEER n; f ← 1; i ← 1; MIENTRAS (i <= n) HACER: f ← f * i; i ← i + 1; FIN MIENTRAS; ESCRIBIR f; FIN. Calcula la salida para n = 4 y describe los símbolos del diagrama de flujo equivalente.

  1. 01Inicialización

    Se lee n = 4. Se ponen el acumulador f ← 1 y el contador i ← 1. En el diagrama: un romboide LEER n y un rectángulo con las dos asignaciones.

  2. 02Rombo del bucle

    El MIENTRAS (i <= n) se dibuja como un rombo de decisión; mientras es verdadero el flujo entra en el cuerpo, cuando es falso sale hacia ESCRIBIR.

  3. 03Iteraciones

    i=1: f ← 1·1 = 1, i ← 2. i=2: f ← 1·2 = 2, i ← 3. i=3: f ← 2·3 = 6, i ← 4. i=4: f ← 6·4 = 24, i ← 5.

  4. 04Salida del bucle

    Con i = 5 la condición (5 <= 4) es falsa: el flujo sale del rombo y llega al romboide ESCRIBIR f.

  5. 05Resultado

    Se imprime f = 24, que es el factorial de 4.

Resultado: Para n = 4 el algoritmo calcula 4! = 24; el diagrama tiene un terminal de inicio, un romboide de lectura, un rectángulo de inicialización, un rombo de decisión que cierra el bucle, un rectángulo de proceso (f·i, i+1), un romboide de salida y un terminal de fin.

Objetivo Selectividad

  • Traducir un algoritmo dado en pseudocódigo a su diagrama de flujo con los símbolos normalizados correctos, y hacer también el camino inverso.
  • Identificar en un diagrama el rombo que cierra el bucle y la variable cuya modificación garantiza que ese bucle termina.
  • Reconocer los patrones de contador y de acumulador y decir con qué valor debe inicializarse cada uno antes de entrar en el bucle.
  • Justificar que un algoritmo es finito señalando la instrucción que acaba haciendo falsa la condición y el valor con el que la iteración se detiene.

Errores frecuentes

  • Usar el rectángulo de proceso donde corresponde un rombo de decisión o un romboide de entrada y salida: cada símbolo tiene una semántica fija y no es intercambiable.
  • Dibujar un diagrama con varias salidas finales o sin terminal de fin, cuando la regla es un único inicio y un único fin por algoritmo.
  • Empezar a acumular sin inicializar: el acumulador de una suma debe partir de 0 y el de un producto de 1, y el contador de 0 o de 1 según lo que se cuente.
  • Trazar la flecha de retorno del bucle hacia dentro del cuerpo en vez de hacia el rombo: si la condición deja de comprobarse en cada vuelta, el ciclo ya no puede terminar.

§ 02

Repaso activo

Diseña el algoritmo que lee cinco números enteros y muestra el mayor de todos. Exprésalo primero en pseudocódigo y dibuja después su diagrama de flujo. Indica con qué valor inicializas la variable maximo y justifica que tu elección sigue siendo correcta aunque los cinco números introducidos sean negativos.

Practicar con ejercicios afines8 preguntas de este tema→

Recuerdo activo

Recuerda los puntos clave — luego revela.

Fuentes: Algorítmica y Complejidad (2024) (Universidad de Cantabria — OpenCourseWare (OCW)) · Estructura de Datos y Algoritmos (Python) (Universidad Carlos III de Madrid — OpenCourseWare (OCW))

§ 03
§ 03

Depuración y verificación de programas#

~6 min de lectura●●○EstándarCVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Saberes básicos, bloque E (Sistemas informáticos. Programación): «Proceso de desarrollo: edición, compilación o interpretación, ejecución, pruebas y depuración. Creación de programas para la resolución de problemas. Modularización.»CVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Criterio de evaluación 5.3: «Conocer y comprender conceptos básicos de programación textual, mostrando el progreso paso a paso de la ejecución de un programa a partir de un estado inicial y prediciendo su estado final tras la ejecución.»

Puntos clave

Escribir un programa que funcione a la primera es raro: la depuración —encontrar y corregir los errores o «bugs»— es parte esencial del desarrollo. Verificar un programa es comprobar que produce la salida correcta para todas las entradas previstas, incluidos los casos límite. La depuración es metódica, no se basa en cambiar cosas al azar: se reproduce el fallo, se localiza la línea o el bloque responsable, se entiende la causa, se corrige y se vuelve a probar.
Los errores se clasifican en tres grandes tipos. Los errores de sintaxis violan las reglas del lenguaje (un paréntesis sin cerrar, una palabra clave mal escrita, un punto y coma olvidado); el compilador o intérprete los detecta y el programa ni siquiera arranca. Los errores de ejecución (o en tiempo de ejecución, runtime) aparecen al ejecutarse: el programa arranca pero se detiene con un fallo, como una división entre cero, el acceso a una posición inexistente de un vector o el desbordamiento de un tipo. Los errores lógicos o semánticos son los más insidiosos: el programa se ejecuta sin avisar pero da un resultado incorrecto porque la lógica está mal —una condición invertida, un bucle que cuenta una vuelta de más o de menos (error «por uno», off-by-one)—.
Las técnicas de depuración van de lo manual a lo asistido. La traza de escritorio consiste en ejecutar el programa «a mano» en una tabla, anotando el valor de cada variable en cada paso, hasta detectar dónde se desvía del resultado esperado; es la técnica que más se pide en Selectividad. Insertar mensajes de salida («ESCRIBIR» / «print») en puntos clave permite observar el estado de las variables durante la ejecución. Y los depuradores (debuggers) de los entornos de programación permiten poner puntos de ruptura (breakpoints), ejecutar paso a paso e inspeccionar el contenido de las variables en vivo. Véase la Fig. 5 con el ciclo de depuración.

Ciclo de depuración y tipos de error

Ciclo de depuraciónGrafo, 1. Reproducir el fallo → 2. Localizar (traza), 2. Localizar (traza) → 3. Corregir la causa, 3. Corregir la causa → 4. Verificar, 4. Verificar → 1. Reproducir el fallo1. Reproducir elfallo2. Localizar(traza)3. Corregir lacausa4. Verificar
Fig. 5 ↓
La verificación se apoya en el diseño de casos de prueba que cubran el comportamiento esperado. Conviene probar el caso típico, los casos límite (el valor cero, el vector vacío, el primer y el último elemento) y los casos inválidos (una entrada negativa donde se esperaba positiva). El error «por uno» (off-by-one) es típico en bucles: usar «<» donde debía ir «<=» (o al revés) hace que el bucle se ejecute una vez de menos o de más; probar con el primer y el último valor del rango lo destapa enseguida.
Buenas prácticas que previenen errores antes de que aparezcan: nombres de variables descriptivos, comentarios que expliquen el porqué del código, indentación coherente, modularización en funciones pequeñas y verificables, e inicialización explícita de toda variable antes de usarla. Un código limpio y bien estructurado no solo tiene menos errores: cuando aparece uno, se localiza mucho antes.

Vocabulario

→ Tarjetas
  • DepuraciónProceso metódico de reproducir el fallo, localizar la instrucción responsable, entender su causa, corregirla y volver a verificar el programa.
  • Error de sintaxisIncumplimiento de las reglas del lenguaje, como un paréntesis sin cerrar o una palabra clave mal escrita, que el compilador detecta y que impide que el programa arranque.
  • Error de ejecuciónFallo que aparece con el programa ya en marcha y lo detiene: división entre cero, acceso a una posición inexistente de un vector o desbordamiento de un tipo.
  • Error lógicoFallo de razonamiento que no impide la ejecución pero produce un resultado incorrecto, como una condición invertida o un límite de bucle mal puesto.
  • Traza de escritorioEjecución manual del programa sobre una tabla que anota el valor de cada variable en cada paso, hasta ver en qué instrucción el resultado se desvía del esperado.
  • Error por unoError lógico en el límite de una iteración, por usar menor que donde correspondía menor o igual o al revés, que hace ejecutar una vuelta de más o de menos.En inglés, off-by-one.
  • Caso límiteEntrada situada en el borde del rango previsto, como el valor cero, la colección vacía o el último elemento, donde se destapan la mayoría de los errores.
La reproducción carga contenido de YouTube (Google).Abrir en YouTube ↗
Ejemplo resuelto

Diagnóstico de un error «por uno» mediante traza

Un alumno escribe este código para sumar 1+2+...+10 y obtiene 45 en vez de 55: «s ← 0; PARA i DESDE 1 HASTA 9 HACER s ← s + i; ESCRIBIR s». Identifica el tipo de error, demuéstralo con la traza y corrígelo.

  1. 01Tipo de error

    El programa compila y se ejecuta sin detenerse, pero da un resultado equivocado: es un error LÓGICO, en concreto un error «por uno» en el límite del bucle.

  2. 02Traza del rango

    El PARA va de i=1 a i=9, así que acumula 1+2+3+4+5+6+7+8+9 y nunca añade el 10.

  3. 03Suma obtenida

    La suma de 1 a 9 es 45, exactamente el resultado erróneo que se observa.

  4. 04Corrección

    El límite superior debe ser 10, no 9: «PARA i DESDE 1 HASTA 10 HACER s ← s + i». El cambio es de 9 a 10 (típico off-by-one).

  5. 05Verificación

    Con i de 1 a 10 la suma es la correcta, lo que confirma la corrección.

Resultado: Es un error lógico «por uno»: el bucle llegaba hasta 9 y sumaba 45; cambiando el límite a 10 el programa suma correctamente 55.

Explicación paso a paso7 pasos
  1. 1

    Este bucle pretende sumar los números del 1 al 5. Compila, se ejecuta sin quejarse y devuelve un número equivocado. Vamos a cazarlo con lo único que nunca falla: una tabla de variables.

    El fragmento bajo sospecha

    s←0;i←1;mientras (i<5) { s←s+i;  i←i+1 }\texttt{s} \leftarrow 0;\quad \texttt{i} \leftarrow 1;\quad \textbf{mientras } (\texttt{i} < 5)\ \{\ \texttt{s} \leftarrow \texttt{s} + \texttt{i};\ \ \texttt{i} \leftarrow \texttt{i} + 1\ \}s←0;i←1;mientras (i<5) { s←s+i;  i←i+1 }

    La variable s es el acumulador de la suma (un entero) e i es el contador de la iteración (otro entero). La condición del bucle usa el operador menor que, no menor o igual: ahí está el punto que hay que vigilar.

  2. 2

    Primero se anota el estado antes de entrar. La tabla tiene una columna por variable y una fila por vuelta; nada de ejecutarlo de cabeza.

    Estado inicial de la traza

    vueltai al entrars al salirinicio10\begin{array}{c|c|c} \text{vuelta} & \texttt{i} \text{ al entrar} & \texttt{s} \text{ al salir} \\ \hline \text{inicio} & 1 & 0 \end{array}vueltainicio​i al entrar1​s al salir0​​

    Antes de la primera comprobación, i vale 1 y s vale 0. Toda traza empieza escribiendo los valores de inicialización, porque un acumulador sin inicializar es la otra mitad de los fallos de esta sección.

  3. 3

    Vuelta a vuelta. Se comprueba la condición, se ejecuta el cuerpo y se anota el resultado; nunca se salta una fila aunque parezca obvia.

    Vueltas primera y segunda

    vueltai al entrars al salir111223\begin{array}{c|c|c} \text{vuelta} & \texttt{i} \text{ al entrar} & \texttt{s} \text{ al salir} \\ \hline 1 & 1 & 1 \\ 2 & 2 & 3 \end{array}vuelta12​i al entrar12​s al salir13​​

    Con i igual a 1 la condición 1 < 5 es cierta: s pasa de 0 a 1 e i pasa a 2. Con i igual a 2, s pasa de 1 a 3 e i pasa a 3. La columna de s guarda siempre el valor con el que el cuerpo termina.

  4. 4

    Dos vueltas más y el acumulador ya lleva la suma de los cuatro primeros números.

    Vueltas tercera y cuarta

    vueltai al entrars al salir3364410\begin{array}{c|c|c} \text{vuelta} & \texttt{i} \text{ al entrar} & \texttt{s} \text{ al salir} \\ \hline 3 & 3 & 6 \\ 4 & 4 & 10 \end{array}vuelta34​i al entrar34​s al salir610​​

    Con i igual a 3, s pasa de 3 a 6; con i igual a 4, s pasa de 6 a 10. Al salir de esta cuarta vuelta el contador i vale ya 5.

  5. 5

    Aquí está el instante decisivo. El contador vale 5, la condición se evalúa una vez más y el bucle se cierra antes de usar ese 5.

    La condición se vuelve falsa con i = 5

    i=5  ⟹  (5<5)=falso  ⟹  ESCRIBIR s=10\texttt{i} = 5 \;\Longrightarrow\; (5 < 5) = \text{falso} \;\Longrightarrow\; \text{ESCRIBIR } \texttt{s} = 10i=5⟹(5<5)=falso⟹ESCRIBIR s=10

    La expresión 5 < 5 es falsa, de modo que el cuerpo no se ejecuta con i igual a 5 y el programa imprime 10. El programa no se ha detenido ni ha protestado: simplemente ha dejado un número fuera.

  6. 6

    Contrastamos lo obtenido con lo pretendido. La diferencia es exactamente el último valor del rango, la firma inconfundible de un error por uno.

    El diagnóstico: falta un término, no una operación

    1+2+3+4=10≠1+2+3+4+5=151+2+3+4 = 10 \quad \neq \quad 1+2+3+4+5 = 151+2+3+4=10=1+2+3+4+5=15

    La suma calculada vale 10 y la buscada 15; la diferencia es 5, el término que el bucle nunca llegó a acumular. No hay ningún error de sintaxis ni de ejecución: es un error lógico en el límite de la iteración.

  7. 7

    La corrección es un solo carácter, y se verifica volviendo a la tabla: una fila más y el resultado cuadra.

    La corrección y su verificación

    mientras (i≤5)  ⟹  s=10+5=15\textbf{mientras } (\texttt{i} \le 5) \;\Longrightarrow\; \texttt{s} = 10 + 5 = 15mientras (i≤5)⟹s=10+5=15

    Al cambiar menor que por menor o igual se añade la vuelta con i igual a 5, que suma ese 5 pendiente y deja s en 15. La misma reparación se consigue escribiendo la condición como i < 6: lo que importa es que el último valor del rango entre en el bucle.

Objetivo Selectividad

  • Hacer la traza de escritorio de un fragmento, con la tabla de variables vuelta a vuelta, hasta localizar el valor erróneo y la instrucción que lo produce.
  • Clasificar un error concreto como de sintaxis, de ejecución o lógico, y proponer para cada tipo la corrección que le corresponde.
  • Detectar un error por uno en el límite de un bucle y razonar el cambio de menor que a menor o igual, o del valor inicial del contador, que lo repara.
  • Proponer el juego de casos de prueba de un algoritmo: el caso típico, los casos límite (cero, colección vacía, primer y último elemento) y una entrada inválida.

Errores frecuentes

  • Dar por bueno un programa porque compila: un código sin errores de sintaxis puede contener errores lógicos y devolver resultados equivocados sin avisar de nada.
  • Cambiar el código al azar hasta que parezca funcionar, en vez de reproducir el fallo, localizar la instrucción responsable y entender la causa antes de tocar nada.
  • No probar los casos límite (colección vacía, valor cero, primer y último elemento), que es justamente donde se esconde casi todo error por uno.
  • Confundir un error de ejecución con uno lógico: una división entre cero detiene el programa, mientras que un bucle que da una vuelta de menos termina con normalidad y solo se delata en el resultado.

§ 03

Repaso activo

Un alumno escribe «s ← 0; PARA i DESDE 0 HASTA 9 HACER s ← s + i; ESCRIBIR s» convencido de que suma los números del 1 al 10. Haz la traza de escritorio en una tabla, di qué valor imprime realmente el programa, clasifica el error e indica las dos correcciones distintas del encabezado del PARA que dan el resultado buscado.

Practicar con ejercicios afines8 preguntas de este tema→

Recuerdo activo

Recuerda los puntos clave — luego revela.

Fuentes: 8. Errores y excepciones (Python Software Foundation — Documentación de Python) · Ingeniería del Software II (2011) (Universidad de Cantabria — OpenCourseWare (OCW))

§ 04
§ 04

Internet de las cosas (IoT) aplicado a proyectos#

~7 min de lectura●●●ProfundizaciónCVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Saberes básicos, bloque E (Sistemas informáticos. Programación): «Tecnologías emergentes: internet de las cosas. Aplicación a proyectos.»CVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Saberes básicos, bloque E (Sistemas informáticos. Programación): «Protocolos de comunicación de redes de dispositivos.»CVBOE-A-2022-5521 · Anexo II · Tecnología e Ingeniería I (1.º de Bachillerato) · Criterio de evaluación 5.1: «Controlar el funcionamiento de sistemas tecnológicos y robóticos, utilizando lenguajes de programación informática y aplicando las posibilidades que ofrecen las tecnologías emergentes, tales como inteligencia artificial, internet de las cosas, big data...»

Lógica de control con histéresis (banda muerta del actuador)

Histéresis del riego: banda muerta entre 30 y 60Gráfica de ON (regando), ordenada en el origen y = 1, en el intervalo x de 0 a 60, Gráfica de OFF, en el intervalo x de 30 a 10020406080100−0.20.20.40.60.811.21.4UON = 30UOFF = 60ON (regando)OFFestado bombahumedad del suelo (%)

Puntos clave

El internet de las cosas (IoT, del inglés Internet of Things) es la interconexión a través de redes —típicamente internet— de objetos físicos cotidianos dotados de electrónica, sensores y conectividad, capaces de captar datos del entorno, procesarlos y actuar sobre él, a menudo sin intervención humana directa. Es la convergencia de la programación de este tema con la electrónica y los sistemas de control de la materia: un sistema IoT es, en esencia, un sistema de control realimentado al que se le añade conectividad y procesamiento de datos. Domótica, agricultura de precisión, vehículos conectados, salud y ciudades inteligentes son sus campos de aplicación.
La arquitectura de un sistema IoT se describe como una cadena de capas. La capa de percepción capta el mundo con sensores y actúa sobre él con actuadores. La capa de procesamiento local reside en un microcontrolador, que ejecuta el programa, lee los sensores y gobierna los actuadores. La capa de conectividad transmite los datos por una red (Wi-Fi, Bluetooth, Zigbee, LoRa, redes móviles). La capa de aplicación, normalmente en la nube, almacena, analiza y visualiza los datos y permite el control remoto. La Fig. 6 muestra esta cadena sensor → microcontrolador → conectividad → nube → actuador.

Cadena IoT: del mundo físico a la nube y de vuelta

Arquitectura IoTGrafo, Sensor (mide) → Microcontrolador, Microcontrolador → Conectividad (Wi-Fi/LoRa), Conectividad (Wi-Fi/LoRa) → Nube, Microcontrolador → Actuador (actúa), Actuador (actúa) → Sensor (mide)Sensor (mide)MicrocontroladorConectividad(Wi-Fi/LoRa)NubeActuador(actúa)entorno (lazocerrado)
Fig. 6 ↓
Un sensor es un transductor que convierte una magnitud física (temperatura, luz, humedad, distancia, presión, movimiento) en una señal eléctrica que el microcontrolador puede leer; un actuador hace lo contrario: convierte una señal eléctrica en una acción física (un motor que gira, un relé que cierra un circuito, un LED que se enciende, un servo que posiciona). El microcontrolador —un pequeño ordenador en un chip con procesador, memoria y pines de entrada/salida, como los de las placas Arduino o ESP32— es el cerebro: lee las entradas (digitales y analógicas, estas vía un conversor analógico-digital), ejecuta la lógica programada y escribe en las salidas. Las señales digitales toman dos estados (0/1, HIGH/LOW); las analógicas, un rango continuo de valores.
Programar un microcontrolador combina todo lo anterior: el programa típico tiene una parte de configuración inicial (declarar qué pines son entradas y cuáles salidas) y un bucle principal que se repite indefinidamente leyendo sensores, decidiendo con estructuras de selección y accionando actuadores. La lógica de control suele responder al patrón «si la lectura del sensor cruza un umbral, activa el actuador»; para evitar que el actuador conmute sin parar cuando la medida oscila alrededor del umbral se usa la histéresis (dos umbrales, uno de activación y otro de desactivación, separados por una banda muerta). Es el mismo lazo cerrado de los sistemas de control: el sensor realimenta el estado, el programa compara con la consigna y el actuador corrige.
Aplicar el IoT a un proyecto tecnológico exige diseñar la cadena completa: elegir los sensores y actuadores adecuados al problema, seleccionar el microcontrolador y la tecnología de conectividad según el alcance, el consumo y el volumen de datos, escribir y depurar el programa de control, y prever la seguridad (los dispositivos IoT son objetivo de ataques) y el consumo energético (muchos funcionan con batería). La verificación se hace montando el circuito real o simulándolo en herramientas como Tinkercad o Wokwi antes de desplegarlo. Conviene recordar la dimensión ética: la captación masiva de datos plantea cuestiones de privacidad y de protección de datos.

Vocabulario

→ Tarjetas
  • Internet de las cosas (IoT)Interconexión en red de objetos físicos dotados de electrónica, sensores y conectividad, capaces de captar datos del entorno, procesarlos y actuar sobre él.
  • SensorTransductor que convierte una magnitud física (temperatura, luz, humedad, distancia, presión) en una señal eléctrica que el microcontrolador puede leer.
  • ActuadorElemento que convierte una señal eléctrica en una acción física: un motor que gira, un relé que cierra un circuito, una electroválvula o un LED que se enciende.
  • MicrocontroladorCircuito integrado que reúne en un solo chip procesador, memoria y pines de entrada y salida, y ejecuta cíclicamente el programa que enlaza sensores con actuadores.
  • Conversor analógico-digital (ADC)Circuito que traduce una señal analógica continua a un número discreto que el programa puede tratar; sin él una sonda de temperatura no se puede leer.
  • Histéresis (banda muerta)Uso de dos umbrales distintos, uno de activación y otro de desactivación, para que el actuador no conmute sin parar cuando la medida ronda un único valor.
  • Señal digitalSeñal que solo toma dos estados, 0 y 1 o LOW y HIGH, frente a la analógica, que recorre de forma continua todo un rango de valores.

Control con histéresis

si h<UON⇒bomba ON;si h>UOFF⇒bomba OFF\text{si } h < U_{\text{ON}} \Rightarrow \text{bomba ON};\quad \text{si } h > U_{\text{OFF}} \Rightarrow \text{bomba OFF}si h<UON​⇒bomba ON;si h>UOFF​⇒bomba OFF

Con dos umbrales U_ON < U_OFF (aquí 30 y 60) y una banda muerta entre ellos, el actuador no conmuta cuando la lectura h oscila cerca de un único valor.

La reproducción carga contenido de YouTube (Google).Abrir en YouTube ↗
La reproducción carga contenido de YouTube (Google).Abrir en YouTube ↗
Ejemplo resuelto

Lógica de un termostato IoT con histéresis

Un sistema IoT de climatización lee la temperatura T de una sala. La consigna es 21 °C. Para evitar arranques continuos del calefactor se usa histéresis: enciende si T baja de 20 °C y apaga si T sube de 22 °C. Escribe la lógica del bucle de control e indica el estado del calefactor si T pasa por 19, 21 y 23 °C estando inicialmente apagado.

  1. 01Identificar componentes

    Sensor: sonda de temperatura (entrada analógica → ADC). Actuador: calefactor mediante relé (salida digital). Microcontrolador: ejecuta el bucle.

  2. 02Definir umbrales

    Umbral de encendido U_ON = 20 °C y de apagado U_OFF = 22 °C; entre ambos hay una banda muerta de 2 °C alrededor de la consigna de 21 °C.

  3. 03Lógica del bucle

    REPETIR: leer T; SI (T < 20) ENTONCES calefactor ← ON; SI (T > 22) ENTONCES calefactor ← OFF; (entre 20 y 22 se mantiene el estado anterior).

  4. 04T = 19 °C

    19 < 20, se cumple la condición de encendido: el calefactor pasa a ON.

  5. 05T = 21 °C

    21 no es < 20 ni > 22: cae en la banda muerta, así que el calefactor MANTIENE el estado anterior (sigue ON).

  6. 06T = 23 °C

    23 > 22, se cumple la condición de apagado: el calefactor pasa a OFF.

Resultado: Estados sucesivos: 19 °C → ON, 21 °C → sigue ON (banda muerta), 23 °C → OFF. La histéresis de 2 °C evita que el calefactor conmute sin parar cuando la temperatura ronda los 21 °C.

Objetivo Selectividad

  • Describir la arquitectura de un sistema IoT por capas y situar en la cadena el sensor, el microcontrolador, la conectividad, la nube y el actuador.
  • Clasificar componentes concretos como sensor o actuador y sus señales como digitales o analógicas, justificando en cada caso la decisión.
  • Diseñar la lógica de control de un sistema IoT sencillo con umbral, condición y actuación, incorporando histéresis para evitar conmutaciones espurias.
  • Elegir la tecnología de conectividad adecuada a un caso dado (Wi-Fi, Bluetooth, Zigbee, LoRa o red móvil) justificándola por alcance, consumo y volumen de datos.

Errores frecuentes

  • Confundir sensor con actuador: el sensor mide y es siempre una entrada, el actuador ejecuta una acción física y es siempre una salida; un mismo dispositivo no hace las dos cosas.
  • Tratar toda señal como digital y olvidar que una magnitud analógica, como la temperatura o la luz, necesita un conversor analógico-digital para que el programa pueda leerla.
  • Diseñar la lógica con un único umbral: cuando la medida oscila justo en ese valor el actuador conmuta sin parar, y solo dos umbrales con banda muerta lo evitan.
  • Colocar la nube dentro del lazo rápido de control: la decisión de umbral la toma el microcontrolador en local y debe seguir funcionando sin red, mientras la nube almacena, analiza y permite el mando remoto.

§ 04

Repaso activo

Un invernadero vigila el dióxido de carbono del aire con un sensor que entrega valores de 0 a 2000 ppm y abre una ventana motorizada cuando el aire se vicia. Escribe en pseudocódigo la lógica de control con histéresis, elige y justifica los dos umbrales, explica qué le ocurriría al motor de la ventana con un solo umbral y señala qué parte de la cadena IoT debe seguir operando si se pierde la conexión con la nube.

Practicar con ejercicios afines8 preguntas de este tema→

Recuerdo activo

Recuerda los puntos clave — luego revela.

Fuentes: TemáTICas IoT (INCIBE — Instituto Nacional de Ciberseguridad)

Revisado · 07/2026 · Versión completa con el regulador de profundidad — mismo lugar, mismas anclas

Contenido

Sección -- / 04

    • 01Fundamentos de la programación: variables, control y funciones◐
    • 02Diseño de algoritmos: diagramas de flujo y pseudocódigo◐
    • 03Depuración y verificación de programas◐
    • 04Internet de las cosas (IoT) aplicado a proyectos●

0/4 Leídos

De los apuntes a la práctica

Programación e internet de las cosas

Refuerza este tema con preguntas de la base de preguntas.

~25
min
2
Competencias
8
preguntas
Practicar
Planificar un repaso

Referencias y fuentes

Fuentes

Gobierno de España — Boletín Oficial del Estado (BOE)

  • Real Decreto 243/2022, de 5 de abril, por el que se establecen la ordenación y las enseñanzas mínimas del Bachillerato

Python Software Foundation — Documentación de Python

  • 4. Más herramientas para control de flujo
  • 8. Errores y excepciones

Universitat Politècnica de València — RiuNet

  • Estructuras de control: iteración

Universidad de Cantabria — OpenCourseWare (OCW)

  • Algorítmica y Complejidad (2024)
  • Ingeniería del Software II (2011)

Universidad Carlos III de Madrid — OpenCourseWare (OCW)

  • Estructura de Datos y Algoritmos (Python)

INCIBE — Instituto Nacional de Ciberseguridad

  • TemáTICas IoT

Véase también

  • Electrónica digitalLos operadores lógicos de una condición son el álgebra de Boole que allí se estudia con puertas y tablas de verdad; entender una puerta AND es entender un Y de un SI.
  • Sistemas automáticos de controlEl lazo cerrado con consigna y realimentación es exactamente lo que programa la lógica de umbral e histéresis de un sistema IoT.
  • Automatización y robóticaEl microcontrolador de un montaje IoT hace en pequeño lo que el autómata programable hace en una planta: repetir un bucle que lee entradas y gobierna salidas.

Tema anterior

Sistemas automáticos de control

Tema siguiente

Automatización y robótica

EuraStudy·Apuntes T·08·MMXXVI

Continúa con el tema siguiente: el itinerario se conserva.