Hi!
i am working with an arduino mega2560 board and several sensors (gps, pm10, microphone, accelerometer..).
This is the code that manages all the sensors, which have to work at the same time and have to write to a csv file on a sd card:
#include <Wire.h>
#include <MPU6050_tockn.h>
#include <SoftwareSerial.h>
#include <SdsDustSensor.h>
#include <SPI.h>
#include <SD.h>
#include <TinyGPS.h>
//variabili per sensore CO2,NH3,NO2
const int S_analog = 1023.0;
int co, nh3;
float no2;
//variabili per sensore accelerometro/giroscopio
const int MPU = 0x68; // I2C address of the MPU-6050
float AccX, AccY, AccZ, Tmp, AngX, AngY, AngZ;
MPU6050 mpu6050(Wire);
unsigned long t1, dt;
//variabili per senosre GPS
float lat,lon;
TinyGPS gps; // create gps object
//variabili per sensore PM10 PM2.5
int rxPin = 16;
int txPin = 17;
SdsDustSensor sds(Serial2);
//variabili per SD Card
File file;
const int chipSelect = 53;
int i = 0;
void setup() {
Serial.begin(9600); // comune a tutti
// acc/giroscopio
Wire.begin();
mpu6050.begin();
//fase di calibrazione per il giroscopio
mpu6050.calcGyroOffsets(true);
// gps
Serial.println("The GPS Received Signal:");
Serial1.begin(9600); // connect gps sensor
// pm10 pm2.5
sds.begin();
Serial2.begin(9600);
// sd card
}
void loop() {
MICS6814();
Accelerometro_Giroscopio();
GPS();
PM10_PM25();
SD_Card();
}
void MICS6814() {
co = map (analogRead(A2), 0, S_analog, 1, 1000); //monossido di carbonio
nh3 = map (analogRead(A1), 0, S_analog, 1, 500); //ammoniaca
no2 = map (analogRead(A0), 0, S_analog, 5, 1000) / 100.0; //diossido di azoto
//stampo i dati sul monossido di carbonio registrato
//Serial.print("CO: ");
Serial.print(co);
Serial.print(",");
//Serial.print(" ppm\t ");
//stampo i dati sull'ammoniaca registrata
//Serial.print("NH3: ");
Serial.print(nh3);
Serial.print(",");
//Serial.print(" ppm\t ");
//stampo i dati sul diossido di azoto registrato
//Serial.print("NO2: ");
Serial.print(no2);
//Serial.print(",");
Serial.println("");
//Serial.print(" ppm\n");
delay(1000);
}
void Accelerometro_Giroscopio() {
mpu6050.update();
dt = millis() - t1;
if(dt > 200){
t1= millis();
AccX = mpu6050.getAccX();
AccY = mpu6050.getAccY();
AccZ = mpu6050.getAccZ();
// angoli calcolati dal sw interno del sensore, non sono direttamente quelli misurati dal sensore
AngX = mpu6050.getAngleX();
//Serial.println(AngX);
AngY = mpu6050.getAngleY();
//Serial.println(AngY);
AngZ = mpu6050.getAngleZ();
//Serial.println(AngZ);
}
delay(333);
}
void GPS() {
Serial.println(Serial1.read());
while(Serial1.available()){ // check for gps data
//Serial.print("A");
if(gps.encode(Serial1.read()))// encode gps data
{
//Serial.print("B");
gps.f_get_position(&lat,&lon); // get latitude and longitude
//Latitude
Serial.print("Latitude: ");
Serial.print(lat,6);
Serial.print(",");
//Longitude
Serial.print("Longitude: ");
Serial.println(lon,6);
}
}
//delay(500);
}
void PM10_PM25() {
PmResult pm = sds.readPm();
if (pm.isOk()) {
// stampo PM2.5
Serial.print("PM2.5 = ");
Serial.print(pm.pm25);
//stampo PM10
Serial.print(" PM10 = \n");
Serial.print(pm.pm10);
Serial.print("\n");
}
delay(500);
}
void SD_Card() {
if(!SD.begin(chipSelect)){
Serial.println("Errore");
return;
}
/*if(SD.exists("example1.txt")){
SD.remove("example1.txt");
}*/
PmResult pm = sds.readPm();
String dataString = "";
file = SD.open("datalog.csv", FILE_WRITE);
//dataString = "";
dataString += no2;
dataString += ";";
dataString += nh3;
dataString += ";";
dataString += co;
dataString += ";";
dataString += pm.pm10;
dataString += ";";
dataString += pm.pm25;
dataString += ";";
dataString += lat;
dataString += ";";
dataString += lon;
dataString += ";";
dataString += AccX;
dataString += ";";
dataString += AccY;
dataString += ";";
dataString += AccZ;
dataString += ";";
dataString += AngX;
dataString += ";";
dataString += AngY;
dataString += ";";
dataString += AngZ;
//dataString += ";";
if (file) {
file.println(dataString);
file.close();
// print to the serial port too:
Serial.println(dataString);
//dataString = "";
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}
my problem is that when all the sensors go, the gps doesn't write anything neither to the csv file, nor to the console. If instead I try to run only the gps, it writes without any problems.
can you help me?
thank you very much.