Buenas noches querida comunidad, en estos últimos días me encuentro trabajando en el funcionamiento del sensor PLANTOWER PMS7003. Buscando en internet encontré una publicación donde mostraban el sketch para este sensor, el cual funciona bien con un arduino nano, sin embargo, cuando junto el código del PMS7003 con con el del RTC DS3231, LCD y Micro SD los valores del PMS7003 se congelan, variando solo la hora. He buscado en internet de que manera podría solucionar esto pero no he encontrado nada aun, lo poco que he avanzado es a través de tutoriales y foros en internet.
Espero puedan ayudarme con este inconveniente, cualquier consejo o tema que deba revisar que me ayude a corregir este problema sera bien recibido.
Adjunto el código y las librerías de trabajo. Cabe resaltar que yo solo he ordenado el skecth, los códigos no son de mi autoría.
PLACA DE TRABAJO: ARDUINO NANO
SENSORES: LCD, RTC DS3231, MICRO SD, PMS7003
Si de algo ayuda, estoy trabajando con arduino 1.8.10, uso el procesador ATmega 328p (OLD BOOTLOADER). Para cargar el sketch quitar la conexion RX, TX del PMS7003 (por alguna razón cuando esta conectado el sketch no carga en el arduino y les saldrá error), luego de cargar conectar los pines RX, TX.
Conexiones:
LCD: GND, VCC (5V), SCL(A5), SDA(A4)
MICRO SD: Ver http://lab.dejaworks.com/arduino-nano-sd-card-connection/
RTC DS3231: GND, VCC(3.3V), SCL(A5), SDA(A4)
PMS7003: GND, VCC (5V), RT (TX del NANO), TX (RX del NANO)
//----------------------- PMS 7003 -----------------------//
#include "PMS.h"
PMS pms(Serial);
PMS::DATA data;
//----------------------- LCD -----------------------//
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Debe descargar la Libreria que controla el I2C
LiquidCrystal_I2C lcd(0x27,20,4); //0x50 o 0x68
//----------------------- SD_CARD -----------------------//
#include <SPI.h>
#include <SD.h>
File dataFile;
const int chipSelect = 4; //cs o el pin de selección de guardado del protector sd está conectado a 10.
//----------------------- RELOJ_RTC_DS3231 -----------------------//
#include "Sodaq_DS3231.h"
char weekDay[][4] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab" };
//año, mes, dia, hora, minutos, segundos y dia de la semana (0=Domingo hasta 6=Sabado)
//Si se escribe una hora o fecha inexistente se puede interferir con la normal operación del RTC
DateTime dt(2019, 10, 21, 16, 40, 20, 1); //año, mes, dia, hora, min, seg, diasem
void setup()
{
//----------------------- LCD -----------------------//
lcd.init();
lcd.backlight(); // Activar luz de fondo
lcd.clear(); // Borrar LCD
//----------------------- PMS 7003 -----------------------//
Serial.begin(9600); // GPIO1, GPIO3 (TX/RX pin on ESP-12E Development Board)
//Serial1.begin(9600); // GPIO2 (D4 pin on ESP-12E Development Board)
//------------------------------------ SD_CARD ------------------------------------
Serial.print("Iniciando SD ...");
if (!SD.begin(chipSelect)) {
Serial.println("No se pudo inicializar");
while(1);
}
Serial.println("inicializacion exitosa");
File dataFile = SD.open("PMS.txt", FILE_WRITE);
// Si el archivo está disponible, escríbalo:
if (dataFile) {
dataFile.println("Fecha,Hora,Dia,PM1.0,Unidad,PM2.5,Unidad,PM10,Unidad");
//dataFile.println("Fecha,Hora,DHT22_AH_H3(%),DHT22_BH_H3(%),BME280_CH1_H3(%),DHT22_AT_T3(°C),DHT22_BT_T3(°C),PT100_PT3_T3(°C),PT100_PT2_T3(°C),BME280_CT1_T3(°C),BME280_CP1_P3(hPa),BME280_CAL1_AL3(m)");
dataFile.close();
}
// Si el archivo no se abrió, imprima un error:
else {
Serial.println("Error al abrir el archivo PMS.txt");
}
}
void loop()
{
//----------------------- PMS 7003 -----------------------//
// if (pms.read(data))
// {
pms.read(data);
DateTime now = rtc.now(); //Leer datos del RTC y mostrar
Serial.print(",");
Serial.print(now.year(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.date(), DEC);
Serial.print(",");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.print(",");
Serial.println(weekDay[now.dayOfWeek()]);
// pms.read(data);
Serial.print("PM 1.0 (ug/m3) = ");
Serial.println(data.PM_AE_UG_1_0);
Serial.print("PM 2.5 (ug/m3) = ");
Serial.println(data.PM_AE_UG_2_5);
Serial.print("PM 10.0 (ug/m3) = ");
Serial.println(data.PM_AE_UG_10_0);
Serial.println();
//----------------------- SD_CARD -----------------------//
// Abrir archivo para registrar datos.
// Abre el archivo, tenga en cuenta que solo se puede abrir un archivo a la vez, así que tienes que cerrar éste antes de abrir otro.
File dataFile = SD.open("PMS.txt", FILE_WRITE);
// Si el archivo está disponible, escríbalo:
if (dataFile) {
//Tiempo
dataFile.print(now.year(), DEC);
dataFile.print("/");
dataFile.print(now.month(), DEC);
dataFile.print("/");
dataFile.print(now.date(), DEC);
dataFile.print(",");
dataFile.print(now.hour(), DEC);
dataFile.print(":");
dataFile.print(now.minute(), DEC);
dataFile.print(":");
dataFile.print(now.second(), DEC);
dataFile.print(",");
dataFile.print(weekDay[now.dayOfWeek()]);
dataFile.print(",");
dataFile.print("----------");
dataFile.print(",");
//PM1,0
dataFile.print(data.PM_AE_UG_1_0);
dataFile.print(",");
dataFile.print("ug/m3");
dataFile.print(",");
//PM2,5
dataFile.print(data.PM_AE_UG_2_5);
dataFile.print(",");
dataFile.print("ug/m3");
dataFile.print(",");
//PM10
dataFile.print(data.PM_AE_UG_10_0);
dataFile.print(",");
dataFile.print("ug/m3");
dataFile.print(",");
dataFile.close();
//Imprimir los valores en el LCD los valores de temperatura y humedad
//Fecha y hora
lcd.setCursor(1,0); // Coordenadas LCD (x = COLUMNA; y = FILA)
lcd.print(now.year(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.date(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
//Sensor
lcd.setCursor(0,1); // coordenadas LCD (x,y)
lcd.print("PM1.0 = "); // Mensaje de inicio
lcd.print(data.PM_AE_UG_1_0); // Mensaje de inicio
lcd.print(" u/m3"); // Mensaje de inicio
lcd.setCursor(0,2); // coordenadas LCD (x,y)
lcd.print("PM2,5 = "); // Mensaje de inicio
lcd.print(data.PM_AE_UG_2_5); // Mensaje de inicio
lcd.print(" u/m3"); // Mensaje de inicio
lcd.setCursor(0,3); // coordenadas LCD (x,y)
lcd.print("PM10 = "); // Mensaje de inicio
lcd.print(data.PM_AE_UG_10_0); // Mensaje de inicio
lcd.print(" u/m3"); // Mensaje de inicio
}
// Si el archivo no está abierto, aparece un error:
else {
Serial.println("Error al abrir la tarjeta SD");
lcd.setCursor(0,0); // Coordenadas LCD (x = COLUMNA; y = FILA)
lcd.println("NO SE GUARDO");
lcd.setCursor(0,1); // Coordenadas LCD (x = COLUMNA; y = FILA)
lcd.println("LA INFORMACION");
lcd.setCursor(0,2); // Coordenadas LCD (x = COLUMNA; y = FILA)
lcd.print("CON EXITO");
}
delay(3000); //Intervalo de tiempo de toma de lectura
// Do other stuff...
}


