Arduino Based Simple Watt-meter Shield

by sainisagar7294 in Circuits > Arduino

577 Views, 0 Favorites, 0 Comments

Arduino Based Simple Watt-meter Shield

thumb2.JPG

This is an Arduino compatible shield which is able to measure the real time current, voltage and power ratings accurately.

Supplies

mini_IMG_0169.JPG

Components required:

1) Arduino Nano

2) ACS712-20A

3) 4.7K and 10k resistor

4) OLED display

5) External SMPS power supply

6) Usb and connection wires

7) Custom PCB shield from JLCPCB

Story

My Video1.gif

Power monitoring is the basic need of any electronics or electric system nowadays, if you are a hobbies or working on any hardware related project. Now I have a portable wattmeter available which has functions to measure the DC voltage, Current and overall power. Basically, it is a watt meter which is also comes in the lab bench power supplies. But we are just measuring not making any constant current/ voltage supply in this tutorial. That is the content to be done in another video/ article. This project is bought to you by JLCPCB- China based PCB manufacturer, has a 15 years’ experience in this industry.

Problem in Measuring:

mini_IMG_0161.JPG

Arduino has two type of measuring capability voltage and time duration. Arduino can measure voltage using the 10bit ADC which can provide a great resolution up to 20volts. Somehow If the current can be converted into voltage form, it can be easily measurable. But to do this either we have to go old shunt-based voltage drop configuration or we can go with readymade hall effect current sensors. ACS712 comes with a precision current measurement of 100mv/A.

ACS712 and Its Types:

mini_IMG_0170.JPG

ACS712 comes in different current selection chip. It has 3 variants one for 5Amperes, second for 20Amps and next for 30Amperes. ACS712 comes with linear graph of respective voltage when there is increase in current. Here I am using 20 ampere version but 5ampere is recommended for better precision in small electronics readings. Code can be modified as per used variant.

Circuit Diagram:

ice_screenshot_20220929-145247.png
ice_screenshot_20220929-143916.png

Arduino ADC has a maximum range of 5volts, so if you want to measure voltage more than 5volts then a voltage divider network is required. Here I made a resistor network using 4.7k and 10k which gives the final range of 16.6volts. Just do a little bit calculations over the voltage divider network.

OLED is connected using I2C bus to the Arduino, ACS 712 also needs a constant voltage of 5volts. It is to be noted that the readings of voltage and current is based on the 5volt regulation, resistor tolerance and room temperature. The practical readings are always different from theory. When we have both current and voltage, power can be defined using the formula: voltage x current.

PCB Shield:

ice_screenshot_20220929-151341.png
ice_screenshot_20220929-144827.png
ice_screenshot_20220929-144856.png

Just plug your Arduino, OLED and ACS712 sensor. Solder some resistor and capacitors and we are ready to go with this wattmeter project. Values can be calibrated through the program. I made this shield in EasyEDA and then fabricated by JLCPCB in China’s best lab.

Or you can go with Arduino UNO based shield which provide a better interface, just plug you shield to Arduino and go for it. You can download all the required file from below.

Get your hands on the best manufacturer service form JLCPCB just in $2 for 5pcs of 2-layer boards. Sign-up now to JLCPCB and get free new user coupons of worth $54. Download the code, Gerber and schematics from here or you can also try your own design with modification by taking a reference from this.

Code:

All the basic libraries are used in this program and you can get them from manage library section under tools menu in Arduino IDE.

// Suitable with 12v battery, adaptor wattage, current and voltage monitoring.
// Resistor divider network need more upgradation if voltage is higher that 15.6
// Try 0x3D OLED address if screen did not work.
// Precision of the voltage depends on the tolerance of the resistors.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET -1
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Change the address to your's one
  display.clearDisplay();
}

void loop() {
  // put your main code here, to run repeatedly:
  int adc = analogRead(A0);
  int adc2 = analogRead(A1);
  float voltage = adc * 5 / 1023.0;
  float voltage2 = adc2 * 16.24/1023.0;        // resistor divider basics needed to be learn 
  float current = (voltage - 2.5) / 0.100; 

//0.100 for 20A, 0.185 for 30A, 0.66 for 5A
// follow this link:
//https://startingelectronics.org/articles/arduino/measuring-voltage-with-arduino/

  if (current < 0.16) {
    current = 0;
  }
  
   display.clearDisplay();
   display.setTextSize(1);
   display.setTextColor(WHITE);

   display.setCursor(10,10);
   display.print("Current : ");
   display.print(current);
   display.display();

   display.setCursor(10,20);
   display.print("Voltage : ");
   display.print(voltage2);
   display.display();

   display.setCursor(10,30);
   display.print("Power ");
   display.print(current*voltage);
   display.display();
   delay(1000);
}

Code Explained:

First of all, we defined the basic initializing libraries, modes and reset pins of the display.

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>  #define OLED_RESET -1 Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);

In the loop section, Arduino ADC read the voltage and current on A1 and A0 respectively.

int adc = analogRead(A0);
  int adc2 = analogRead(A1);

A voltage divider network is placed to measure the voltage and current readings are directly supplied from ACS sensor.

float voltage = adc * 5 / 1023.0;
  float voltage2 = adc2 * 16.24/1023.0; // resistor divider basics needed to be learn 
  float current = (voltage - 2.5) / 0.100; // follow this link: https://startingelectronics.org/articles/arduino/measuring-voltage-with-arduino/

  if (current < 0.16) {
    current = 0;

The readings are converted into voltages and then displayed on screen; this is the basic output code to SSD1306 type display.

display.clearDisplay();
   display.setTextSize(1);
   display.setTextColor(WHITE);

   display.setCursor(10,10);
   display.print("Current : ");
   display.print(current);
   display.display();

Working of the Project:

My Video2.gif
My Video.gif

I always recommend to use a separate power supply/ battery unit for the microcontroller circuit. This would not affect the readings anymore whatever is the input voltage. Also helps to keep the sensor calibrated.

The reads are much accurate as they are in my bench power supply unit. The code can be further modified for ACS712 which is explained in the comment lines inside it. Keep it simple using the PCB shield which also eliminates the breadboard, dry soldering and wires impedance.