Sensor PMS1003 con pantalla


#1

Les comparto el sketch de Arduino del programa de un sensor PMS1003 montado sobre un NodeMCU (D-Duino) con pantalla OLED 128x64 incorporada; espero les sea de utilidad.

/* Estacion de monitoreo calidad del aire V1.2

  • Sergio Restrepo sa.trepo@gmail.com
  • https://thingspeak.com/channels/508976
  • El modo predeterminado está activo después del encendido.
  • En este modo, el sensor enviará datos seriales al host automáticamente.
  • El modo activo se divide en dos submodos: modo estable y modo rápido.
  • Si el cambio de concentración es pequeño, el sensor se ejecutará en modo estable
  • con el intervalo real de 2,3 s. Y si el cambio es grande, el sensor
  • se cambiará automáticamente a modo rápido con un intervalo de 200 ~ 800 ms,
  • cuanto mayor sea la concentración, menor será el intervalo.
  • PMS Library - Libreria tomadas de https://github.com/fu-hsi/pms
  • MIT License

*/

// ============================================================
// Pantalla OLED
// ============================================================
#include <Wire.h>
#include “SSD1306.h”
SSD1306 display(0x3c, 5,4);
#include “Monospaced10.h”
#include “Monospaced12.h”
#include “Monospaced13.h”
#include “Monospaced14.h”
#include “Monospaced15.h”
#include “Monospaced16.h”
#include “Monospaced16bold.h”

// ============================================================
// Libreria sensor PMS1003
// ============================================================
#include “PMS.h” // https://github.com/fu-hsi/pms
PMS pms(Serial);
PMS::DATA data;

// ============================================================
// Variables
// ============================================================
float pm1_0 = 0;
float pm2_5 = 0;
float pm10_0 = 0;

String descripcionAQI_pm2_5;
String descripcionAQI_pm10_0;
int ICA_pm2_5 = 0;
int ICA_pm10_0 = 0;
double ILo = 0;
double IHi = 0;
double BPlo = 0;
double BPhi = 0;

// ============================================================
// Setup
// ============================================================
void setup()
{
Serial.begin(9600);
display.init();
}

