Arduino

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 8

// AC Current Sensor with LCD By Solarduino

// Note Summary
// Note : Safety is very important when dealing with electricity. We take no
responsibilities while you do it at your own risk.
// Note : This AC Current Sensor Code is for ACS712 current module and Hall effect
split core current transformer use.
// Note : The value shown in Serial Monitor / LCD Display is refreshed every
second and is the average value of 1000 sample readings.
// Note : The current measured is the Root Mean Square (RMS) value.
// Note : The analog value per sample is squared and accumulated for every 1000
samples before being averaged. The averaged value is then getting square-rooted.
// Note : The auto calibration (currentOffset1) is using averaged analogRead value
of 1000 samples.
// Note : The auto calibration (currentOffset2) is using calculated RMS current
value including currentOffset1 value for calibration.
// Note : The unit provides reasonable accuracy and may not be comparable with
other expensive branded and commercial product.
// Note : All credit shall be given to Solarduino.

/
*//////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
////////////////*/////////////*/

/* 0- General */

int decimalPrecision = 2; // decimal places for all


values shown in LED Display & Serial Monitor

/* 1- AC Current Measurement */

int CurrentAnalogInputPin = A1; // Which pin to measure Current


Value (A0 is reserved for LCD Display Shield Button function)
float mVperAmpValue = 185; // If using ACS712 current
module : for 5A module key in 185, for 20A module key in 100, for 30A module key in
66
// If using "Hall-Effect"
Current Transformer, key in value using this formula: mVperAmp = maximum voltage
range (in milli volt) / current rating of CT
// For example, a 20A Hall-
Effect Current Transformer rated at 20A, 2.5V +/- 0.625V, mVperAmp will be 625 mV /
20A = 31.25mV/A
float offsetSampleRead = 0; /* to read the value of a
sample for offset purpose later */
float currentSampleRead = 0; /* to read the value of a
sample including currentOffset1 value*/
float currentLastSample = 0; /* to count time for each
sample. Technically 1 milli second 1 sample is taken */
float currentSampleSum = 0; /* accumulation of sample
readings */
float currentSampleCount = 0; /* to count number of sample.
*/
float currentMean ; /* to calculate the average
value from all samples, in analog values*/
float RMSCurrentMean ; /* square roof of currentMean,
in analog values */
float adjustRMSCurrentMean ; /* RMScurrentMean including
currenOffset2, in analog values */
float FinalRMSCurrent ; /* the final RMS current
reading*/

/*1.1 Offset AC Current */

int OffsetRead = 0; /* to change the mode for


offset */
float currentOffset1 = 0; // to Offset deviation and
accuracy. Offset any fake current when no current operates.
// Offset will
automatically callibrate when SELECT Button on the LCD Display Shield is pressed.
// If you do not have LCD
Display Shield, look into serial monitor to add or minus the value manually and key
in here.
// 26 means add 26 to all
analog value measured
float currentOffset2 = 0; // to offset value due to
calculation error from squared and square root.
float offsetSampleSum =0; /* accumulation of sample
readings for offset */
float offsetCurrentMean = 0; /* to calculate the average
value from all samples for offset, in analog values*/
float offsetLastSample = 0; /* to count time for each
sample for offset purpose. */
float offsetSampleCount = 0; /* to count number of
sample for offset. */

/* 2 - LCD Display */

#include<LiquidCrystal.h> /* Load the liquid Crystal


Library (by default already built-it with arduino solftware)*/
LiquidCrystal LCD(8,9,4,5,6,7); /* Creating the LiquidCrystal
object named LCD. The pin may be varies based on LCD module that you use*/
unsigned long startMillisLCD; /* start counting time for LCD
Display */
unsigned long currentMillisLCD; /* current counting time for
LCD Display */
const unsigned long periodLCD = 1000; // refresh every X seconds (in
seconds) in LED Display. Default 1000 = 1 second

void setup() /*codes to run once */

/* 0- General */

Serial.begin(9600); /* to display readings in


Serial Monitor at 9600 baud rates */

/* 2 - LCD Display */

LCD.begin(16,2); /* Tell Arduino that our


LCD has 16 columns and 2 rows*/
LCD.setCursor(0,0); /* Set LCD to start with
upper left corner of display*/
startMillisLCD = millis(); /* Start counting time
for LCD display*/

