school project

Beste,

Ik moet voor een project luchtkwaliteit bespreken.
Ik was van plan om met arduino een CO2, luchtvochtigheid,TVOC,...... te bepalen.
Ik heb 2programmas waarmee ik alles mee kan doen, maar wil deze op 1 arduino laten werken.
Als ik ze apart installeer werkt dit maar met uren bezig te zijn om deze samen te voegen ben ik ten einde raad.

code1:

#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h> // Deze library zit automatisch in ARDUINO hoef je niets voor te downloaden

SoftwareSerial mySerial(A0, A1); // arduino RX=A0 - TX , arduino TX=A1 -  RX

byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
unsigned char response[9];

unsigned int CO2;

File SensorDataFile; // Object aanmaken waarmee je gaat schrijven lezen

LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
 Serial.begin(9600);
 mySerial.begin(9600);

 lcd.init(); // initialize the lcd
 lcd.init();
 lcd.backlight();
 lcd.begin(20, 4); // LCD heeft 20 kolommen en 4 rijen

 while (!SD.begin()) {
   Serial.println("initialization of sd card failed!");
   return;
 }
 TableHeaderFile();
 delay(2000);
}

void loop() {
 SensorDataFile = SD.open("data2.csv", FILE_WRITE);

 {
   mySerial.write(cmd, 9);
   memset(response, 0, 9);
   mySerial.readBytes(response, 9);
   int i;
   byte crc = 0;
   for (i = 1; i < 8; i++) crc += response[i];
   crc = 255 - crc;
   crc++;

   if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
     Serial.println("CRC error: " + String(crc) + " / " + String(response[8]));
   } else {
     unsigned int responseHigh = (unsigned int) response[2];
     unsigned int responseLow = (unsigned int) response[3];
     unsigned int CO2 = (256 * responseHigh) + responseLow;
     Serial.println("CO2: " + String(CO2) + " ppm");

     lcd.setCursor(0, 0);
     lcd.print("CO2: ");
     lcd.print(CO2);
     lcd.print(" ppm");

     if (SensorDataFile) {
       SensorDataFile.print(CO2);
       SensorDataFile.println();
       SensorDataFile.close(); // Sluit het bestand
     } else {
       // if the file didn't open, print an error:
       Serial.println("error opening data.csv");
     }
     delay(10000);
   }

 }

}




void TableHeaderFile() {
 SensorDataFile = SD.open("data2.csv", FILE_WRITE);
 SensorDataFile.print("C02");
 SensorDataFile.println();
 SensorDataFile.close(); // Sluit het bestand
}

code2:

#include <Adafruit_CCS811.h>
#include <SPI.h> // Deze library zit automatisch in ARDUINO hoef je niets voor te downloaden
#include <SD.h> // Deze library zit automatisch in ARDUINO hoef je niets voor te downloaden
#include <DHT.h>
#include <SDS011.h>
#include <LiquidCrystal_I2C.h>

#define DHTTYPE DHT22   // DHT 22  (AM2302)


int Humidity2 = 2; // nummer van de pin waarop je de sensor aansluit

int interval = 4; // aantal seconden tussen elke uitlezing (in seconden !)

float p10, p25; // Variablen om p10 en p2,5 waarden op te slaan
int err; // nodig om SDS waarden uit te lezen
SDS011 my_sds; // Aanmaken SDS011 sensor


DHT dht(Humidity2, DHTTYPE);
File SensorDataFile; // Object aanmaken waarmee je gaat schrijven lezen
Adafruit_CCS811 ccs; // sensor object definiëren

int CO2, TVOC, analogSensor; //variabelen nodig voor CCs811
float vochtigheid, temperatuur; //variabelen nodig voor DHT22

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line displayLiquidCrystal lcd(12, 13, 8, 9, 10, 11);

void setup() {
 Serial.begin(9600); // nodig om later te schrijven naar de serial monitor (waar de tekst te zien is)
 my_sds.begin(7, 8); // SDS aansluiten op pin 7 & 8
 dht.begin(); // humidity/temperature sensor initializeren

 lcd.init(); // initialize the lcd 
 lcd.init();
 lcd.backlight();
 lcd.begin(20, 4); // LCD heeft 20 kolommen en 4 rijen
 
 if (!ccs.begin()) // initializeer de sensor en kijkt na of alles ok is
 {
   Serial.println("Failed to start CO2 / TVOC sensor! Please check your wiring."); // als we in de if lus terecht komen wil het zeggen dat er dus iets mis is met de sensor of de aansluiting ervan
   while (1)
     ;
 }
 // loop totdat de CO2 / TVOC sensor CCS811 beschikbaar is
 while (!ccs.available())
   ;
 // loop tot SD beschikbaar is
 while (!SD.begin()) {
   Serial.println("initialization of sd card failed!");
   return;
 }
 TableHeaderFile();
 delay(2000);
}

