Hello everyone,
My project code:
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"
//Indications:
int function_ok = 5; // green LED
int function_nok = 6; // red LED
int fault_detect = 7; // orange LED
//Probe 0:
int analog_in0 = 0; // analog read current
float R1 = 100000.0; // resistance R1 (100K)
float R2 = 10000.0; // resistance R2 (10K)
//Probe 1:
int analog_in1 = 1; // analog read current
float R3 = 100000.0; // resistance R3 (100K)
float R4 = 10000.0; // resistance R4 (10K)
//Probe 2:
int analog_in2 = 2; // analog read current
float R5 = 100000.0; // resistance R5 (100K)
float R6 = 10000.0; // resistance R6 (10K)
//Compare inputs
float deviation_1 = 10; // deviation from previous value (1)
float voltage[3] = {0.0, 0.0, 0.0}; // analog value
float Vin_save[3] = {0.0, 0.0, 0.0}; // saved voltage value
int Trigger = 0;
//Real Time Clock module (RTC)---------------------------------------------------------------------------
/*
The circuit:
** VCC - 5V pin
** GND - GND pin
** SDA - SDA pin
** SCL - SCL pin
*/
RTC_DS3231 rtc;
char timestamp[30];
// call back for file timestamps
void dateTime(uint16_t* date, uint16_t* time) {
DateTime now = rtc.now();
sprintf(timestamp, "%02d/%02d/%2d %02d:%02d:%02d ", now.day(), now.month(), now.year() - 2000, now.hour(), now.minute(), now.second());
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(now.year(), now.month(), now.day());
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(now.hour(), now.minute(), now.second());
}
//SD-Card---------------------------------------------------------------------------
/*
The circuit:
analog sensors on analog ins 0, (1), and (2)
SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
const int chipSelect = 4;
char filename[] = "00000000.CSV";
void getFileName() {
DateTime now = rtc.now();
sprintf(filename, "%02d%02d%02d%02d.CSV", now.day(), now.month(), now.year() - 2000, Trigger);
}
//measuring function---------------------------------------------------------------------------
int measure(int input, float Rfirst, float Rsecond) {
//Local variables for measuring function
float Vout = 0.0; // 1/10 analog value
float a_read = 0.0;
//Analog -> digital convert
a_read = analogRead(input); // read analog value
Vout = (a_read * 4.93) / 1024.0; // convert digital -> analog
voltage[input] = Vout / (Rsecond / (Rfirst + Rsecond)); // convert 1/10 -> real value
Trigger = input;
}
//Compare function + datalogging---------------------------------------------------------------------------
int action (float go, float deviation) {
//local variables compare function
float Vin_max = Vin_save[Trigger] + ((Vin_save[Trigger] / 100) * deviation);
float Vin_min = Vin_save[Trigger] - ((Vin_save[Trigger] / 100) * deviation);
if (go != 0) {
if (go >= Vin_max or go <= Vin_min) {
digitalWrite(fault_detect, HIGH);
digitalWrite(function_ok, LOW);
digitalWrite(function_nok, LOW);
Vin_save[Trigger] = go;
//SD-Card-------------------------------
//String for assembling the data to log
String dataString = "Voltage logged = ";
dataString += String(go);
getFileName();
// open the file
File dataFile = SD.open(filename, FILE_WRITE);
// if the file is available, write to it
if (dataFile) {
dataFile.println(timestamp + dataString);
dataFile.close();
// print same to the serial port
Serial.println(voltage[Trigger]);
}
// if the file isn't open, pop up an error
else {
Serial.println("error opening datalog");
}
delay(300);
} else if (go <= Vin_max or go >= Vin_min) {
digitalWrite(fault_detect, LOW);
digitalWrite(function_ok, HIGH);
digitalWrite(function_nok, LOW);
Vin_save[Trigger] = go;
delay(300);
} else {
digitalWrite(fault_detect, LOW);
digitalWrite(function_ok, LOW);
digitalWrite(function_nok, HIGH);
Vin_save[Trigger] = go;
delay(300);
}
} else {
digitalWrite(function_nok, HIGH);
digitalWrite(function_ok, LOW);
digitalWrite(fault_detect, LOW);
delay(300);
}
}
void setup() {
//Arduino pin definition
pinMode(analog_in0, INPUT);
pinMode(analog_in1, INPUT);
pinMode(analog_in2, INPUT);
pinMode(function_ok, OUTPUT);
pinMode(function_nok, OUTPUT);
pinMode(fault_detect, OUTPUT);
//SD-card setup---------------------------------------------------------------------------
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
//RTC Setup---------------------------------------------------------------------------
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// set date time callback function
SdFile::dateTimeCallback(dateTime);
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
measure(analog_in0, R1, R2); //Measure probe 0
action (voltage[Trigger], deviation_1);
measure(analog_in1, R3, R4); //Measure probe 1
action (voltage[Trigger], deviation_1);
measure(analog_in2, R5, R6); //Measure probe 2
action (voltage[Trigger], deviation_1);
}
Materials used:
- Arduino Uno
- SD card (waveshark)
- DS3231
- 3 x 100 Kohm & 3 x 10 Kohm
- 2 x 1,5 V batteries
I have a few questions:
-
There's a +- 15 seconds difference when i compare the timestamp of the data with the time of my computer clock. Does anyone have an idea why?
-
I looked but couldn't find a clear answer, so can someone explain me why i need following code?
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(now.year(), now.month(), now.day());
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(now.hour(), now.minute(), now.second());
- General feedback?
In attachment i added 3 log files from my last test run + a copy of the console information.
I also added a picture of the values i measured with my volt meter (i wrote the results of 2 test runs on the paper, only the second run can be compared with the log files).
There are some differences between the log files and the measurements i did, not yet clear why... . Changed the resistor values, will do a new test tomorrow.
Looking forward to receiving some constructive remarks.
Greetz,
Piet
Log files.zip (1.05 KB)