Hello,
i'm having a problem while datalogging temperature, voltage and current in my small 12V-battery project.
I'm using the widely know small sensors for voltage and current, as well as LM4040 voltage reference.


I've set up an SD Card and logged all Data for about 4 days. The fan wasn't running at all, since i've set the threshold at 30°C.
Unfortunately, i'm getting very fluctuating readings, from 12.40V one day to suddenly 13.10V the next day. There is no charger connected.
Since this affects the voltage sensor as well as the current sensor at the same time, i suspect it's a problem with the analogRead.
Do you have any idea what the problem might be?
Code:
//Voltage Sensor
int ANALOG_IN_PIN=A0;
float adc_voltage=0.00;
float in_voltage=0.0;
float ref_voltage=4.85;
int adc_value=0;
float R1=30000.0;
float R2=7500.0;
//Temperatursensor
#include <math.h>
const int B = 4275; // B value of the thermistor
const int R0 = 100000; // R0 = 100k
const int pinTempSensor = A1; // Grove - Temperature Sensor connect to A0
int tempRead=0;
float temperature=0.00;
//Luefter
int fanPin=3;
//Stromsensor
int currentPin=A7;
float currentValue;
float readCurrent;
//LEDs
int led1Pin=6;
int led2Pin=5;
int led3Pin=4;
int led4Pin=9;
int led5Pin=8;
//SD-Card
#include <SD.h>
#include <SPI.h>
File myFile;
int pinCS=10;
//RTC (Real-Time-Clock)
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
DateTime now;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ANALOG_IN_PIN,INPUT);
pinMode(pinTempSensor,INPUT);
pinMode(fanPin,OUTPUT);
pinMode(led1Pin,OUTPUT);
pinMode(led2Pin,OUTPUT);
pinMode(led3Pin,OUTPUT);
pinMode(led4Pin,OUTPUT);
pinMode(led5Pin,OUTPUT);
pinMode(currentPin,INPUT);
pinMode(pinCS,OUTPUT);
analogReference(EXTERNAL);
//SD Card Initialization
if (SD.begin()){
Serial.println("SD card is ready to use.");
} else {
Serial.println("SD card initialization failed");
}
//SD.remove("datalog.txt"); //Deleting Textfile
//RTC (Real-Time-Clock)
if(!rtc.begin()){
Serial.println("Couldn't find RTC");
}
if(!rtc.isrunning()){
Serial.println("RTC is NOT running");
}
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //Zeit/Datum neu justieren
}
void loop() {
now=rtc.now();
measVoltage(); //Spannungssensor
measTemp(); //Temperatursensor
controlFan(); //Lueftersteuerung
measCurrent(); //Stromsensor
showTime(); //RTC(Real-Time-Clock)
writeSD(); //SD_Card
controlLED(); //LEDs steuern
serialPrint();
delay(5000);
}
void measVoltage(){
adc_value=analogRead(ANALOG_IN_PIN);
adc_voltage=(adc_value*ref_voltage)/1024;
in_voltage=adc_voltage/(R2/(R1+R2));
}
void measTemp(){
tempRead = analogRead(pinTempSensor);
float R = 1023.0/(0.97*tempRead)-1.0;
R = R0*R;
temperature = 1.0/(log(R/R0)/B+1/298.15)-273.15; // convert to temperature via datasheet
}
void controlFan(){
if(temperature>30.0){
analogWrite(fanPin,150);}
else {analogWrite(fanPin,0);
}
}
void measCurrent(){
readCurrent=analogRead(currentPin);
currentValue=10*((4.50/951.00)*readCurrent)-25.1; //Strom=10xSpannungswert-25,1 (c=25.1, m=0.1)
}
void showTime(){
Serial.print(now.day(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.year(), DEC);
Serial.print(" ");
Serial.print(now.hour(),DEC);
Serial.print(":");
Serial.print(now.minute(),DEC);
Serial.print(":");
Serial.print(now.second(),DEC);
Serial.println();
}
void writeSD(){
myFile = SD.open("datalog.txt",FILE_WRITE); //Create/Open file
if (myFile){ //if the file opened okay, write to it
myFile.print(now.day(),DEC);
myFile.print(" ");
myFile.print(now.month(),DEC);
myFile.print(" ");
myFile.print(now.year(),DEC);
myFile.print(" ");
myFile.print(now.hour(),DEC);
myFile.print(" ");
myFile.print(now.minute(),DEC);
myFile.print(" ");
myFile.print(now.second(),DEC);
myFile.print(" ");
myFile.print(in_voltage);
myFile.print(" ");
myFile.print(temperature);
myFile.print(" ");
myFile.print(currentValue);
myFile.println();
myFile.close();
}
else{ //if the file didn't open, print an error
Serial.println("Error opening file");
}
//Reading the file:
// myFile=SD.open("datalog.txt");
// if(myFile){
// Serial.println("Read: ");
// //Reading the whole file
// while (myFile.available()){
// Serial.write(myFile.read());
// }
// myFile.close();
// }
// else{
// Serial.println("Error opening file");
//}
}
void controlLED(){
if(in_voltage>12.8){
digitalWrite(led1Pin,HIGH);
digitalWrite(led2Pin,HIGH);
digitalWrite(led3Pin,HIGH);
digitalWrite(led4Pin,HIGH);
digitalWrite(led5Pin,HIGH);}
else if(in_voltage<=12.8&&in_voltage>12.5){
digitalWrite(led1Pin,HIGH);
digitalWrite(led2Pin,HIGH);
digitalWrite(led3Pin,HIGH);
digitalWrite(led4Pin,HIGH);
digitalWrite(led5Pin,LOW);}
else if(in_voltage<=12.5&&in_voltage>12.2){
digitalWrite(led1Pin,HIGH);
digitalWrite(led2Pin,HIGH);
digitalWrite(led3Pin,HIGH);
digitalWrite(led4Pin,LOW);
digitalWrite(led5Pin,LOW);}
else if(in_voltage<=12.2&&in_voltage>12.0){
digitalWrite(led1Pin,HIGH);
digitalWrite(led2Pin,HIGH);
digitalWrite(led3Pin,LOW);
digitalWrite(led4Pin,LOW);
digitalWrite(led5Pin,LOW);}
else if(in_voltage<12.0){
digitalWrite(led1Pin,HIGH);
digitalWrite(led2Pin,LOW);
digitalWrite(led3Pin,LOW);
digitalWrite(led4Pin,LOW);
digitalWrite(led5Pin,LOW);}
}
void serialPrint(){
Serial.print("Spannung: ");
Serial.println(in_voltage,2);
Serial.print("Temperatur: ");
Serial.println(temperature);
Serial.print("Strom: ");
Serial.println(currentValue);
Serial.println();
}




