Hi guys,so i want to combine the 2 sensor of PMS 5003 and i encountered some problems. The value of my sumb=0 , but the sum is normal. I will attach the photo and my code.
// On Leonardo/Micro or others with hardware serial, use those!
// uncomment this line:
// #define pmsSerial Serial
// cari indicator semisal sensornya nyala, cek tegangan nang 5v sensor. Lek uwes lek onok tegangan cek komdat.
// Coba pakai TX RX sensor.
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (TX pin on sensor), leave pin #3 disconnected
// comment these two lines if using hardware serial
#include <SoftwareSerial.h>
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
hd44780_I2Cexp lcd;
const int LCD_COLS = 20;
const int LCD_ROWS = 4;
int status;
int sum;
int sumb;
void getText(); void updateLCD();
unsigned char line1[20]; unsigned char line2[20];
unsigned char line3[20]; unsigned char line4[20];
SoftwareSerial pmsSerial(10, 3); // outlet
SoftwareSerial pmsSerial2(11, 3); // inlet
void setup() {
// our debugging output
Serial.begin(115200);
lcd.begin(20, 4);
// sensor baud rate is 9600
pmsSerial.begin(9600);
int sum();
int sumb();
}
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;
uint16_t framelenb;
uint16_t pm10_standardb, pm25_standardb, pm100_standardb;
uint16_t pm10_envb, pm25_envb, pm100_envb;
uint16_t particles_03umb, particles_05umb, particles_10umb, particles_25umb, particles_50umb, particles_100umb;
uint16_t unusedb;
uint16_t checksumb;
};
struct pms5003data data;
void loop() {
if (readPMSdata(&pmsSerial)||readPMSdata(&pmsSerial2)) {
// reading data was successful
// Coba pakai serial print bisa bisa untuk menguji if nya apakah terpenuhi atau ngak
sum = data.particles_03um + data.particles_05um + data.particles_10um + data.particles_25um + data.particles_50um + data.particles_100um;
sumb = data.particles_03umb + data.particles_05umb + data.particles_10umb + data.particles_25umb + data.particles_50umb + data.particles_100umb;
Serial.print("Sum"); Serial.println(sum);
Serial.print("Sumb"); Serial.println(sumb);
lcd.clear();
lcd.setCursor(0, 1); //First line
lcd.print("After ESP = ");
lcd.print(sum);
//lcd.setCursor(0, 3); //Second line
//lcd.print("Before ESP= ");
//lcd.print(sumb);
}
}
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;
uint16_t sumb = 0;
s->readBytes(buffer, 32);
// get checksum ready
for (uint8_t i = 0; i < 30; i++) {
sum += buffer[i];
sumb += 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) {
lcd.print("Checksum failure ");
return false;
}
return true;
}