Lesson 14 Arduino Capacitor Meter Code

Lesson 14 Arduino Capacitor Meter Code

// By Roee Bloch  Capacitor-Meter
//All right Reserved
// Copyright (c) 2015 All Right Reserved, http://www.electronics-freak.com
//
// This source is subject to the Roee Bloch License.
// Please see the License.txt file for more information.
// All other rights reserved.
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// </copyright>
// <author>Roee Bloch</author>
// <email>roeebloch@walla.co.il</email>
// <date>June 2015</date>
/*
Part of the CODE is LCD Taken from:

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe

 Formulas in use are:
 R(measured) = (RKnown(VCC-Vmeasured))/VMeasured
 V(measured) = ((ADC VALUE)/1024)*VCC

 Ciruit is this:
 Connect CRL Pin (Digital pin 2)-> 1K Resistor -> Analog in 1 -> Capacitor to measure Positive || -> Negative capacitor pin to GND


*/

#include <LiquidCrystal.h>

#define analog_in 1 // define analog input pin in use
#define digital_ctrl 2 // digital pin control that will charge and discharge capacitor
#define VCC 5 //define VCC for calculation
#define R_known 1000 // define Reference resistor in use, I have found this value is very good to many measurements, but if you have another resistor you may change this value according
#define display_time 5 // how many seconds show the value before remeasuring
float  V_measured, limit, calc ;
int analog_read;
char flag = 0, flag2 = 0;
int t1, t2, t3, t4; //timers to use


// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
  Serial.begin(57600);
  Serial.println("Starting");
  pinMode(digital_ctrl, OUTPUT);
  lcd.begin(16, 2);
  lcd.print("Capacitor Meter ");
  digitalWrite(digital_ctrl, LOW); // starting discharge
}
void loop()
{
  flag = 0;
  digitalWrite(digital_ctrl, LOW);
  mycalc();
  while (V_measured > 0.1)
  {
    digitalWrite(digital_ctrl, LOW); // starting discharge
    Serial.println("Discharging Capacitor");
    lcd.print("Disch. Capacitor");
    lcd.setCursor(0, 1);
    Serial.println("Please wait....");
    mycalc();
  }
  // discharge complete
  myclear();
  lcd.setCursor(0, 1);
  lcd.print("Charging now..");
  digitalWrite(digital_ctrl, HIGH); // starting to charge capacitor
  limit = 0.6321 * VCC; // value of 1 TAU = R*C
  t1 = millis();
  mycalc();
  while (V_measured < limit)
  { // reading again and waiting to charge for 63%
    mycalc();
  } // charge complete
  t2 = millis();
  myclear();
  lcd.setCursor(0, 1);
  Serial.println("COMPLETE");
  lcd.print("COMPLETE");
  calc = float(t2 - t1) / float(R_known);
  if (calc < 1)
  {
    calc = 1000 * calc;
    flag = 1;
  }
  Serial.println("Capacitor is:");
  if (flag == 1)
  {
    Serial.print(float(calc), 3);
    Serial.println(" uF");
    myclear();
    lcd.setCursor(0, 1);
    lcd.print("C= ");
    lcd.print(float(calc), 3);
    lcd.print(" uF");
    delay(display_time*1000);
  }
  else
  {
    Serial.println(float(calc), 6);
    Serial.print(float(calc), 3);
    Serial.println(" mF");
    myclear();
    lcd.setCursor(0, 1);
    lcd.print("C= ");
    lcd.print(float(calc), 3);
    lcd.print(" mF");
    delay(display_time*1000);
  }
  Serial.println(t2);  //for debug on serial port
  Serial.println(t1); //for debug on serial port
  delay(2000); // delay before next reading
  mycalc();
  t3 = millis();
  while (V_measured > VCC - 0.1) // not inserted new capacitor yet
  {
    mycalc();
    t4 = millis();
    if (flag2 == 0) {
      Serial.println("waiting");
      flag2 = 1;
    }
    if ((t4 - t3) > (display_time*1000)) // after display_time seconds testing again
    {
      Serial.println("Testing Again");
      lcd.setCursor(0, 1);
      lcd.print("Testing Again");
      delay(1000);
      break;
    }   
  }
  flag2 = 0;
}
void myprint(float x, String param)
{
  int myprint;
  myprint = (x);
  Serial.print(param);
  Serial.print(" is:");
  Serial.println(myprint);
}
void myclear() // clear all second line
{
  lcd.setCursor(0, 1);
  lcd.print("                ");
}
void mycalc()
{
  analog_read = analogRead(analog_in);
  V_measured = (analog_read) * VCC; // this is voltage *1024 since we did not divide by 1024
  V_measured = V_measured / 1024.0;
}

Video to Theory of this Circuit: https://youtu.be/3kUuhFtO1KM
Video based on this code: lesson-14-arduino-capacitor-meter

[adsenseyu6]

Parts for this project are here: