Ejercicios Arduino PYC 2BACH NIVEL2 IOT (ChatGPT)
PRYC.2.D.1.2 – Arduino C++
Condicionales complejos y bucles for / while
Material común recomendado
Para no perder tiempo en montajes:
- Arduino UNO
- Protoboard
- LEDs
- Resistencias de 220 Ω
- Pulsador
- Potenciómetro
- Zumbador pasivo o activo
- LDR si tenéis
- Cables
EJERCICIO 1. LED de emergencia con condición doble
Objetivo
Encender un LED rojo solo si se cumplen dos condiciones:
- El botón está pulsado.
- El valor del potenciómetro es mayor de 700.
Montaje
- LED rojo en pin 8.
- Botón en pin 2.
- Potenciómetro en A0.
Código
int ledRojo = 8;
int boton = 2;
int potenciometro = A0;
void setup() {
pinMode(ledRojo, OUTPUT);
pinMode(boton, INPUT);
Serial.begin(9600);
}
void loop() {
int estadoBoton = digitalRead(boton);
int valorPot = analogRead(potenciometro);
Serial.print("Potenciometro: ");
Serial.println(valorPot);
if (estadoBoton == HIGH && valorPot > 700) {
digitalWrite(ledRojo, HIGH);
Serial.println("EMERGENCIA ACTIVADA");
} else {
digitalWrite(ledRojo, LOW);
}
delay(200);
}
Qué aprenden
- Condición compuesta con
&&. - Lectura digital y analógica.
- Uso de umbrales.
EJERCICIO 2. Semáforo nocturno inteligente
Objetivo
Simular un semáforo que funciona de forma distinta según haya luz o no.
- Si hay luz, el semáforo funciona normal.
- Si hay oscuridad, solo parpadea el amarillo.
Montaje
- LED rojo en pin 8.
- LED amarillo en pin 9.
- LED verde en pin 10.
- LDR o potenciómetro en A0.
Código
int rojo = 8;
int amarillo = 9;
int verde = 10;
int sensorLuz = A0;
void setup() {
pinMode(rojo, OUTPUT);
pinMode(amarillo, OUTPUT);
pinMode(verde, OUTPUT);
Serial.begin(9600);
}
void loop() {
int luz = analogRead(sensorLuz);
Serial.print("Nivel de luz: ");
Serial.println(luz);
if (luz < 400) {
digitalWrite(rojo, LOW);
digitalWrite(verde, LOW);
digitalWrite(amarillo, HIGH);
delay(500);
digitalWrite(amarillo, LOW);
delay(500);
} else {
digitalWrite(verde, HIGH);
delay(2000);
digitalWrite(verde, LOW);
digitalWrite(amarillo, HIGH);
delay(1000);
digitalWrite(amarillo, LOW);
digitalWrite(rojo, HIGH);
delay(2000);
digitalWrite(rojo, LOW);
}
}
Qué aprenden
if / else.- Comportamientos diferentes según sensor.
- Simulación de sistema automático.
EJERCICIO 3. Clasificador de temperatura simulado
Objetivo
Usar un potenciómetro como si fuera un sensor de temperatura y clasificar el estado:
- Menos de 300 → frío.
- Entre 300 y 700 → temperatura normal.
- Más de 700 → calor peligroso.
Montaje
- Potenciómetro en A0.
- LED azul en pin 8.
- LED verde en pin 9.
- LED rojo en pin 10.
Código
int sensor = A0;
int ledAzul = 8;
int ledVerde = 9;
int ledRojo = 10;
void setup() {
pinMode(ledAzul, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
Serial.begin(9600);
}
void loop() {
int valor = analogRead(sensor);
digitalWrite(ledAzul, LOW);
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
Serial.print("Valor del sensor: ");
Serial.println(valor);
if (valor < 300) {
digitalWrite(ledAzul, HIGH);
Serial.println("FRIO");
} else if (valor <= 700) {
digitalWrite(ledVerde, HIGH);
Serial.println("TEMPERATURA NORMAL");
} else {
digitalWrite(ledRojo, HIGH);
Serial.println("CALOR PELIGROSO");
}
delay(300);
}
Qué aprenden
if / else if / else.- Rangos de valores.
- Apagar salidas antes de activar una.
EJERCICIO 4. Alarma con memoria
Objetivo
La alarma debe activarse al pulsar un botón y quedarse encendida aunque se suelte. Solo se reinicia si se pulsa otro botón.
Montaje
- LED rojo en pin 8.
- Botón de alarma en pin 2.
- Botón de reinicio en pin 3.
Código
int ledAlarma = 8;
int botonAlarma = 2;
int botonReset = 3;
bool alarmaActivada = false;
void setup() {
pinMode(ledAlarma, OUTPUT);
pinMode(botonAlarma, INPUT);
pinMode(botonReset, INPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(botonAlarma) == HIGH) {
alarmaActivada = true;
Serial.println("Alarma activada");
delay(300);
}
if (digitalRead(botonReset) == HIGH) {
alarmaActivada = false;
Serial.println("Alarma reiniciada");
delay(300);
}
if (alarmaActivada == true) {
digitalWrite(ledAlarma, HIGH);
} else {
digitalWrite(ledAlarma, LOW);
}
}
Qué aprenden
- Variables booleanas.
- Concepto de estado.
- Diferencia entre leer un botón y guardar una situación.
EJERCICIO 5. Control de acceso con tres intentos
Objetivo
Simular un sistema de contraseña con una variable. Si la contraseña es correcta, se enciende un LED verde. Si falla tres veces, se enciende un LED rojo.
Montaje
- LED verde en pin 8.
- LED rojo en pin 9.
Código
int ledVerde = 8;
int ledRojo = 9;
int contrasenaCorrecta = 1234;
int intento = 1111;
int fallos = 0;
void setup() {
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
Serial.begin(9600);
while (fallos < 3) {
Serial.print("Probando contraseña: ");
Serial.println(intento);
if (intento == contrasenaCorrecta) {
digitalWrite(ledVerde, HIGH);
Serial.println("ACCESO PERMITIDO");
break;
} else {
fallos++;
Serial.print("Contraseña incorrecta. Fallos: ");
Serial.println(fallos);
}
intento = intento + 123;
delay(1000);
}
if (fallos >= 3) {
digitalWrite(ledRojo, HIGH);
Serial.println("ACCESO BLOQUEADO");
}
}
void loop() {
}
Qué aprenden
while.- Contador de intentos.
break.- Lógica de bloqueo.
EJERCICIO 6. Barra de progreso con LEDs usando for
Objetivo
Encender 5 LEDs uno a uno como si fuera una barra de carga.
Montaje
- LEDs en pines 6, 7, 8, 9 y 10.
Código
int primerLed = 6;
int ultimoLed = 10;
void setup() {
for (int pin = primerLed; pin <= ultimoLed; pin++) {
pinMode(pin, OUTPUT);
}
Serial.begin(9600);
}
void loop() {
Serial.println("Cargando...");
for (int pin = primerLed; pin <= ultimoLed; pin++) {
digitalWrite(pin, HIGH);
delay(500);
}
Serial.println("Carga completa");
delay(1000);
for (int pin = primerLed; pin <= ultimoLed; pin++) {
digitalWrite(pin, LOW);
}
delay(1000);
}
Qué aprenden
forpara recorrer pines.- Automatizar instrucciones repetidas.
- Organización de pines consecutivos.
EJERCICIO 7. LED con brillo creciente y decreciente
Objetivo
Hacer que un LED aumente y disminuya su brillo progresivamente usando bucles for.
Montaje
- LED en pin 9.
Código
int led = 9;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
for (int brillo = 0; brillo <= 255; brillo = brillo + 5) {
analogWrite(led, brillo);
delay(30);
}
for (int brillo = 255; brillo >= 0; brillo = brillo - 5) {
analogWrite(led, brillo);
delay(30);
}
}
Qué aprenden
- PWM con
analogWrite. - Bucle ascendente.
- Bucle descendente.
- Incrementos distintos de 1.
EJERCICIO 8. Sistema de aviso por niveles
Objetivo
Leer un potenciómetro y generar un aviso según el nivel:
- 0 a 300 → bajo.
- 301 a 700 → medio.
- Más de 700 → alto.
Además, si el nivel es alto durante 5 lecturas seguidas, se activa una alarma.
Montaje
- Potenciómetro en A0.
- LED rojo en pin 8.
Código
int sensor = A0;
int ledAlarma = 8;
int contadorAlto = 0;
void setup() {
pinMode(ledAlarma, OUTPUT);
Serial.begin(9600);
}
void loop() {
int valor = analogRead(sensor);
Serial.print("Valor: ");
Serial.println(valor);
if (valor <= 300) {
Serial.println("Nivel bajo");
contadorAlto = 0;
} else if (valor <= 700) {
Serial.println("Nivel medio");
contadorAlto = 0;
} else {
Serial.println("Nivel alto");
contadorAlto++;
}
if (contadorAlto >= 5) {
digitalWrite(ledAlarma, HIGH);
Serial.println("ALARMA: nivel alto mantenido");
} else {
digitalWrite(ledAlarma, LOW);
}
delay(500);
}
Qué aprenden
- Condiciones por rangos.
- Contador acumulativo.
- Detección de una situación mantenida en el tiempo.
EJERCICIO 9. Cuenta atrás con cancelación
Objetivo
Hacer una cuenta atrás desde 10. Si se pulsa un botón durante la cuenta, se cancela y se enciende un LED verde. Si llega a 0 sin pulsar, se enciende un LED rojo.
Montaje
- Botón en pin 2.
- LED verde en pin 8.
- LED rojo en pin 9.
Código
int boton = 2;
int ledVerde = 8;
int ledRojo = 9;
bool cancelado = false;
void setup() {
pinMode(boton, INPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
Serial.begin(9600);
for (int cuenta = 10; cuenta >= 0; cuenta--) {
Serial.print("Cuenta atrás: ");
Serial.println(cuenta);
if (digitalRead(boton) == HIGH) {
cancelado = true;
Serial.println("Cuenta cancelada");
break;
}
delay(1000);
}
if (cancelado == true) {
digitalWrite(ledVerde, HIGH);
} else {
digitalWrite(ledRojo, HIGH);
Serial.println("Tiempo agotado");
}
}
void loop() {
}
Qué aprenden
fordescendente.break.- Variable booleana de control.
- Decisión posterior al bucle.
EJERCICIO 10. Mini sistema domótico completo
Objetivo
Simular un sistema domótico básico:
- Si hay poca luz, se enciende una luz.
- Si además se pulsa el botón, se activa una alarma.
- Si el sensor supera 900, se hace una secuencia de emergencia con parpadeos.
Montaje
- Potenciómetro o LDR en A0.
- Botón en pin 2.
- LED blanco o amarillo en pin 8.
- LED rojo en pin 9.
- Zumbador en pin 10.
Código
int sensorLuz = A0;
int boton = 2;
int luzCasa = 8;
int ledAlarma = 9;
int zumbador = 10;
void setup() {
pinMode(boton, INPUT);
pinMode(luzCasa, OUTPUT);
pinMode(ledAlarma, OUTPUT);
pinMode(zumbador, OUTPUT);
Serial.begin(9600);
}
void loop() {
int luz = analogRead(sensorLuz);
int estadoBoton = digitalRead(boton);
Serial.print("Nivel de luz: ");
Serial.println(luz);
if (luz < 400) {
digitalWrite(luzCasa, HIGH);
Serial.println("Luz de casa encendida");
} else {
digitalWrite(luzCasa, LOW);
}
if (luz < 400 && estadoBoton == HIGH) {
Serial.println("ALARMA NOCTURNA ACTIVADA");
digitalWrite(ledAlarma, HIGH);
digitalWrite(zumbador, HIGH);
delay(300);
digitalWrite(ledAlarma, LOW);
digitalWrite(zumbador, LOW);
delay(300);
}
if (luz > 900) {
Serial.println("EMERGENCIA: sensor saturado");
for (int i = 0; i < 5; i++) {
digitalWrite(ledAlarma, HIGH);
digitalWrite(zumbador, HIGH);
delay(150);
digitalWrite(ledAlarma, LOW);
digitalWrite(zumbador, LOW);
delay(150);
}
}
delay(200);
}
Qué aprenden
- Sistema con varias entradas y salidas.
- Condiciones independientes.
- Condiciones compuestas.
- Bucle
fordentro de una condición. - Lógica parecida a un proyecto real.
Resumen de estructuras trabajadas
| Ejercicio | Contenido principal |
|---|---|
| 1 | if con && |
| 2 | if / else con sensor |
| 3 | if / else if / else |
| 4 | variable bool y estado |
| 5 | while, intentos y break |
| 6 | for para recorrer LEDs |
| 7 | dos bucles for y PWM |
| 8 | contador + condición mantenida |
| 9 | for descendente + cancelación |
| 10 | sistema completo con sensores, actuadores y bucles |
Reto final para quien termine antes
Modificar el ejercicio 10 para que:
- La alarma solo funcione si es de noche.
- El zumbador suene 10 veces si el valor del sensor supera 950.
- El LED de casa no se encienda de golpe, sino aumentando el brillo poco a poco con
analogWrite.


