🧠 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: