Conectar un PM5003 a un arduino mega

Hola, un saludo a todos, estoy haciendo un proyecto con Arduino sobre un medidor de partículas PM. El punto es que con ´´Arduino Uno´´ me funciona y me lee datos pero al pasar a un ´´Arduino Mega 2560´´ no me lee los datos en el monitor serie. Necesito utilizar el ´´Arduino Mega´´ para este proyecto.
Aquí les dejo el programa por si me pueden ayudar.

#include <PMS.h>
#include <SoftwareSerial.h>

SoftwareSerial pmsSerial(2, 3);

void setup() {
 // our debugging output
 Serial.begin(115200);
 // sensor baud rate is 9600
 pmsSerial.begin(9600);
}
struct pms5003data {
 uint16_t framelen;
 uint16_t pm10_standard, pm25_standard, pm100_standard;
 uint16_t pm10_env, pm25_env, pm100_env;
 uint16_t particles_03um, particles_05um, particles_10um, particles_25um, particles_50um,
particles_100um;
 uint16_t unused;
 uint16_t checksum;
};
struct pms5003data data;
void loop() {
 if (readPMSdata(&pmsSerial)) {
 // reading data was successful!
 Serial.println();
 Serial.println("---------------------------------------");
 Serial.println("Concentration Units (standard)");
 Serial.print("PM 1.0: "); Serial.print(data.pm10_standard);
 Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_standard);
 Serial.print("\t\tPM 10: "); Serial.println(data.pm100_standard);
 Serial.println("---------------------------------------");
 Serial.println("Concentration Units (environmental)");
 Serial.print("PM 1.0: "); Serial.print(data.pm10_env);
 Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_env);
 Serial.print("\t\tPM 10: "); Serial.println(data.pm100_env);
 Serial.println("---------------------------------------");
 Serial.print("Particles > 0.3um / 0.1L air:"); Serial.println(data.particles_03um);
 Serial.print("Particles > 0.5um / 0.1L air:"); Serial.println(data.particles_05um);
 Serial.print("Particles > 1.0um / 0.1L air:"); Serial.println(data.particles_10um);
 Serial.print("Particles > 2.5um / 0.1L air:"); Serial.println(data.particles_25um);
 Serial.print("Particles > 5.0um / 0.1L air:"); Serial.println(data.particles_50um);
 Serial.print("Particles > 10.0 um / 0.1L air:"); Serial.println(data.particles_100um);
 Serial.println("---------------------------------------");
 }
}
boolean readPMSdata(Stream *s) {
 if (! s->available()) {
 return false;
 }
 // Read a byte at a time until we get to the special '0x42' start-byte
 if (s->peek() != 0x42) {
 s->read();
 return false;
 }
 // Now read all 32 bytes
 if (s->available() < 32) {
 return false;
 }

 uint8_t buffer[32];
 uint16_t sum = 0;
 s->readBytes(buffer, 32);
 // get checksum ready
 for (uint8_t i=0; i<30; i++) {
 sum += buffer[i];
 }
 /* debugging
 for (uint8_t i=2; i<32; i++) {
 Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
 }
 Serial.println();
 */
 // The data comes in endian'd, this solves it so it works on all platforms
 uint16_t buffer_u16[15];
 for (uint8_t i=0; i<15; i++) {
 buffer_u16[i] = buffer[2 + i*2 + 1];
 buffer_u16[i] += (buffer[2 + i*2] << 8);
 }
 // put it into a nice struct
 memcpy((void *)&data, (void *)buffer_u16, 30);
 if (sum != data.checksum) {
 Serial.println("Checksum failure");
 return false;
 }
 // success!
 return true;
}

Muchas gracias por su tiempo y tengan feliz día.

1 Like

Ya preguntaste por lo mismo en otro hilo. No hagas posteos cruzados mi amigo. Ya te respondí en el otro hilo que el MEGA tiene 4 puertos series y que no necesitas definir un puerto Virtual usando SoftwareSerial.
Eso es para el UNO.
El MEGA tiene sus extra 3 puertos. Lee el otro hilo.

Siento las molestias señor @Surbyte pero el punto es que no entiendo como programarlo y hacerlo funcionar, intento lo que usted me dice pero no consigo leer los datos en el monitor serie, siento las molestias de verdad.

Hola, conseguí arreglar el programa. Lo dejo por aquí por si alguien le interesa en un futuro.

#include <PMS.h>


void setup() {
 // our debugging output
 Serial.begin(115200);
 Serial2.begin(9600);
}
struct pms5003data {
 uint16_t framelen;
 uint16_t pm10_standard, pm25_standard, pm100_standard;
 uint16_t pm10_env, pm25_env, pm100_env;
 uint16_t particles_03um, particles_05um, particles_10um, particles_25um, particles_50um,
particles_100um;
 uint16_t unused;
 uint16_t checksum;
};
struct pms5003data data;
void loop() {
 if (readPMSdata(&Serial2)) {
 // reading data was successful!
 Serial.println();
 Serial.println("---------------------------------------");
 Serial.println("Concentration Units (standard)");
 Serial.print("PM 1.0: "); Serial.print(data.pm10_standard);
 Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_standard);
 Serial.print("\t\tPM 10: "); Serial.println(data.pm100_standard);
 Serial.println("---------------------------------------");
 Serial.println("Concentration Units (environmental)");
 Serial.print("PM 1.0: "); Serial.print(data.pm10_env);
 Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_env);
 Serial.print("\t\tPM 10: "); Serial.println(data.pm100_env);
 Serial.println("---------------------------------------");
 Serial.print("Particles > 0.3um / 0.1L air:"); Serial.println(data.particles_03um);
 Serial.print("Particles > 0.5um / 0.1L air:"); Serial.println(data.particles_05um);
 Serial.print("Particles > 1.0um / 0.1L air:"); Serial.println(data.particles_10um);
 Serial.print("Particles > 2.5um / 0.1L air:"); Serial.println(data.particles_25um);
 Serial.print("Particles > 5.0um / 0.1L air:"); Serial.println(data.particles_50um);
 Serial.print("Particles > 10.0 um / 0.1L air:"); Serial.println(data.particles_100um);
 Serial.println("---------------------------------------");
 }
}
boolean readPMSdata(Stream *s) {
 if (! s->available()) {
 return false;
 }
 // Read a byte at a time until we get to the special '0x42' start-byte
 if (s->peek() != 0x42) {
 s->read();
 return false;
 }
 // Now read all 32 bytes
 if (s->available() < 32) {
 return false;
 }

 uint8_t buffer[32];
 uint16_t sum = 0;
 s->readBytes(buffer, 32);
 // get checksum ready
 for (uint8_t i=0; i<30; i++) {
 sum += buffer[i];
 }
 /* debugging
 for (uint8_t i=2; i<32; i++) {
 Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
 }
 Serial.println();
 */
 // The data comes in endian'd, this solves it so it works on all platforms
 uint16_t buffer_u16[15];
 for (uint8_t i=0; i<15; i++) {
 buffer_u16[i] = buffer[2 + i*2 + 1];
 buffer_u16[i] += (buffer[2 + i*2] << 8);
 }
 // put it into a nice struct
 memcpy((void *)&data, (void *)buffer_u16, 30);
 if (sum != data.checksum) {
 Serial.println("Checksum failure");
 return false;
 }
 // success!
 return true;
}

Muchas gracias al señor @Surbyte que después de tanto releer lo entendí.

1 Like