Sorry for my bad english before, so i'm trying to make a voltage data logger with some environment parameters. I've done the program without data logging, all parameters appear well in serial monitor.
But, i have problem when i'm trying to write all parameters to SD card. that nothing appear in serial monitor and after I check the SD card, there nothing txt file.
Data logging shiled is work well, because i've test the RTC and SD card writing example, it's work well.
The code below is the comparisson from many codes, so i guess my problem is in the program not in the hardware..
FYI: i am newbie in arduino project, so I'm still not understand well about arduino, especially in IDE program
I'm very grateful if somebody help my issues..
Here's my devices i used:
- arduino mega rev.3
- datalogger shield
- sht20 i2c sensor
- zmpt101b sensor (4pcs)
- pms7003 sensor
- bh1750 sensor
Here is the code with data logging:
#include <DS1307RTC.h>
#include <TimeLib.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <BH1750.h>
#include <DFRobot_SHT20.h>
#include <Plantower_PMS7003.h>
#include <Filters.h>
File myFile;
const int chihpselect = 53;
String time;
tmElements_t tm;
DFRobot_SHT20 sht20;
BH1750 lightMeter;
char output[256];
Plantower_PMS7003 pms7003 = Plantower_PMS7003();
float testFrequency = 50; // test signal frequency (Hz)
float windowLength = 45.0/testFrequency; // how long to average the signal, for statistist
int Sensor1 = 0; //Sensor analog input, here it's A0
int Sensor2 = 1;
int Sensor3 = 2;
int Sensor4 = 3;
float intercept1 = -0.04; // to be adjusted based on calibration testing
float intercept2 = -0.04;
float intercept3 = -0.04;
float intercept4 = -0.04;
float slope1 = 0.0405; // to be adjusted based on calibration testing
float slope2 = 0.0405;
float slope3 = 0.0405;
float slope4 = 0.0405;
float current_Volts1; // Voltage
float current_Volts2;
float current_Volts3;
float current_Volts4;
unsigned long printPeriod = 1000; //Refresh rate
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
while (!Serial); //pms7003
delay(200);
pms7003.init(&Serial1);
Wire.begin(9600); //bh1750
lightMeter.begin();
sht20.initSHT20(); //sht20
delay(2000);
}
void loop() {
pms7003.updateFrame();
if(pms7003.hasNewData()) {
Serial.print(output);
sprintf(output,"\nPM2.5: %2d ug/m3", pms7003.getPM_2_5());
float lux = lightMeter.readLightLevel(true);
float humd = sht20.readHumidity()- 0.3;
float temp = sht20.readTemperature()+ 0.3;
Serial.print("\nLight: ");
Serial.print(lux);
Serial.println(" lx");
Serial.print("Temperature:");
Serial.print(temp, 1);
Serial.print(" C");
Serial.println();
Serial.print("Humidity:");
Serial.print(humd, 1);
Serial.print(" %");
Serial.print("\n");
RunningStatistics inputStats1; //Easy life lines, actual calculation of the RMS requires a load of coding
RunningStatistics inputStats2;
RunningStatistics inputStats3;
RunningStatistics inputStats4;
inputStats1.setWindowSecs( windowLength );
inputStats2.setWindowSecs( windowLength );
inputStats3.setWindowSecs( windowLength );
inputStats4.setWindowSecs( windowLength );
Sensor1 = analogRead(A0); // read the analog in value:
Sensor2 = analogRead(A1);
Sensor3 = analogRead(A0);
Sensor4 = analogRead(A1);
inputStats1.input(Sensor1); // log to Stats function
inputStats2.input(Sensor2);
inputStats3.input(Sensor3);
inputStats4.input(Sensor4);
if((unsigned long)(millis() - previousMillis) >= printPeriod) {
previousMillis = millis(); // update time every second
current_Volts1 = intercept1 + slope1 * inputStats1.sigma(); //Calibartions for offset and amplitude
current_Volts1= current_Volts1*(50.3231); //50.3231 Further calibrations for the amplitude
Serial.print( "Voltage1: " );
Serial.print( current_Volts1 ); //Calculation and Value display is done the rest is if you're using an OLED display
Serial.print("\n");
}{
previousMillis = millis(); // update time every second
current_Volts2 = intercept2 + slope2 * inputStats2.sigma(); //Calibartions for offset and amplitude
current_Volts2= current_Volts2*(50.3231); //50.3231 Further calibrations for the amplitude
Serial.print( "Voltage2: " );
Serial.print( current_Volts2 ); //Calculation and Value display is done the rest is if you're using an OLED display
Serial.print("\n");
}{
previousMillis = millis(); // update time every second
current_Volts3 = intercept3 + slope3 * inputStats3.sigma(); //Calibartions for offset and amplitude
current_Volts3= current_Volts3*(50.3231); //50.3231 Further calibrations for the amplitude
Serial.print( "Voltage3: " );
Serial.print( current_Volts3 ); //Calculation and Value display is done the rest is if you're using an OLED display
Serial.print("\n");
}{
previousMillis = millis(); // update time every second
current_Volts4 = intercept4 + slope4 * inputStats4.sigma(); //Calibartions for offset and amplitude
current_Volts4= current_Volts4*(50.3231); //50.3231 Further calibrations for the amplitude
Serial.print( "Voltage4: " );
Serial.print( current_Volts4 ); //Calculation and Value display is done the rest is if you're using an OLED display
Serial.print("\n");
}
delay(3000);}
}
void ReadText(){
// re-open the file for reading:
myFile = SD.open("LoggerCD.txt");
if (myFile) {
Serial.println("LoggerCD.txt");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
}
else {
// if the file didn't open, print an error:
Serial.println("error opening LoggerCD.txt");
}
}
String Now(){
String time = "";
if (RTC.read(tm)) {
// time = String(tm.Hour+":"+tm.Minute+":"+tm.Secnd+" DAY : "+tm.Day+"/"+tm.Month+"/"+tmYearToCalendar(tm.Year));
time+=tm.Hour;
time+=":";
time+=tm.Minute;
time+=":";
time+=tm.Second;
time+=" DAY : ";
time+=tm.Day;
time+="/";
time+=tm.Month;
time+="/";
time+=tmYearToCalendar(tm.Year);
}
else {
time = "NO";
if (RTC.chipPresent()) {
Serial.println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
}
else {
Serial.println("DS1307 read error! Please check the circuitry.");
Serial.println();
}
}
return time;
}
void Write_SDcard() {
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File myFile = SD.open("LoggerCD.txt", FILE_WRITE);
// if the file is available, write to it:
if (myFile) {
myFile.print(RTC.read(tm)); //Store date on SD card
myFile.print(","); //Move to next column using a ","
myFile.print(current_Volts1); //Store date on SD card
myFile.print(","); //Move to next column using a ","
myFile.print(sht20.readTemperature()); //Store date on SD card
myFile.print(","); //Move to next column using a ","
myFile.print(sht20.readHumidity()); //Store date on SD card
myFile.print(","); //Move to next column using a ","
myFile.print(lightMeter.readLightLevel(true)); //Store date on SD card
myFile.print(","); //Move to next column using a ","
myFile.print(pms7003.getPM_2_5()); //Store date on SD card
myFile.print(","); //Move to next column using a ","
myFile.println(); //End of Row move to next row
myFile.close(); //Close the file
}
else
Serial.println("OOPS!! SD card writing failed");
}
both code with and without data logger files i'm attached below.
with_datlog.txt (7.04 KB)
without_datlog.txt (4.79 KB)