void loop() {
 SensorDataFile = SD.open("data.csv", FILE_WRITE); // schrijf naar bestand met naam in commando

// p2.5 en p10 waarden uitlezen op SDS011
 err = my_sds.read(&p25, &p10); // Lezen van SDS011 waarden via integer err

// temperatuur / vochtigheid DHT22 sensor uitlezen
 vochtigheid = dht.readHumidity();

// Read temperature as Celsius als of vochtigheid of temperatuur een getal is
// isnan = is not a number, || = or
 temperatuur = dht.readTemperature();
 if (isnan(vochtigheid) || isnan(temperatuur)) {
   Serial.println("Failed to read from DHT sensor!");
 }

// CO2 / TVOC CCS811 sensor uitlezen
 if (ccs.available())  // if lus die getriggered wordt zolang dat er data beschikbaar is op de sensor
 {
   if (!ccs.readData()) // de data uitlezen
   {
     CO2 = ccs.geteCO2();
     TVOC = ccs.getTVOC();
   }
   else  // als er iets mis is gelopen met het uitlezen van de data komen we in de else lus terecht en dan printen we "ERROR!"
   {
     Serial.println("Error bij het uitlezen van gas sensor");
   }
 }

 // waarden printen op LCD
// bepaal start positie tekst op LCD, 1ste kolom, 1ste rij     
  lcd.setCursor(0, 0);
  lcd.print(String ("tVOC:")+ String (TVOC)+String("PPB "));
  lcd.print(String ("Hp:")+ String (vochtigheid,0)+String("%"));
// bepaal start positie tekst op LCD, 1ste kolom, 3ste rij
  lcd.setCursor(0, 1);  
  lcd.print(String ("eCO2:")+ String (CO2)+String("PPM "));  
  lcd.print(String("T:"+String (int(temperatuur)))+String("C "));
// bepaal start positie tekst op LCD, 1ste kolom, 4ste rij
  lcd.setCursor(0, 2);
// print p2.5 en p10 waarden van SDS011
  lcd.print(String ("P2.5:")+ String (p25,1));
  lcd.print(String (" , P10:")+ String (p10,1));

  
  
    
 // waarden printen in serial monitor
     // gas sensor
     Serial.print(", CO2: ");
     Serial.print(CO2);
     Serial.print(", ppm, TVOC: ");
     Serial.print(TVOC);
     //temp / hum sensor
     Serial.print(", Humidity: ");
     Serial.print(vochtigheid);
     Serial.print(", Temperature: ");
     Serial.print(temperatuur);
     Serial.print(", P25: ");
     Serial.print(p25);
     Serial.print(", P10: ");
     Serial.println(p10);
     Serial.println();
    
 // alles wegschrijven naar sd kaart
 if (SensorDataFile) {
// CCS811 gas sensor
   SensorDataFile.print(CO2);
   SensorDataFile.print(";");
   SensorDataFile.print(TVOC);
   SensorDataFile.print(";");
// DHT22
   SensorDataFile.print(vochtigheid);
   SensorDataFile.print(";");
   SensorDataFile.print(temperatuur);
   SensorDataFile.print(";");
// SDS011
   SensorDataFile.print(p25);
   SensorDataFile.print(";");
   SensorDataFile.print(p10);
// einde
   SensorDataFile.println();
   SensorDataFile.close(); // Sluit het bestand
 } else {
   // if the file didn't open, print an error:
   Serial.println("error opening data.csv");
 }
 delay(interval * 1000); // ingestelde interval in seconden maal 1000ms
}

void TableHeaderFile() {
 SensorDataFile = SD.open("data.csv", FILE_WRITE);
 SensorDataFile.print("eC02; ");
 SensorDataFile.print("TVOC; ");
 SensorDataFile.print("Humidity; ");
 SensorDataFile.print("Temperature; ");
 SensorDataFile.print("p25; ");
 SensorDataFile.print("p10; ");
 SensorDataFile.println();
 SensorDataFile.close(); // Sluit het bestand
}

alvast bedankt

Plaats je code even in code tags! Het is nu slecht leesbaar, en er lijken fouten in te staan: zie het eind van de regel met for (i = 1; i < 8; i++) crc += response; ! Zo ook in de regel my_sds.begin(7, etc.

erik,

Ik krijg de waardes goed op lcd scherm en op de sd kaart dus zou mij verbazen dat er ergens een fout zou zitten.
het zou wel kunnen dus zal voor zekerheid alles nog is goed nakijken.

Voor CO2 meten gaat TVOC->eCO2 niet echt helpen. Het blijft een "scheetmeter" die CCS811, leuk voor op de toilet.
Wil je CO2 meten, dan kun je bij Adafruit de SCD30 shoppen, heel fijne sensor in gebruik. Meet bovendien met een heel capabele sensor de temperatuur en RLV.

magakyr:
Ik krijg de waardes goed op lcd scherm en op de sd kaart dus zou mij verbazen dat er ergens een fout zou zitten.

Ik schreef dan ook: "er lijken fouten in te staan". Die werden veroorzaakt door het ontbreken van code-tags. Maar dat heb je kennelijk zelf niet gezien? Heb je de voorbeelden die ik gaf wel bekeken?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.