Smart battery discharger/tester

Oops... forgot the code ::slight_smile:

Here it is

//Battery monitoring      V1      Basic edition
// Copyleft KAS         November 2009

#define     VMIN              700           // Battery protection      Vmin > WMIN
#define     WMAX              2000          // Transistor protection   Wmax < WMAX
#define     LOOP              2000          // loop time (ms)

#define     Vpin              0             // battery voltage pin
#define     Apin              1             // Amp reading pin
#define     RELAY             3             // relay pin

long loopTime = LOOP;
long loopUsedTime = LOOP;
long loopStart = 0;
float mVolt = 0;
float mAmp = 0;
float mW = 0;
float mAmpH = 0;
long loopCount = 0;
boolean testOn = false;

void setup()  {
  Serial.begin(19200);
  pinMode(RELAY, OUTPUT); 
  digitalWrite(RELAY,HIGH);                     // Close relay
  testOn = true;
  delay(100);
}

void loop()  {
  loopStart = millis();
  
  mVolt = getmVolts();
  mAmp = getmAmps();
  mW = (mAmp * mVolt) /1000;
  mAmpH += mAmp * loopTime / 3600 /1000;
  if(testOn)    display();
  else          while(1);                    // Loops forever
  testStop(VMIN, WMAX);

  loopCount++;
  loopUsedTime = millis()-loopStart;
  if(loopUsedTime < LOOP)         delay(LOOP - loopUsedTime);
  loopTime = millis() - loopStart;
}

int getmVolts()  {
  return int(analogRead(Vpin)*4.8828125);          // read the battery voltage
}

int getmAmps()  {
  return int(analogRead(Apin)*4.8828125/0.47);      // read the Amps
}

void display()  {
  Serial.print(loopCount/(60000/LOOP));                Serial.print(":");
  if(((loopCount%(60000/LOOP))*LOOP/1000)<10)          Serial.print("0");
  Serial.print((loopCount%(60000/LOOP))*LOOP/1000);    Serial.print("    ");
  Serial.print((int)mVolt);                            Serial.print(" mV   ");
  Serial.print((int)mAmp);                             Serial.print(" mA   ");
  Serial.print((int)mW);                               Serial.print(" mW       ");
  Serial.print((int)mAmpH);                            Serial.println(" mAh");
}

void testStop(float Vmin, float Wmax)  {
  if((mVolt < Vmin)||(mW > Wmax))
  {  digitalWrite(RELAY,LOW);                      // disconnect tested battery
     testOn = false;
     Serial.println("Stop");  
  }
}