void loop() /*codes to run again and


again */
{

/* 0- General */

/* 0.1- Button Function */

int buttonRead;
buttonRead = analogRead
(0); // Read analog pin A0. Pin A0
automatically assigned for LCD Display Button function (cannot be changed)

/*Right button is pressed */


if (buttonRead < 60)
{ LCD.setCursor(0,0); LCD.print ("PRESS <SELECT> "); }

/* Up button is pressed */
else if (buttonRead < 200)
{ LCD.setCursor(0,0); LCD.print ("PRESS <SELECT> "); }

/* Down button is pressed */


else if (buttonRead < 400)
{ LCD.setCursor(0,0); LCD.print ("PRESS <SELECT> "); }

/* Left button is pressed */


else if (buttonRead < 600)
{ LCD.setCursor(0,0); LCD.print ("PRESS <SELECT> "); }

/* Select button is pressed */


else if (buttonRead < 800)
{
OffsetRead =
1; // to activate offset
LCD.setCursor(0,0);
LCD.print ("INITIALIZING..... ");
LCD.setCursor(0,1);
LCD.print ("WAIT 5 SEC ..... ");
}

/* 1- AC Current Measurement */

if(millis() >= currentLastSample + 1)


/* every 1 milli second taking 1 reading */
{
offsetSampleRead = analogRead(CurrentAnalogInputPin)-512;
/* Read analog value. This is for offset purpose */
offsetSampleSum = offsetSampleSum + offsetSampleRead;
/* Accumulate analog values from each sampel for offset purpose*/
currentSampleRead = analogRead(CurrentAnalogInputPin)-512 +
currentOffset1; /* read the sample value including offset
value*/
currentSampleSum = currentSampleSum + sq(currentSampleRead) ;
/* accumulate total analog values for each sample readings*/

currentSampleCount = currentSampleCount + 1;
/* to count and move on to the next following count */
currentLastSample = millis();
/* to reset the time again so that next cycle can start again*/
}

if(currentSampleCount == 1000)
/* after 1000 count or 1000 milli seconds (1 second), do this following codes*/
{
offsetCurrentMean = offsetSampleSum /currentSampleCount;
/* average accumulated analog values for offset purpose */

currentMean = currentSampleSum/currentSampleCount;
/* average accumulated analog values*/
RMSCurrentMean = sqrt(currentMean);
/* square root of the average value*/
adjustRMSCurrentMean = RMSCurrentMean + currentOffset2;
/* square root of the average value including offset value */
FinalRMSCurrent = (((adjustRMSCurrentMean /1024) *5000)
/mVperAmpValue); /* calculate the final RMS current*/
Serial.print(" The Current RMS value is: ");
Serial.print(FinalRMSCurrent,decimalPrecision);
Serial.println(" A ");
offsetSampleSum = 0;
/* to reset accumulate offset sample values for the next cycle */
currentSampleSum =0;
/* to reset accumulate sample values for the next cycle */
currentSampleCount=0;
/* to reset number of sample for the next cycle */
}

/* 1.1 - Offset AC Current */

if(OffsetRead == 1)
/* Run this code when button SELECT is pressed */
{
currentOffset1 = 0;
/* set back currentOffset as default*/
if(millis()>= offsetLastSample + 1)
/* keep countng time for offset1*/
{

offsetSampleCount = offsetSampleCount + 1;

offsetLastSample = millis();

if(offsetSampleCount == 1500)
/* after 1.5 seconds, run this codes. */
{
currentOffset1 = - offsetCurrentMean;
/* set the offset values */
OffsetRead = 2;
/* go for second offset Settings */
offsetSampleCount = 0;
/* to reset the time again so that next cycle can start again */
}

if(OffsetRead == 2)
/* Run this code after first offset done */
{
currentOffset2 = 0;
/* set back currentOffset2 as default*/
if(millis()>= offsetLastSample + 1)
/* keep countng time for offset2*/
{

offsetSampleCount = offsetSampleCount + 1;

offsetLastSample = millis();

if(offsetSampleCount == 2500)
/* after 2.5 seconds, run this codes. */
{

currentOffset2 = - RMSCurrentMean;
/* set the offset values */
OffsetRead = 0;
/* change the offset mode to original, wait until the button is pressed again */

offsetSampleCount = 0;
/* to reset the time again so that next cycle can start again */
}

/* 2 - LCD Display */

currentMillisLCD = millis();
/* Set counting time for LCD Display*/
if (currentMillisLCD - startMillisLCD >= periodLCD)
/* for every x seconds, run the codes below*/
{
LCD.setCursor(0,0);
/* Set cursor to first colum 0 and second row 1 */
LCD.print("I=");
LCD.print(FinalRMSCurrent,decimalPrecision);
/* display current value in LCD in first row */
LCD.print("A ");
LCD.setCursor(0,1);
LCD.print(" ");
/* display nothing in LCD in second row */
startMillisLCD = currentMillisLCD ;
/* Set the starting point again for next counting time */
}

-----------------------------------------------------------------------------------
-----

// AC Current Sensor without LCD By Solarduino

// Note Summary
// Note : Safety is very important when dealing with electricity. We take no
responsibilities while you do it at your own risk.
// Note : This AC Current Sensor Code is for ACS712 current module and Hall effect
split core current transformer use.
// Note : The value shown in Serial Monitor is refreshed every second and is the
average value of 1000 sample readings.
// Note : The current measured is the Root Mean Square (RMS) value.
// Note : The analog value per sample is squared and accumulated for every 1000
samples before being averaged. The averaged value is then getting square-rooted.
// Note : The auto calibration (currentOffset1) is using averaged analogRead value
of 1000 samples.
// Note : The auto calibration (currentOffset2) is using calculated RMS current
value including currentOffset1 value for calibration.
// Note : The unit provides reasonable accuracy and may not be comparable with
other expensive branded and commercial product.
// Note : All credit shall be given to Solarduino.

/
*//////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
////////////////*/////////////*/

/* 0- General */

int decimalPrecision = 2; // decimal places for all


values shown in LED Display & Serial Monitor

/* 1- AC Current Measurement */

int CurrentAnalogInputPin = A1; // Which pin to measure Current


Value (A0 is reserved for LCD Display Shield Button function)
float mVperAmpValue = 185; // If using ACS712 current
module : for 5A module key in 185, for 20A module key in 100, for 30A module key in
66
// If using "Hall-Effect"
Current Transformer, key in value using this formula: mVperAmp = maximum voltage
range (in milli volt) / current rating of CT
// For example, a 20A Hall-
Effect Current Transformer rated at 20A, 2.5V +/- 0.625V, mVperAmp will be 625 mV /
20A = 31.25mV/A
float offsetSampleRead = 0; /* to read the value of a
sample for offset purpose later */
float currentSampleRead = 0; /* to read the value of a
sample including currentOffset1 value*/
float currentLastSample = 0; /* to count time for each
sample. Technically 1 milli second 1 sample is taken */
float currentSampleSum = 0; /* accumulation of sample
readings */
float currentSampleCount = 0; /* to count number of sample.
*/
float currentMean ; /* to calculate the average
value from all samples, in analog values*/
float RMSCurrentMean ; /* square roof of currentMean,
in analog values */
float adjustRMSCurrentMean ; /* RMScurrentMean including
currenOffset2, in analog values */
float FinalRMSCurrent ; /* the final RMS current
reading*/

/*1.1 Offset AC Current */

float currentOffset1 = 0; // to Offset deviation and


accuracy. Offset any fake current when no current operates.
// Offset will
automatically callibrate when SELECT Button on the LCD Display Shield is pressed.
// If you do not have LCD
Display Shield, look into serial monitor to add or minus the value manually and key
in here.
// 26 means add 26 to all
analog value measured
float currentOffset2 = 0; // to offset value due to
calculation error from squared and square root.

void setup() /*codes to run once */

/* 0- General */

Serial.begin(9600); /* to display readings in


Serial Monitor at 9600 baud rates */

void loop() /*codes to run again and


again */
{

/* 1- AC Current Measurement */

if(millis() >= currentLastSample + 1)


/* every 1 milli second taking 1 reading */
{
offsetSampleRead = analogRead(CurrentAnalogInputPin)-512;
/* Read analog value. This is for offset purpose */
currentSampleRead = analogRead(CurrentAnalogInputPin)-512 +
currentOffset1; /* read the sample value including offset
value*/
currentSampleSum = currentSampleSum + sq(currentSampleRead) ;
/* accumulate total analog values for each sample readings*/

currentSampleCount = currentSampleCount + 1;
/* to count and move on to the next following count */
currentLastSample = millis();
/* to reset the time again so that next cycle can start again*/
}

if(currentSampleCount == 1000)
/* after 1000 count or 1000 milli seconds (1 second), do this following codes*/
{
currentMean = currentSampleSum/currentSampleCount;
/* average accumulated analog values*/
RMSCurrentMean = sqrt(currentMean);
/* square root of the average value*/
adjustRMSCurrentMean = RMSCurrentMean + currentOffset2;
/* square root of the average value including offset value */
FinalRMSCurrent = (((adjustRMSCurrentMean /1024) *5000)
/mVperAmpValue); /* calculate the final RMS current*/
Serial.print(" The Current RMS value is: ");
Serial.print(FinalRMSCurrent,decimalPrecision);
Serial.println(" A ");
currentSampleSum =0;
/* to reset accumulate sample values for the next cycle */
currentSampleCount=0;
/* to reset number of sample for the next cycle */
}

You might also like