Ventilador Pulmonar COVID-19 de Código Abierto – Sistema DIY de Soporte Respiratorio Basado en Arduino
Componentes y suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO | 1 | Para versión con Arduino |
| Shield de 4 Relés para Arduino | 1 | Para versión con Arduino |
| Servo Digital MG995 | 1 | Para todas las versiones |
| Módulo LM2596S | 2 | Para todas las versiones |
| Potenciómetro multivuelta lineal 10k | 1 | Para todas las versiones |
| Fuente de alimentación PCIe 12V 5A 60W Digilent | 1 | Para todas las versiones |
| LED 5 mm Rojo | 1 | Para todas las versiones |
| LED 5 mm Verde | 1 | Para todas las versiones |
| LCD Alfanumérico 20x4 | 1 | Para todas las versiones |
| Interruptor 220V | 1 | Para todas las versiones |
| Máscara de snorkel facial completa | 1 | |
| Válvula Solenoide 2 Vías | 1 |
Herramientas y máquinas necesarias
- Impresora 3D (genérica) - Modelo A8
- Caja de luz, exposición UV 300-001
Aplicaciones y servicios en línea
- Arduino IDE
- PcB Elegance
- Autodesk Fusion 360
Sobre el proyecto
Ventilador no invasivo de código abierto. Es de bajo costo y fácil de construir, un respirador de emergencia para combatir la crisis sanitaria del COVID-19 cuando no hay ventiladores disponibles y mientras el paciente no esté sedado ni intubado.
Este proyecto surgió de un reto lanzado por mi ex profesor y amigo Serafim Pires, quien me contactó mostrando un proyecto español, sugiriendo que sería bueno desarrollar un proyecto para ayudar a combatir esta crisis mundial.
Tras varias investigaciones y estudios sobre ventilación no invasiva, construí este prototipo funcional basado en 2 tecnologías existentes.
Todas las pruebas fueron exitosas, con una prueba funcional de más de 20 días sin ningún problema o interrupción.
La ventilación no invasiva se administra mediante mascarillas faciales o nasales, que impulsan una cantidad determinada de aire presurizado hacia los pulmones. Esto apoya el proceso respiratorio natural cuando una enfermedad ha causado el fallo pulmonar, permitiendo al cuerpo combatir la infección y recuperarse.
Basado en investigaciones realizadas en Italia, utilicé esta tecnología en mi proyecto que convierte una máscara de snorkel Decathlon en un ventilador de emergencia para pacientes con COVID-19, ayudando a mitigar la falta de ventiladores durante el pico de la pandemia.
Estas máscaras se han adaptado y utilizado en todo el mundo debido a su bajo coste y fácil adaptación.
Los resultados fueron evidentes y, recientemente, esta tecnología también se utilizó en Portugal en el Hospital de Santarém.

Noticia en periódico de Portugal

Entrevista en una radio local que se volvió viral en redes sociales en Portugal.
Primera prueba de operación usando un pequeño volumen de aire y 15 ciclos respiratorios cambiando la frecuencia y el PEEP para demostración.
ADVERTENCIA: Este prototipo no ha sido validado por ningún organismo oficial y declino toda responsabilidad por su uso. Además, se utilizará como último recurso y por personal médico entrenado, este equipo está destinado a salvar vidas en una situación de pico extremo. El proyecto sin ánimo de lucro puede replicarse masivamente, si es aprobado por las autoridades competentes en Portugal.
Código
INOVT_COVID19_Version_2.2.ino (Arduino)
/* Programa ventilador pulmonar INOVT COVID-19 Versión 2.2
* Autor: David Pascoal
* El equipo ha sido probado y comprobado, seguridad con sensor de presión,
* Salida de alarma para activar zumbador.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#define PIN_SERVO 6
#define PIN_FREQ A1
#define PIN_PEEP A0
#define PIN_LED 2
#define PIN_LED2 3
#define PIN_Alarm_Relay 8
#define PIN_Safety_Valve 9
#define SENSOR_FLOW A3
#define EXPIRANDO 0
#define INSPIRANDO 1
#define MIN_ANGLE 92
#define MAX_ANGLE 139
int frecuencia = 0;
int valInspira = 0;
int valExpira = 0;
int valPeep = 0;
int aux;
int x = 500;
int y = 1000;
unsigned long time;
Servo myServo;
int frecuencia_ant;
int valPeep_ant;
int estado;
// Funciones de interfaz gráfica en LCD (logo, inicio, animaciones)
void logo() { ... }
void initior() { ... }
void maobc() { ... }
void thumbdownA() { ... }
void thumbsup() { ... }
void setServo() {
if (millis() > time) {
if (estado == EXPIRANDO) {
digitalWrite(PIN_LED2, LOW);
digitalWrite(PIN_LED, HIGH);
myServo.write(MIN_ANGLE);
time = millis() + (valInspira * 100);
estado = INSPIRANDO;
lcd.setCursor(8, 2);
lcd.print("EXPIRANDO > ");
} else if (estado == INSPIRANDO) {
digitalWrite(PIN_LED2, HIGH);
digitalWrite(PIN_LED, LOW);
myServo.write(MAX_ANGLE - valPeep);
time = millis() + (valExpira * 100);
estado = EXPIRANDO;
lcd.setCursor(8, 2);
lcd.print("INSPIRANDO < ");
}
}
}
void setup() {
myServo.attach(PIN_SERVO);
myServo.write(92);
pinMode(PIN_FREQ, INPUT_PULLUP);
pinMode(PIN_PEEP, INPUT_PULLUP);
pinMode(SENSOR_FLOW, INPUT);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(PIN_Alarm_Relay, OUTPUT);
pinMode(PIN_Safety_Valve, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
logo();
lcd.setCursor(4,2);
lcd.print("OPEN-SOURCE");
lcd.setCursor(0,3);
lcd.print("Pulmonary Ventilator");
delay(4000);
lcd.clear();
lcd.print("....Initializing....");
initior();
delay(500);
lcd.clear();
maobc();
lcd.clear();
if (digitalRead(SENSOR_FLOW) == LOW) {
thumbsup();
lcd.setCursor(0,0);
lcd.print("SYSTEM");
lcd.setCursor(2,1);
lcd.print("OK");
delay(5000);
lcd.clear();
} else {
myServo.write(139);
thumbdownA();
lcd.setCursor(0,0);
lcd.print("SYSTEM");
lcd.setCursor(1,1);
lcd.print("FAIL");
delay(5000);
lcd.clear();
Serial.begin(9600);
time = millis();
frecuencia_ant = -1;
valPeep_ant = -1;
}
delay(500);
estado = EXPIRANDO;
}
void loop() {
digitalRead(SENSOR_FLOW);
aux = analogRead(PIN_FREQ);
frecuencia = map(aux, 0, 1023, 10, 60);
valInspira = ((1.0 / frecuencia) * 600.0) * (1.0/3.0);
valExpira = ((1.0 / frecuencia) * 600.0) * (2.0/3.0);
aux = analogRead(PIN_PEEP);
valPeep = map(aux, 0, 1023, 0, 10);
if ((frecuencia_ant != frecuencia) || (valPeep_ant != valPeep)) {
Serial.print("Frecuencia: "); Serial.println(frecuencia);
Serial.print("Inspira: "); Serial.println(valInspira);
Serial.print("Expira: "); Serial.println(valExpira);
Serial.print("Peep: "); Serial.println(valPeep);
lcd.setCursor(1, 0); lcd.print("FRECUENCIA: ");
lcd.setCursor(13, 0); lcd.print(frecuencia);
lcd.setCursor(1, 1); lcd.print("PEEP: ");
lcd.setCursor(13, 1); lcd.print(valPeep);
lcd.setCursor(0, 2); lcd.print("ESTADO: ");
lcd.setCursor(0, 3); lcd.print("VENTILADOR D.PASCOAL ");
frecuencia_ant = frecuencia;
valPeep_ant = valPeep;
}
if (digitalRead(SENSOR_FLOW) == HIGH) {
myServo.write(139);
digitalWrite(PIN_Alarm_Relay, HIGH);
digitalWrite(PIN_Safety_Valve, HIGH);
lcd.clear();
thumbdownA();
lcd.setCursor(0,0); lcd.print("SYSTEM");
lcd.setCursor(1,1); lcd.print("FAIL");
lcd.setCursor(1,2); lcd.print("******************");
lcd.setCursor(3,3); lcd.print("Check AR flow");
lcd.setCursor(12,1); lcd.print("ALARM");
digitalWrite(PIN_LED, HIGH);
digitalWrite(PIN_LED2, HIGH);
delay(500);
lcd.setCursor(12,1); lcd.print(" ");
delay(500);
lcd.setCursor(12,1); lcd.print("ALARM");
digitalWrite(PIN_LED, LOW);
digitalWrite(PIN_LED2, LOW);
delay(1000);
lcd.clear();
} else {
digitalWrite(PIN_Alarm_Relay, LOW);
digitalWrite(PIN_Safety_Valve, LOW);
setServo();
delay(10);
}
}
El archivo INOVT_COVID19_Version_2.2.rar solo está disponible para descarga.
Piezas personalizadas y cajas
Deben imprimirse en una impresora 3D. Requieren cierta precisión.
Instrucciones paso a paso completas para modificar la máscara de buceo y convertirla en una mascarilla de respiración presurizada.
Requiere precisión. Impresora 3D de alta resolución.
inovt_covid19_version_2_0_david_pascoal_0mbFUa0ce1.rarEsquemáticos
Diagrama de la versión autónoma, no necesita columna de aire del hospital.
Versión 2.2. Con guardia de seguridad y salida de alarma.
Proceso de manufactura
- Construye un Spybot controlado por Bluetooth con Arduino
- FlickMote: Mando IR por gestos para Smart Home
- TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Soluciones de Alimentación Optimizadas para Proyectos Arduino
- Tres en raya con Arduino, matriz LED MAX7219 y carcasa de cartón
- Construye un Robot Cuadrúpedo Inteligente con Arduino: Guía Paso a Paso
- Construye un volante joystick personalizado con Arduino para gaming
- Construye una Máquina CNC Totalmente Funcional con Arduino Nano R3
- Placa de referencia open-source acelera desarrollo rápido de ventiladores médicos