Skip to main content

I'm reading data from the Shinyei PPD42 particle sensor unit. 
Everything seems to work, but I'm encountering two problems

https://pastebin.com/tpcN5ewu

#include <SPI.h>  //een bibliotheek aan code toevoegen; Arduino heeft deze nodig om de Shield te kunnen 'lezen'
#include <SD.h>   //zie hierboven

int PM=8; //de fijnstofmeter zit in digitaal poortnummer 8

const int chipSelect = 10; //const = een variabele die nooit verandert

unsigned long sampletime_ms = 30000;  //unsigned long = een variabele die erg hoog kan oplopen, maar nooit negatief kan zijn

//hieronder volgen nog enkele variabelen. Denk eraan: float betekent dat het decimale getallen kunnen zijn

unsigned long duration; 
unsigned long starttime;
unsigned long lowpulseoccupancy = 0;
unsigned long timediff;
float ratio = 0;
float concentration = 0;
unsigned long tijd = 30;

//void setup wordt één keer uitgevoerd, bij het opstarten van de Arduino-minicomputer

void setup()
  {
    Serial.begin(9600); //de snelheid (in bits/second) aan welke de seriële data zal worden getransfereerd
    pinMode(PM,INPUT);  /*PM is de variabele van helemaal bovenaan: pinMode vraagt twee parameters 1)de poort (werd gedefinieerd bovenaan) 2)INPUT of OUTPUT 
                          Ditmaal leest de fijnstofmeter gegevens die we vervolgens IN onze Arduino willen importeren, dus INPUT*/

    starttime = millis(); //hoelang draait het programma? millis() geeft de duur sinds het werd opgestart
    
    Serial.println("SD-kaart opstarten indien aanwezig... "); //Je schrijft nu neer dat de SD-kaart wordt gezocht en opgestart (println = hierna op volgende regel verder gaan)
    
    //hieronder staat een 'als'-lus: als aan de eerste voorwaarde wordt voldaan, voert hij uit wat eronder staat, anders gaat Arduino verder achter de afsluitende accolade
    
    if (!SD.begin(chipSelect)) //Als er NIET (!) kan worden begonnen met de SD-kaart te selecteren ...
      {
        Serial.println("Corrupte of ontbrekende SD-kaart!"); //dan wordt deze boodschap getoond 
        return;
      }
    //Als de SD-kaart dus WEL werkt, gaan we hieronder verder
    
    Serial.println("SD-kaart werkt...");
    Serial.print("Fijnstofsensor start op. Even geduld! Metingen om de 30 seconden.");
    Serial.println("\n");
  }

//void setup wordt oneindig lang uitgevoerd, tenzij je dat anders bepaalt

void loop ()
  {
    duration = pulseIn(PM, LOW); //als de fijnstofdetector niet meet (LOW), beginnen meten
    lowpulseoccupancy = lowpulseoccupancy+duration; //na elke meting de 'duration' (30 sec)  optellen bij de totale tijd
  
    if ((millis()-starttime) >= sampletime_ms)
      {
        //hieronder de wiskundige berekeningen om het fijnstofgehalte te berekenen
        
        ratio = lowpulseoccupancy/(sampletime_ms*10.0);
        concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; 

        //hieronder alles wat zal worden geprint naar het seriële venster
        
        Serial.print("Fijnstofconcentratie na ");
        Serial.print(tijd);
        Serial.println(" seconden:");
        Serial.print(concentration);
        Serial.println(" deeltjes/0,01cf");
        Serial.print("\n");
    
        File dataFile = SD.open("test.txt", FILE_WRITE); //het bestand meting.txt moet op de SD-kaart worden geopend om erin te schrijven
  
        if (dataFile) //als het bestand kan worden geopend, volgende gegevens printen
          {
            dataFile.print("Fijnstofconcentratie na ");
            dataFile.print(tijd);
            dataFile.print(" seconden: ");
            //dataFile.println(ratio);
            dataFile.print(concentration);
            dataFile.print(" deeltjes/0,01cf");
            dataFile.print("\n");
            dataFile.close();
          }
        
        else //als het bestand niet kan worden geopend ...
          {
            Serial.println("Fout bij het openen van test.txt");
          }
          
        tijd = tijd + 30; //meting afgerond, totale tijd = +30 seconden
        lowpulseoccupancy = 0; //de status van de fijnstofmeter is terug 'LOW'
        starttime  = millis(); //volgende meting starten
      }
  }

I'm reading data from the Shinyei PPD42 particle sensor unit. Everything seems to work, but I'm encountering two problems

https://pastebin.com/tpcN5ewu

I'm reading data from the Shinyei PPD42 particle sensor unit. 
Everything seems to work, but I'm encountering two problems

