Hey all,
I'm creating an air quality sensor and I'm running out of dynamic memory. I'm trying to write the data to an SD card but the library is too large and I haven't been able to find a good replacement. Here is the code I have. It runs out of memory before even adding the code to write to the SD card. I am using an uno for the testing but would like to use a nano for the final product.
#include "s8_uart.h"
#include "SparkFun_SGP30_Arduino_Library.h"
#include <Wire.h>
#include "SHT31.h"
#include <SPI.h>
#include <SD.h>
#include "Adafruit_PM25AQI.h"
#include <SoftwareSerial.h>
#include <AltSoftSerial.h>
//CO2
SoftwareSerial S8_serial(7, 6);
S8_UART *sensor_S8;
S8_sensor sensor;
//TVOC
SGP30 tvoc;
//Temp and Humidity
SHT31 temp;
//PM
AltSoftSerial pmSerial(9, 8);
Adafruit_PM25AQI aqi = Adafruit_PM25AQI();
//SD
File myFile;
void setup() {
// Configure serial port
Serial.begin(115200);
Wire.begin();
//Initialize CO2 sensor
S8_serial.begin(S8_BAUDRATE);
sensor_S8 = new S8_UART(S8_serial);
// Check if S8 is available
sensor_S8->get_firmware_version(sensor.firm_version);
int len = strlen(sensor.firm_version);
if (len == 0) {
Serial.println(F("SenseAir S8 CO2 sensor not found!"));
while (1) {
delay(1);
};
}
Serial.println(F("CO2 Connected"));
//sensor_S8->manual_calibration();
//Initialize PM sensor
pmSerial.begin(9600);
if (! aqi.begin_UART(&pmSerial)) {
Serial.println(F("Could not find PM 2.5 sensor!"));
while (1) delay(10);
}
Serial.println(F("PM Connected"));
//Initialize TVOC sensor
if (!tvoc.begin()) {
Serial.println(F("No SGP30 Detected. Check connections."));
while (1);
}
tvoc.initAirQuality();
Serial.println(F("TVOC Connected"));
temp.begin(0x44);
Wire.setClock(100000);
uint16_t tempHumid = temp.readStatus();
Serial.println(F("Temp and Humidity Connected"));
Serial.print(F("Initializing SD card..."));
if (!SD.begin(4)) {
Serial.println(F("initialization failed!"));
return;
}
Serial.println(F("initialization done."));
Serial.println(F("Warming up sensors..."));
delay(15000); //Time for sensors to warp up
Serial.flush();
}
void loop() {
//CO2
sensor.co2 = sensor_S8->get_co2();
Serial.print(F("CO2: "));
Serial.print(sensor.co2);
Serial.println(F(" ppm"));
Serial.flush();
//Temp and Humidity
temp.read();
Serial.print(F("Temperature: "));
Serial.print(temp.getTemperature());
Serial.println(F(" C"));
Serial.flush();
Serial.print(F("Humidity: "));
Serial.print(temp.getHumidity());
Serial.println(F(" %"));
Serial.flush();
//TVOC
tvoc.measureAirQuality();
Serial.print(F("TVOC: "));
Serial.print(tvoc.TVOC);
Serial.println(F(" ppb"));
Serial.flush();
//PM
PM25_AQI_Data data;
if (!aqi.read(&data)) {
Serial.println("Could not read from PM sensor");
} else {
Serial.print(F("PM 1.0: "));
Serial.println(data.pm10_standard);
Serial.print(F("PM 2.5: "));
Serial.println(data.pm25_standard);
Serial.print(F("PM 10: "));
Serial.println(data.pm100_standard);
}
Serial.flush();
Serial.print(F("---------------------------------------"));
Serial.println(F(""));
delay(5000);
}


