🧠 P10 - Proyecto final: Sistema embebido multitarea completo

ℹ️ Empieza aquí:

En este proyecto final desarrollarás un sistema embebido completo, integrando todos los conceptos del curso.

El sistema será capaz de:

• Monitorizar la luz ambiente
• Mostrar estados mediante múltiples LEDs
• Generar señales acústicas
• Mostrar información mediante LED RGB
• Controlarse mediante comandos serie
• Ejecutar múltiples tareas simultáneamente

Este tipo de arquitectura es representativa de equipos médicos reales, instrumentación y sistemas industriales.


🚀 Objetivos

• Integrar todos los componentes del curso en un único sistema.
• Implementar arquitectura multitarea no bloqueante.
• Utilizar máquina de estados.
• Implementar interfaz de comandos serie.
• Controlar múltiples salidas mediante 74HC595.
• Controlar LED RGB mediante PWM.
• Desarrollar código estructurado profesional.


🧩 Contenidos trabajados

• Arquitectura multitarea con millis()
• Máquinas de estados
• Comunicación serie avanzada
• PWM
• Expansión de salidas
• Arquitectura modular


💻 Materiales y recursos

• Arduino UNO
• Protoboard
• 1 LDR
• 1 LED RGB
• 1 buzzer
• 1 registro 74HC595
• 8 LEDs
• Resistencias
• Cables
• Arduino IDE


🔧 Montaje práctico

Utilizar montajes de prácticas anteriores:

LDR

A0

RGB

9, 10, 11

Buzzer

Pin 8

74HC595

Data → 2
Latch → 3
Clock → 4


🧭 Arquitectura del sistema

El sistema tendrá 4 módulos:

• Sensor
• Interfaz serie
• Indicadores
• Alarmas


📄 Código completo

int pinLDR = A0;

int pinBuzzer = 8;

int pinRGB[3] = {9,10,11};

int dataPin = 2;  
int latchPin = 3;  
int clockPin = 4;

int umbral = 500;

unsigned long tSensor = 0;  
unsigned long tLED = 0;  
unsigned long tRGB = 0;

int valorLuz = 0;

byte patron = 0;

int brillo = 0;  
int dir = 1;  
int color = 0;

void setup(){

Serial.begin(9600);

pinMode(pinBuzzer,OUTPUT);

for(int i=0;i<3;i++)  
pinMode(pinRGB[i],OUTPUT);

pinMode(dataPin,OUTPUT);  
pinMode(latchPin,OUTPUT);  
pinMode(clockPin,OUTPUT);

}

void loop(){

leerSensor();

actualizarLEDs();

actualizarRGB();

actualizarSerie();

}

void leerSensor(){

if(millis()-tSensor>500){

tSensor=millis();

valorLuz=analogRead(pinLDR);

Serial.println(valorLuz);

}

}

void actualizarLEDs(){

if(millis()-tLED>200){

tLED=millis();

digitalWrite(latchPin,LOW);

shiftOut(dataPin,clockPin,MSBFIRST,patron);

digitalWrite(latchPin,HIGH);

patron++;

}

}

void actualizarRGB(){

if(millis()-tRGB>20){

tRGB=millis();

brillo+=dir;

if(brillo>=255){dir=-1;}

if(brillo<=0){

dir=1;

color++;

if(color>2)color=0;

}

analogWrite(pinRGB[0],0);  
analogWrite(pinRGB[1],0);  
analogWrite(pinRGB[2],0);

analogWrite(pinRGB[color],brillo);

}

}

void actualizarSerie(){

if(Serial.available()){

int nuevo=Serial.parseInt();

if(nuevo>0){

umbral=nuevo;

}

}

if(valorLuz<umbral){

digitalWrite(pinBuzzer,HIGH);

}

else{

digitalWrite(pinBuzzer,LOW);

}

}

✅ Funcionamiento esperado

El sistema ejecuta simultáneamente:

• Lectura sensor
• Animación LEDs
• Animación RGB
• Comunicación serie
• Alarma


📦 Entrega

• Código completo

• Vídeo

• Explicación arquitectura


📊 Rúbrica

Criterio Excelente Adecuado Insuficiente
Arquitectura Profesional Parcial Incorrecta
Multitarea Correcta Parcial Incorrecta
Integración Completa Parcial Incorrecta
Código Profesional Mejorable Incorrecto
Funcionamiento Correcto Parcial Incorrecto

🎓 Resultado final del curso

Has aprendido:

• Programación profesional Arduino
• Arquitectura sistemas embebidos
• Interfaces
• Sensores
• Actuadores
• Multitarea


🚀 Nivel alcanzado

Nivel equivalente a:

Programador junior sistemas embebidos


🎯 Ampliación opcional

Añadir almacenamiento EEPROM

Añadir menú interactivo completo

Añadir protocolo comunicación estructurado

Updated: