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
}
}