Go Down

Topic: Writing data from 2 sensors to sd card (Read 722 times) previous topic - next topic


Hi, I'm trying to write the data from Plantower PMS5003 dust sensor and DHT11 temperature and humidity sensor. But I am unable to write it continuously. The dust sensor data is missing in the middle. Please, someone, help Output showing some error.
My program and out are as follows.

#include <SoftwareSerial.h>
#include <SPI.h>                        //Serial library for SD card shield
#include <SD.h>                         //SD card library
#include <RTClib.h>
#include <Wire.h>
#include "DHT.h"
#define DHTPIN 3
#define DHTTYPE DHT22

SoftwareSerial pmsSerial(2, 3);
const int chipSelect = 10;               //chip select on digital 4 for SD card shield
RTC_DS1307 rtc;
char buf1[20];

void setup() {

  Serial.begin(115200);                   //begin serial comms
  while (!Serial) {
    ;                                   // wait for serial port to connect. Needed for native USB port only


  Serial.print("Initializing SD card...");

                                        // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
  Serial.println("card initialized.");

    pmsSerial.begin(9600);                      //begin the pms sensor
   // dataFile.print("Date&Time\t\tP.M1.0(S)\t\tP.M2.5(S)\t\tP.M10.0(S)\t\tP.M1.0(E)\t\tP.M2.5(E)\t\tP.M10.0(E)"));

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() {
  // reading data was successful!
 File dataFile = SD.open("datalog.txt", FILE_WRITE);
 if (dataFile)
if (readPMSdata(&pmsSerial)) {

  DateTime now = rtc.now();

  sprintf(buf1, "%02d:%02d:%02d %02d/%02d/%02d",  now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year()); 

    dataFile.print(F("Date/Time:\t "));
    dataFile.print("\t"); dataFile.print(data.pm25_standard);
    dataFile.print("\t"); dataFile.print(data.pm100_standard);
    dataFile.print("\t"); dataFile.print(data.pm10_env);
    dataFile.print("\t"); dataFile.print(data.pm25_env);
    dataFile.print("\t"); dataFile.print(data.pm100_env);
    dataFile.print("\t"); dataFile.print(data.particles_03um+1);
    dataFile.print("\t"); dataFile.print(data.particles_05um);
    dataFile.print("\t"); dataFile.print(data.particles_10um);
    dataFile.print("\t"); dataFile.print(data.particles_25um);
    dataFile.print("\t"); dataFile.print(data.particles_50um);
    dataFile.print("\t"); dataFile.print(data.particles_100um);
 else {
    dataFile.println("error opening datalog.txt");

//***************************PMS5003 END & DHT BEGIN *****************
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  //dataFile.print("Humidity: ");
  dataFile.print(" %\t");
  //dataFile.print("Temperature %\t: ");
  dataFile.print(" *C ");
  //dataFile.print(" *F\t");
  //dataFile.print("Heat index: ");
  dataFile.print(" *C ");
  //dataFile.println(" *F");


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) {
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;

/* debugging
for (uint8_t i=2; i<32; i++) {
Serial.print("0x"); Serial.print(buffer, HEX); Serial.print(", ");
© Adafruit Industries https://learn.adafruit.com/pm25-air-quality-sensor Page 6 of 12
You'll see data printed out once a second, with all the measurements. For a clean-air indoor room you'll see something
like this:
If you hold up a smoking soldering iron or something else that creates a lot of dust, you'll see much higher numbers!
// 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 = buffer[2 + i*2 + 1];
buffer_u16 += (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;


And now edit in the code tags please.
"Pete, it's a fool (who) looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.
I speak for myself, not Arduino.

Go Up