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