Kit sensor PM10, temperatura y humedad con Arduino – Hazlo tú mismo
Componentes y materiales
| Arduino Nano R3 | 1 |
| Sensor PM SDS018 (Nova Fitness) | 1 |
| Sensor temperatura/humedad DHT22 (Adafruit) con resistencia pull-up y condensador en módulo | 1 |
| Pantalla OLED I2C 128x32 SSD1306 | 1 |
| LED verde 3mm (Broadcom) | 1 |
| LED amarillo 3mm (Broadcom) | 1 |
| LED rojo 3mm (Broadcom) | 1 |
| Condensador 100 nF (opcional, para DHT22) | 1 |
| Resistencia 4.7 kΩ (opcional, pull-up DHT22) | 1 |
| Power bank (alimentación USB) | 1 |
| Resistencias 390 Ω (para LEDs) | 3 |
| Tornillos M3x16 (caja), M3x6 (SDS018) | 4 / 1 |
| Soportes LED 3mm, tubotermoretráctil, jumpers hembra, header 2 pines, jumper genérico | varios |
Herramientas necesarias
- Soldador y estaño sin plomo
- Impresora 3D
- Pistola de silicona caliente
- Taladro/atornillador
Aplicaciones y servicios online
- Arduino IDE
Sobre el proyecto
Resumen
Estudios experimentales sugieren que la materia particulada (PM) puede actuar como "vector" para la propagación del virus COVID-19. Las partículas finas en suspensión podrían transportar el virus a distancias mayores y mantenerlo viable horas, días o semanas. La contaminación por PM10 y PM2.5, generada también por granjas industriales de ganado, podría explicar mayores tasas de infección en zonas como el norte de Italia (Lombardía), incluso durante el confinamiento.
Investigadores italianos hallaron correlación significativa entre excesos diarios de PM10 y propagación del COVID-19 (febrero 2020), con brotes concentrados en el Valle del Po. La humedad relativa y temperatura también influyen: virus sobreviven más con humedad <40% o >60%.
Mi solución
Dispositivo replicable, bajo coste y fácil de usar que mide PM10, temperatura y humedad relativa para alertar cuando los valores son potencialmente peligrosos. Permite decidir quedarse en casa, usar mascarilla, etc.
Hardware: Arduino Nano, sensor SDS018 (PM10/PM2.5), DHT22 (T/RH), pantalla OLED I2C, 3 LEDs (verde, amarillo, rojo). La pantalla alterna PM10+HR% y PM2.5+Temp. LEDs indican nivel de alarma:
- Normal (PM10 ≤25 µg/m³, HR 40-60%): LEDs apagados.
- Bajo (PM10 ≤25, HR fuera de rango) o (PM10 26-50, HR 40-60%): LED verde.
- Advertencia (PM10 26-50, HR fuera de rango) o (PM10 >50, HR 40-60%): verde + amarillo.
- Alarma (PM10 >50, HR fuera de rango): verde + amarillo + rojo.
Sensor SDS018 – PM10/PM2.5
Detección por dispersión láser, rango 0.3-10 µm, salida UART (TTL), ventilador integrado, resolución 0.3 µg/m³, certificación CE/FCC/RoHS. Pinout: 1-NC, 2-PWM 1µm, 3-5V, 4-PWM 2.5µm, 5-GND, 6-RX, 7-TX. Conexión: TX (pin 7) → RX Arduino Nano; 5V y GND compartidos.
Sensor DHT22 – Temperatura y humedad
Digital, 3-5V, 0-100% HR (precisión 2-5%), -40 a 80°C (±0.5°C), muestreo 0.5 Hz. Pinout: VDD, DATA, NC, GND. Conexión: DATA → D2 Arduino; pull-up 4.7kΩ entre DATA y VDD; condensador 100nF entre VDD y GND. Librería Adafruit DHT v1.3.10.
Pantalla OLED I2C SSD1306
128x32 píxeles, blanco sobre negro, 3.3-5V, I2C. Pines: SDA→A4, SCL→A5, VCC→5V, GND→GND. Librería Adafruit SSD1306 v2.2.1.
LEDs y conexiones
- Ánodo rojo → D3, ánodo verde → D4, ánodo amarillo → D5.
- Cátodos con resistencia 390Ω en serie a GND.
Modificación hardware Arduino Nano
Para leer UART del SDS018 sin conflictos con USB, se elimina el resistor SMD del puente RX (flecha roja en foto) y se suelda verticalmente con dos hilos a un header. El jumper se coloca solo al programar; quitado en operación normal. Alternativamente, eliminar el resistor permanentemente (pierde programabilidad).
Alimentación
Arduino Nano vía USB desde power bank (5V).
Caja y montaje (impresión 3D)
Caja naranja PLA en dos partes: inferior (Arduino + SDS018, apertura mini-USB), superior (DHT22, OLED, 3 LEDs con orificios). Archivos 3D en Sketchfab: parte superior, parte inferior. Ensamblado con silicona caliente y tornillos M3.
Firmware (sketch Arduino)
Diagrama de flujo: setup periféricos + test LEDs. Loop principal:
- Primer loop: delay 2s (estabilización DHT22).
- Lee DHT22 → envía T y HR a monitor serie.
- Lee SDS018 (10 bytes, verifica cabecera 0xAA 0xC0, checksum) → calcula PM2.5 y PM10 → envía a monitor serie.
- Evalúa umbrales PM10 y HR → enciende LEDs según 4 estados.
- Alterna pantalla: PM10+HR% (o "Alarm!!!") ↔ PM2.5+Temp.
- Delay 2s total (500ms + 1500ms con LED builtin parpadeando).
Código completo
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int startdhr22 = 0;
int switchDisplay = 0;
const int ledRed = 3, ledGreen = 4, ledYellow = 5;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ledRed, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(ledYellow, OUTPUT);
dht.begin();
Serial.begin(9600); Serial.println("start");
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { for(;;); }
display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE);
// Test LEDs
digitalWrite(ledGreen, HIGH); delay(500);
digitalWrite(ledYellow, HIGH); delay(500);
digitalWrite(ledRed, HIGH); delay(500);
digitalWrite(ledGreen, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
delay(500);
}
void loop() {
// DHT22
if(0 == startdhr22) { delay(2000); startdhr22 = 1; }
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; }
Serial.print("Humidity: "); Serial.print(h); Serial.print("% Temperature: "); Serial.print(t); Serial.println("°C");
// SDS018
uint8_t dataIN[10] = {0};
float pm25 = 0, pm10 = 0;
while(Serial.available() > 0) {
for(int i=0; i<10; ++i) dataIN[i] = Serial.read();
if((0xAA == dataIN[0]) && (0xC0 == dataIN[1]) && (0xAB == dataIN[9])) {
uint8_t cksum = 0;
for(int i=2; i<=7; ++i) cksum += dataIN[i];
if(cksum == dataIN[8]) {
digitalWrite(LED_BUILTIN, HIGH);
uint8_t pm25Lo = dataIN[2], pm25Hi = dataIN[3];
uint8_t pm10Lo = dataIN[4], pm10Hi = dataIN[5];
pm25 = ((pm25Hi * 256.0) + pm25Lo) / 10.0;
pm10 = ((pm10Hi * 256.0) + pm10Lo) / 10.0;
Serial.print("PM2.5: "); Serial.print(pm25); Serial.println(" ug/m3");
Serial.print("PM10: "); Serial.print(pm10); Serial.println(" ug/m3");
}
Serial.println("-----------------");
}
Serial.flush();
}
// LEDs según umbrales
if((pm10 <= 25) && (h >= 40 && h <= 60)) { // Normal
digitalWrite(ledGreen, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
} else if((pm10 <= 25) && (h < 40 || h > 60)) { // Bajo
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
} else if((pm10 > 25 && pm10 <= 50) && (h >= 40 && h <= 60)) { // Bajo
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
} else if((pm10 > 25 && pm10 <= 50) && (h < 40 || h > 60)) { // Advertencia
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, LOW);
} else if((pm10 > 50) && (h >= 40 && h <= 60)) { // Advertencia
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, LOW);
} else { // Alarma
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, HIGH);
}
// Pantalla OLED
if(0 == switchDisplay) {
display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0);
if(pm10 > 50) display.print("Alarm!!!");
else { display.print("PM10:"); display.println(pm10); }
display.print(" HR%:"); display.println(h);
display.display(); switchDisplay = 1;
} else {
display.clearDisplay(); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.setCursor(0,0);
display.print("PM25:"); display.println(pm25);
display.print("T[C]:"); display.println(t);
display.display(); switchDisplay = 0;
}
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(1500);
}
Partes personalizadas y cajas (CAD)
- Parte superior de la caja: Ver en Sketchfab
- Parte inferior de la caja: Ver en Sketchfab
Esquemático eléctrico
Diagrama de conexiones: Arduino Nano → SDS018 (RX/TX), DHT22 (D2), OLED (A4/A5), LEDs (D3-D5), alimentación USB.
Proceso de manufactura
- Cómo el COVID‑19 aceleró la automatización en la industria del plástico
- Cómo el COVID-19 Está Remodelando el Futuro del Trabajo y la Automatización: Insights de un Nuevo Estudio
- Cómo la Automatización Aceleró la Resiliencia Manufacturera en Medio del COVID-19
- El COVID-19 y el fin del paradigma económico de la posguerra
- El efecto pandemia: COVID-19 acelerando la innovación en blockchain y criptomonedas
- La COVID-19 acelera el fin de los RFP anuales de cargadores
- Wayfair y COVID-19: Navegando los Desafíos de Vendedores Exentos de Impuestos en una Economía Post-Pandemia
- Cerrando la Brecha de Habilidades: Estrategias de Reciclaje y Reentrenamiento Post-COVID para Fabricantes
- Guía y recursos COVID-19 para líderes manufactureros
- Detección Rápida y Precisa de COVID-19 Usando Tecnología de Grafeno
- Enfoque circular de SABIC: envases plásticos, seguridad y sostenibilidad en tiempos de COVID-19