// =====================================================================================
// Lazo principal
// =====================================================================================
void loop()
{
if (pms.read(data)) // Si hay datos …
//====================================================================================
// Define y describe la calidad del aire de acuerdo al “Indice de calidad del aire”
// para PM2.5
//====================================================================================
{
if (pm2_5 >= 0 && pm2_5 <= 12) {
ILo = 0;
IHi = 50;
BPlo = 0;
BPhi = 12;
ICA_pm2_5 = (IHi - ILo) / (BPhi - BPlo) * (pm2_5 - BPlo) + ILo;
} else if (pm2_5 > 12.1 && pm2_5 <= 35.4) {
ILo = 51;
IHi = 100;
BPlo = 12.1;
BPhi = 35.4;
ICA_pm2_5 = (IHi - ILo) / (BPhi - BPlo) * (pm2_5 - BPlo) + ILo;
} else if (pm2_5 > 35.5 && pm2_5 <= 55.4) {
ILo = 101;
IHi = 150;
BPlo = 35.5;
BPhi = 55.4;
ICA_pm2_5 = (IHi - ILo) / (BPhi - BPlo) * (pm2_5 - BPlo) + ILo;
} else if (pm2_5 > 55.5 && pm2_5 <= 150.4) {
ILo = 151;
IHi = 200;
BPlo = 55.5;
BPhi = 150.4;
ICA_pm2_5 = (IHi - ILo) / (BPhi - BPlo) * (pm2_5 - BPlo) + ILo;
} else if (pm2_5 > 150.5 && pm2_5 <= 250.4) {
ILo = 201;
IHi = 300;
BPlo = 150.5;
BPhi = 250.4;
ICA_pm2_5 = (IHi - ILo) / (BPhi - BPlo) * (pm2_5 - BPlo) + ILo;
} else if (pm2_5 > 250.5 && pm2_5 <= 350.4) {
ILo = 301;
IHi = 400;
BPlo = 250.5;
BPhi = 350.4;
ICA_pm2_5 = (IHi - ILo) / (BPhi - BPlo) * (pm2_5 - BPlo) + ILo;
} else if (pm2_5 > 350.5) {
ILo = 401;
IHi = 500;
BPlo = 350.5;
BPhi = 500.4;
ICA_pm2_5 = (IHi - ILo) / (BPhi - BPlo) * (pm2_5 - BPlo) + ILo;
}

if (ICA_pm2_5 >= 0 && ICA_pm2_5 <= 50)
{ descripcionAQI_pm2_5 = String(“Buena”);

} else if (ICA_pm2_5 > 50 && ICA_pm2_5 <= 100)
{ descripcionAQI_pm2_5 = String(“Moderada”);

} else if (ICA_pm2_5 > 100 && ICA_pm2_5 <= 150)
{ descripcionAQI_pm2_5 = String(“Dañina grup sens”);

} else if (ICA_pm2_5 > 150 && ICA_pm2_5 <= 200)
{ descripcionAQI_pm2_5 = String(“Dañina”);

} else if (ICA_pm2_5 > 200 && ICA_pm2_5 <= 300)
{ descripcionAQI_pm2_5 = String(“Muy dañina”);

} else if (ICA_pm2_5 > 300 && ICA_pm2_5 <= 500)
{ descripcionAQI_pm2_5 = String(“PELIGROSA”);

} else
{ descripcionAQI_pm2_5 = String(“MUY Peligroso”);
}

//==========================================================================
// Describe la calidad del aire de acuerdo al “Indice de calidad del aire”
// para PM10.0
//===========================================================================

if (pm10_0 >= 0 && pm10_0 <= 54) {
ILo = 0;
IHi = 50;
BPlo = 0;
BPhi = 54;
ICA_pm10_0 = (IHi - ILo) / (BPhi - BPlo) * (pm10_0 - BPlo) + ILo;
} else if (pm10_0 > 55 && pm10_0 <= 154) {
ILo = 51;
IHi = 100;
BPlo = 55;
BPhi = 154;
ICA_pm10_0 = (IHi - ILo) / (BPhi - BPlo) * (pm10_0 - BPlo) + ILo;
} else if (pm10_0 > 155 && pm10_0 <= 254) {
ILo = 101;
IHi = 150;
BPlo = 155;
BPhi = 254;
ICA_pm10_0 = (IHi - ILo) / (BPhi - BPlo) * (pm10_0 - BPlo) + ILo;
} else if (pm10_0 > 255 && pm10_0 <= 354) {
ILo = 151;
IHi = 200;
BPlo = 255;
BPhi = 354;
ICA_pm10_0 = (IHi - ILo) / (BPhi - BPlo) * (pm10_0 - BPlo) + ILo;
} else if (pm10_0 > 355 && pm10_0 <= 424) {
ILo = 201;
IHi = 300;
BPlo = 355;
BPhi = 424;
ICA_pm10_0 = (IHi - ILo) / (BPhi - BPlo) * (pm10_0 - BPlo) + ILo;
} else if (pm10_0 > 425 && pm10_0 <= 504) {
ILo = 301;
IHi = 400;
BPlo = 425;
BPhi = 504;
ICA_pm10_0 = (IHi - ILo) / (BPhi - BPlo) * (pm10_0 - BPlo) + ILo;
} else if (pm10_0 > 505) {
ILo = 401;
IHi = 500;
BPlo = 505;
BPhi = 604;
ICA_pm10_0 = (IHi - ILo) / (BPhi - BPlo) * (pm10_0 - BPlo) + ILo;
}

if (ICA_pm10_0 >= 0 && ICA_pm10_0 <= 50)
{ descripcionAQI_pm10_0 = String(“Buena”);

} else if (ICA_pm10_0 > 50 && ICA_pm10_0 <= 100)
{ descripcionAQI_pm10_0 = String(“Moderada”);

} else if (ICA_pm10_0 > 100 && ICA_pm10_0 <= 150)
{ descripcionAQI_pm10_0 = String(“Dañina grup sens”);

} else if (ICA_pm10_0 > 150 && ICA_pm10_0 <= 200)
{ descripcionAQI_pm10_0 = String(“Dañina”);

} else if (ICA_pm10_0 > 200 && ICA_pm10_0 <= 300)
{ descripcionAQI_pm10_0 = String(“Muy dañina”);

} else if (ICA_pm10_0 > 300 && ICA_pm10_0 <= 500)
{ descripcionAQI_pm10_0 = String(“PELIGROSA”);

} else
{ descripcionAQI_pm10_0 = String(“MUY Peligroso”);
}

// =======================================================
// Muestra datos en monitor Serial
// =======================================================

Serial.print("PM 1.0 (ug/m3): ");
Serial.println(data.PM_AE_UG_1_0);
Serial.print("PM 2.5 (ug/m3): “);
Serial.print(data.PM_AE_UG_2_5);
Serial.print(” ICA: “);
Serial.print(ICA_pm2_5);
Serial.print(” ");
Serial.println(descripcionAQI_pm2_5);
Serial.print("PM 10. (ug/m3): “);
Serial.print(data.PM_AE_UG_10_0);
Serial.print(” ICA: “);
Serial.print(ICA_pm10_0);
Serial.print(” ");
Serial.println(descripcionAQI_pm10_0);
Serial.println();

// =====================================================
// Muestra datos en la pantalla OLED
// =====================================================
pm1_0 = data.PM_AE_UG_1_0;
pm2_5 = data.PM_AE_UG_2_5;
pm10_0 = data.PM_AE_UG_10_0;

display.clear();

// Pantalla para PM2.5
display.setFont(SansSerif_plain_12);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(70,15,“µg/m³”);
display.setFont(SansSerif_plain_12);
display.drawString(70,30,“ICA”);
display.setFont(SansSerif_bold_16);
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.drawString(64,0,“PM2.5”);

display.setFont(SansSerif_plain_16);
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(64,15,String(pm2_5,0));
display.drawString(64,30,String(ICA_pm2_5));

display.setFont(SansSerif_plain_14);
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.drawString(64,45,String(descripcionAQI_pm2_5));
display.display();
}
}


#2

@serestre genial tu iniciativa. Muchas gracias por compartir.

te interesaría de manera adicional agregar esa información que estás recolectando como un nodo acá http://aqa.daquina.io:8888/sources/1/dashboards/2#

Por si es de tu interés, mira una guía de ¿cómo hacerlo?

Saludos!


#3

Claro que me gustaría compartir la información; no tengo mucho conocimiento como para agregar la información a otro nodo; ya he leído la guía pero nada … si alguien me ayuda un poco más lo agradecería


#4

Sergio, esto se explicó en otra entrada, mira aquí: