Dispositif de désinfection de masques UV-C et chaleur piloté par Arduino
Composants et fournitures
| Composant | Quantité |
|---|---|
| Capteur température infrarouge Grove (Seeed) | 1 |
| Arduino UNO | 1 |
| Base Shield V2 (Seeed) | 1 |
| Capteur de lumière Grove (P) v1.1 (Seeed) | 1 |
| Afficheur alphanumérique 4 chiffres 0,54" I2C (Adafruit) | 1 |
| Bouton poussoir 12 mm bombé (Seeed) | 1 |
| Haut-parleur piézo | 1 |
| Alimentation murale 12 VDC 1,2 A (Seeed) | 1 |
À propos de ce projet
Dispositif de désinfection de masques
UV-C / chaleur, piloté par Arduino, pour Coronavirus (SARS-CoV-2)
Projet open source sous licence Creative Commons BY-NC-SA.
Avertissement : Ce document relève de la « Good Samaritan Law ». Publication originale : needlab.org
Introduction
Les masques FFP1 et FFP2 sont indispensables pendant les épidémies. Conçus à usage unique, leur réutilisation devient inévitable en crise, nécessitant des méthodes de désinfection (1). Hôpitaux et centres de recherche utilisent l'irradiation ultraviolette germicide (UVGI) et/ou la chaleur. Mais ces méthodes ne sont pas accessibles aux populations vulnérables, où la réutilisation est la seule option. Le SARS-CoV-2 reste stable sur masques chirurgicaux jusqu'à 7 jours (2) → besoin urgent d'une méthode de désinfection accessible.
Ce projet crée un dispositif portable, bas coût, reproductible, combinant UVGI et chaleur sèche pour désinfecter les masques du SARS-CoV-2.
Instructions DIY
Schéma de principe
- Température maintenue à 65 ± 5 °C
- Lampe émettant en UV-C (longueur d'onde ~254 nm)
- Cycle de désinfection : minimum 30 minutes (recommandé : pas plus de 30 min pour éviter dégradation du masque)
Dimensions du dispositif
Premiers tests de chauffe
Fabrication du système de chauffe
- Poêle à frire 22 cm de diamètre (compatible induction), manche retiré.
- Recouvrir l'intérieur de papier aluminium pour réflexion UV-C.
- Percer un trou de 20 cm au centre du fond de la boîte.
- 4 supports métalliques pour maintenir la poêle sans contact avec le bois (perte de chaleur).
Important : La poêle ne doit pas toucher le bois. Choisir le bon diamètre de trou et former les supports selon ce schéma :
Fabrication du couvercle
Système UV-C
Source UV-C : ampoule 11 W extraite d'un « Stérilisateur pour aquarium ». Montée sur le couvercle aux deux extrémités (4 trous, colliers de serrage + patins souples). Surface supérieure recouverte d'aluminium pour réflexion.
N'utilisez pas de verre comme tube de protection : le verre bloque les UV-C. Le tube en quartz (utilisé ici) est transparent aux UV-C.
⚠️ AVERTISSEMENT CRITIQUE
Le rayonnement UV-C est TRÈS DANGEREUX pour les yeux et la peau.
La lampe UV-C ne doit être allumée QUE lorsque le couvercle est fermé, et éteinte dès l'ouverture.
Recommandations cruciales de Horror Coder (commentaires) :
- Le rayonnement visible du tube germicide n'est que 3-4% de l'émission totale. Ne faites pas confiance à vos yeux.
- Vérifiez l'étanchéité à la lumière : placez une lampe puissante (10× la puissance du tube, ex: torche LED haute puissance) à l'intérieur de la boîte fermée, dans le noir complet. Cherchez toute fuite de lumière autour du boîtier.
- Bouchez tous les trous, utilisez joints mousse / bordures pour éliminer tout risque de fuite UV-C.
Revêtement aluminium
Recouvrez parois et couvercle de papier aluminium (ruban double face + scotch sur les bords) pour refléter les UV-C sur les faces latérales et augmenter l'efficacité.
Grille de support pour masques
Grille en fil de cuivre fin (espacement 30 mm), à 120 mm du fond. Maintenue par fils passant par petits trous sur faces avant/arrière.
Configuration Arduino et capteurs
Vue d'ensemble Arduino
Liste des composants (BOM)
- Arduino UNO Rev3
- Grove Base Shield V2
- Grove Capteur température infrarouge
- Grove Capteur lumière (P)
- Bouton poussoir 12 mm
- Haut-parleur piézo
- Afficheur alphanumérique 4 chiffres 0,54" I2C (Adafruit #2157)
- Alimentation 12 VDC 1,2 A
Capteurs température et lumière
Voir aussi : Benchmarking capteurs température Arduino
Logique de contrôle Arduino
États de l'automate :
- INIT : Affiche la température. Attend seuil 70 °C pour passer à COUNT.
- COUNT : Compte à rebours 30→0 min affiché à côté de la température. Si température trop basse ou UV éteint → ERR.
- END : Fin normale. Bip sonore. Appui bouton → INIT.
- ERR : Erreur (température basse ou UV off). Bip d'erreur. Appui bouton → INIT.
Alarmes : Tonalité spécifique + messages sur afficheur si : état ERR, ou température > 75 °C.
Code source Arduino
Disponible sur Pastebin.
Bibliothèques externes requises :
Adafruit_LEDBackpack.h: Adafruit LED BackpackMetro.h: Metro Arduino Wiring
Manuel utilisateur
- Placez la boîte sur votre plaque à induction (ou résistive).
- Mettez l'Arduino sous tension.
- Fermez la boîte et chauffez à 70-80% puissance.
- Attendez 60 °C. Réduisez à 30% puissance.
- Ouvrez, placez vos masques, refermez.
- Appuyez sur le bouton pour démarrer → affichage 30 min.
- Attendez la fin (00 min) → signal sonore.
- Pour un nouveau cycle, appuyez à nouveau sur le bouton.
Remarque : En mode COUNT, le point entre Timer et Température clignote à 1 Hz.
Cycles de température
Inactivation thermique des virus
La chaleur humide (<100 °C) élimine les microorganismes depuis Pasteur. Ici, chaleur sèche : élimine efficacement SARS-CoV. Inactivation significative à 56 °C (30-90 min), quasi complète à 65 °C (20-60 min), complète à 75 °C (30-45 min) (7,8). Étude récente : SARS-CoV-2 perd toute infectivité à 56 °C/30 min ou 70 °C/5 min (2).
Choix du protocole : 65 °C pendant 30 min (compromis efficacité / préservation masque).
Protocoles germicides sur masques
Désinfection masques efficace contre grippe : UVGI ~1 J/cm² (10), UVGI ~18 J/cm², ou chaleur humide 65±5 °C/3 h (11). Pas d'études sur coronavirus sur masques, mais virus à ARN simple brin similaires → effets attendus comparables.
Méthode recommandée pour désinfecter les masques
Procédure importante : personnalisation, comptage cycles, conditionnement masques désinfectés. Inspirez-vous du process « N95 Filtering Facepiece Respirator UVGI Process for Decontamination and Reuse » (Nebraska Medicine).
Conclusions
Protocole retenu : 30 min UV-C + chaleur sèche 65±5 °C. Le temps compte dès l'atteinte de la température/intensité requises. UV-C ou chaleur seuls suffiraient probablement, l'action combinée augmente la sécurité.
Considérations de sécurité
- UV-C nocif pour peau/yeux. Ampoule allumée uniquement boîte fermée.
- Attention aux pièces métalliques chaudes après cycle (risque brûlure).
Avertissement légal
Basé sur preuves scientifiques disponibles, le protocole éliminera probablement quasi tout SARS-CoV-2, et rendra les masques bien plus sûrs qu'aucune désinfection. Mais : aucun test laboratoire formel n'a été fait sur ce dispositif, ni sur l'impact réel sur la filtration. L'utilisation est une décision libre. Needlab et l'équipe déclinent toute responsabilité.
Prochaines étapes (V2)
- Dimensions augmentées pour plus de masques
- Fichiers CNC et découpe laser
- 3 options chauffe : induction, plaque électrique, infrarouge (avec régulation PID)
- Afficheur LCD 2×16
- Modes multiples : Chaleur+UV-C, Chaleur seul, UV-C seul
- Choix capteurs température (benchmark)
Recherche de validation en labos spécialisés.
Mise à jour 11 juin : V2 avec 12 masques FFP2/N95, prix OPT 1er prix, collaboration université Maroc pour production locale.
Mise à jour 2 sept : Projet V2 sur Hackaday : hackaday.io
Équipe : Jean Noel Lefebvre, Daniel Moreno, Dr Alejandra Duque, Dr Felipe Gutiérrez Arango, Jason Knight, Maria Isabel Velez Isaza, Sameera Chukkapalli.
#COVID19DetectProtect
Bibliographie
- CDC - Recommended Guidance for Extended Use and Limited Reuse of N95 (2019)
- Chin et al. - Stability of SARS-CoV-2 in different environmental conditions (medRxiv 2020)
- Tseng & Li - Inactivation of Viruses on Surfaces by UVGI (J Occup Environ Hyg 2007)
- Hackerfarm - HOWTO: NUKEMETER – Measuring UV-C Light Intensity (2020)
- van Doremalen et al. - Aerosol and Surface Stability of SARS-CoV-2 (NEJM 2020)
- Kariwa et al. - Inactivation of SARS coronavirus (Jpn J Vet Res 2004)
- Duan et al. - Stability of SARS Coronavirus... Sensitivity to Heating and UV (Biomed Environ Sci 2003)
- Darnell et al. - Inactivation of the coronavirus SARS-CoV (J Virol Methods 2004)
- Ansaldi et al. - SARS-CoV, influenza A and syncitial respiratory virus resistance... (2004)
- Mills et al. - UVGI of influenza-contaminated N95 (Am J Infect Control 2018)
- Lore et al. - Effectiveness of Three Decontamination Treatments against Influenza Virus (Ann Occup Hyg 2012)
- Lindsley et al. - Effects of UVGI on N95 Respirator Filtration Performance (J Occup Environ Hyg 2015)
- Viscusi et al. - Evaluation of Five Decontamination Methods for FFR (Ann Occup Hyg 2009)
- Bergman et al. - Evaluation of Multiple (3-Cycle) Decontamination Processing (J Eng Fiber Fabr 2010)
- Kampf et al. - Persistence of coronaviruses on inanimate surfaces... (J Hosp Infect 2020)
Code
TheBox V1 (C/C++)
/* * Author: Jean Noel Lefebvre - www.ootsidebox.fr - march 31th 2020 * */
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include <math.h>
#include <Metro.h>
#define LIGHT_SENSOR A2
#define SUR_TEMP_PIN A0
#define OBJ_TEMP_PIN A1
#define BUZZER 3
#define BP 2
#define SEUIL_TEMP 59
#define HIGH_TEMP 75
#define SEUIL_LIGHT 60
#define TIMER 30
float temp_calibration=0;
float objt_calibration=0.000;
float temperature_range=10;
float offset_vol=0.014;
float tempValue = 0;
float objtValue= 0;
float current_temp=0;
float temp=0;
float temp1=0;
float temp2=0;
unsigned int temp3=0;
const float reference_vol=0.500;
unsigned char clear_num=0;
float R=0;
float voltage=0;
long res[100]={ 318300,302903,288329,274533,261471,249100,237381,226276,215750,205768,
196300,187316,178788,170691,163002,155700,148766,142183,135936,130012,
124400,119038,113928,109059,104420,100000,95788,91775,87950,84305,
80830,77517,74357,71342,68466,65720,63098,60595,58202,55916,
53730,51645,49652,47746,45924,44180,42511,40912,39380,37910,
36500,35155,33866,32631,31446,30311,29222,28177,27175,26213,
25290,24403,23554,22738,21955,21202,20479,19783,19115,18472,
17260,16688,16138,15608,15098,14608,14135,13680,13242,12819,
12412,12020,11642,11278,10926,10587,10260,9945,9641,9347,
9063,8789,8525,8270,8023,7785,7555,7333,7118,6911 };
float obj[13][12]={ /*0*/ { 0,-0.274,-0.58,-0.922,-1.301,-1.721,-2.183,-2.691,-3.247,-3.854,-4.516,-5.236},
/*1*/ { 0.271,0,-0.303,-0.642,-1.018,-1.434,-1.894,-2.398,-2.951,-3.556,-4.215,-4.931},
/*2*/ { 0.567,0.3,0,-0.335,-0.708,-1.121,-1.577,-2.078,-2.628,-3.229,-3.884,-4.597},
/*3*/ { 0.891,0.628,0.331,0,-0.369,-0.778,-1.23,-1.728,-2.274,-2.871,-3.523,-4.232},
/*4*/ { 1.244,0.985,0.692,0.365,0,-0.405,-0.853,-1.347,-1.889,-2.482,-3.13,-3.835},
/*5*/ { 1.628,1.372,1.084,0.761,0.401,0,-0.444,-0.933,-1.47,-2.059,-2.702,-3.403},
/*6*/ { 2.043,1.792,1.509,1.191,0.835,0.439,0,-0.484,-1.017,-1.601,-2.24,-2.936},
/*7*/ { 2.491,2.246,1.968,1.655,1.304,0.913,0.479,0,-0.528,-1.107,-1.74,-2.431},
/*8*/ { 2.975,2.735,2.462,2.155,1.809,1.424,0.996,0.522,0,-0.573,-1.201,-1.887},
/*9*/ { 3.495,3.261,2.994,2.692,2.353,1.974,1.552,1.084,0.568,0,-0.622,-1.301},
/*10*/ { 4.053,3.825,3.565,3.27,2.937,2.564,2.148,1.687,1.177,0.616,0,-0.673},
/*11*/ { 4.651,4.43,4.177,3.888,3.562,3.196,2.787,2.332,1.829,1.275,0.666,0},
/*12*/ { 5.29,5.076,4.83,4.549,4.231,3.872,3.47,3.023,2.527,1.98,1.379,0.72} };
int Light; float Heat; int Timer=0; int Minute=59;
Adafruit_AlphaNum4 alpha4 = Adafruit_AlphaNum4();
Metro ledMetro = Metro(1000);
enum States{INIT, COUNT, END, ERR};
int Automate=INIT;
bool TemperatureOK=false; bool LightOK=false;
void setup() {
pinMode(BP, INPUT_PULLUP);
Serial.begin(9600);
analogReference(INTERNAL);
alpha4.begin(0x70);
alpha4.clear(); alpha4.writeDisplay();
PrintLed(alpha4,"TboX");
tone(3, 3000, 500); delay(1000);
Automate=INIT;
}
void loop() {
static int Point=1;
float T1=measureSurTemp();
float T2=measureObjectTemp();
Heat=T1+0;
if ((ledMetro.check() == 1) ) {
#ifndef TEST
if (Automate==COUNT)
#endif {
if(Point) Point=0; else Point=1;
Minute--;
if(Minute==0) { Minute=59; if(Timer) Timer--; PrintSensors(); }
}
if(Automate==END) tone(3, 3000, 100);
if(Automate==ERR) tone(3, 300, 200);
}
#ifdef TEST TemperatureOK=true;
#else if (Heat >= SEUIL_TEMP) TemperatureOK=true; else TemperatureOK=false; #endif
Light=analogRead(LIGHT_SENSOR)/10;
if(Light >= SEUIL_LIGHT) LightOK=true; else LightOK=false;
if(Heat>=HIGH_TEMP) { tone(3, 300, 200); delay(500); }
switch(Automate) {
case INIT:
Timer=0;
if((!digitalRead(BP)) && TemperatureOK) { Automate=COUNT; Timer=TIMER; tone(3, 3000, 500); }
if((!digitalRead(BP)) && !TemperatureOK) { PrintLed(alpha4,"lowT"); tone(3, 300, 200); }
else PrintLedVal(alpha4,Timer,(int)Heat,Point);
break;
case COUNT:
if(Timer==0) Automate=END;
if(!LightOK || !TemperatureOK) Automate=ERR;
PrintLedVal(alpha4,Timer,(int)Heat,Point);
break;
case END:
if(!digitalRead(BP)) Automate=INIT;
PrintLed(alpha4,"END.");
break;
case ERR:
if(!digitalRead(BP)) Automate=INIT;
PrintLed(alpha4,"Err.");
break;
}
}
void PrintSensors() {
Serial.print(Timer); Serial.print(", "); Serial.print((int)Heat); Serial.print(", "); Serial.print(100); Serial.println();
}
float binSearch(long x) {
int low=0, mid, high=100;
while (low<=high) {
mid=(low+high)/2;
if(xobj[temp3][i])&&(voltage
Ressources GitHub
Schémas
Processus de fabrication
- Mise à l'échelle de l'approvisionnement IoT : stratégies sécurisées et efficaces pour l'intégration des appareils
- Suivi des avancées technologiques dans les dispositifs médicaux
- Construction d'une station météo extérieure avec Raspberry Pi 2 et ADS‑WS1
- Système de contrôle de température basé LM35 avec microcontrôleur AT89S52
- Breakout compact DHT Température & Humidité pour Raspberry Pi – ATtiny85 & DHT22/DHT11
- Commutateur de Démarrage Alimenté par Pico : Choisissez Votre OS Avant la Mise Sous Tension
- Sécurité des données dans le scanning mobile : pourquoi le traitement sur l'appareil est crucial
- Attestation d'appareil : comment GlobalPlatform bâtit la confiance dans l'IoT
- Accessoires de dispositifs médicaux : Définitions, classifications et impact réglementaire