#include <SPI.h>  //een bibliotheek aan code toevoegen; Arduino heeft deze nodig om de Shield te kunnen 'lezen'
#include <SD.h>   //zie hierboven

int PM=8; //de fijnstofmeter zit in digitaal poortnummer 8

const int chipSelect = 10; //const = een variabele die nooit verandert

unsigned long sampletime_ms = 30000;  //unsigned long = een variabele die erg hoog kan oplopen, maar nooit negatief kan zijn

//hieronder volgen nog enkele variabelen. Denk eraan: float betekent dat het decimale getallen kunnen zijn

unsigned long duration; 
unsigned long starttime;
unsigned long lowpulseoccupancy = 0;
unsigned long timediff;
float ratio = 0;
float concentration = 0;
unsigned long tijd = 30;

//void setup wordt één keer uitgevoerd, bij het opstarten van de Arduino-minicomputer

void setup()
  {
    Serial.begin(9600); //de snelheid (in bits/second) aan welke de seriële data zal worden getransfereerd
    pinMode(PM,INPUT);  /*PM is de variabele van helemaal bovenaan: pinMode vraagt twee parameters 1)de poort (werd gedefinieerd bovenaan) 2)INPUT of OUTPUT 
                          Ditmaal leest de fijnstofmeter gegevens die we vervolgens IN onze Arduino willen importeren, dus INPUT*/

    starttime = millis(); //hoelang draait het programma? millis() geeft de duur sinds het werd opgestart
    
    Serial.println("SD-kaart opstarten indien aanwezig... "); //Je schrijft nu neer dat de SD-kaart wordt gezocht en opgestart (println = hierna op volgende regel verder gaan)
    
    //hieronder staat een 'als'-lus: als aan de eerste voorwaarde wordt voldaan, voert hij uit wat eronder staat, anders gaat Arduino verder achter de afsluitende accolade
    
    if (!SD.begin(chipSelect)) //Als er NIET (!) kan worden begonnen met de SD-kaart te selecteren ...
      {
        Serial.println("Corrupte of ontbrekende SD-kaart!"); //dan wordt deze boodschap getoond 
        return;
      }
    //Als de SD-kaart dus WEL werkt, gaan we hieronder verder
    
    Serial.println("SD-kaart werkt...");
    Serial.print("Fijnstofsensor start op. Even geduld! Metingen om de 30 seconden.");
    Serial.println("\n");
  }

//void setup wordt oneindig lang uitgevoerd, tenzij je dat anders bepaalt

void loop ()
  {
    duration = pulseIn(PM, LOW); //als de fijnstofdetector niet meet (LOW), beginnen meten
    lowpulseoccupancy = lowpulseoccupancy+duration; //na elke meting de 'duration' (30 sec)  optellen bij de totale tijd
  
    if ((millis()-starttime) >= sampletime_ms)
      {
        //hieronder de wiskundige berekeningen om het fijnstofgehalte te berekenen
        
        ratio = lowpulseoccupancy/(sampletime_ms*10.0);
        concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; 

        //hieronder alles wat zal worden geprint naar het seriële venster
        
        Serial.print("Fijnstofconcentratie na ");
        Serial.print(tijd);
        Serial.println(" seconden:");
        Serial.print(concentration);
        Serial.println(" deeltjes/0,01cf");
        Serial.print("\n");
    
        File dataFile = SD.open("test.txt", FILE_WRITE); //het bestand meting.txt moet op de SD-kaart worden geopend om erin te schrijven
  
        if (dataFile) //als het bestand kan worden geopend, volgende gegevens printen
          {
            dataFile.print("Fijnstofconcentratie na ");
            dataFile.print(tijd);
            dataFile.print(" seconden: ");
            //dataFile.println(ratio);
            dataFile.print(concentration);
            dataFile.print(" deeltjes/0,01cf");
            dataFile.print("\n");
            dataFile.close();
          }
        
        else //als het bestand niet kan worden geopend ...
          {
            Serial.println("Fout bij het openen van test.txt");
          }
          
        tijd = tijd + 30; //meting afgerond, totale tijd = +30 seconden
        lowpulseoccupancy = 0; //de status van de fijnstofmeter is terug 'LOW'
        starttime  = millis(); //volgende meting starten
      }
  }
Source Link
Michael
  • 13
  • 1
  • 4

Adding data to an SD card file

I'm reading data from the Shinyei PPD42 particle sensor unit. Everything seems to work, but I'm encountering two problems

  1. When I restart Arduino, the file is not being extended, nor overwritten. It just remains how it was before.

  2. Even though my code looks fine, Arduino stops writing data to the SD card after 90 seconds.

Thanks for having a look at my code.

https://pastebin.com/tpcN5ewu