Prepaid Energy Meter Using GSM and Arduino: Saddam 93 Comments
Prepaid Energy Meter Using GSM and Arduino: Saddam 93 Comments
and Arduino
By Saddam 93 Comments
Prepaid Electricity Energy Meter is a good concept in which you can recharge its
balance, like we do in our mobile phones. In this project we are building a automated
system by using Arduino and GSM module. You can recharge the electricity balance
through this system, just by sending a SMS. It can also disconnect the home power
supply connection, if there is low or zero balance in the system. And this system
will reads the energy meter readings and automatically send some updates to
user’s mobile phone like low balance alert, cut off alert, resume alert and recharge alert.
Working explanation:
Here we have interfaced electricity energy meter with Arduino using the pulse LED
(Calibration or Cal) of electricity Energy meter. We only need to connect tis CAL LED
to Arduino through an Optocoupler IC.
Components used:
Arduino
GSM Module
16x2 LCD
Analogue Electricity Energy Meter
Optocoupler 4n35
Resistors
POT
Connecting wires
Bulb and holder
SIM card
Power supply
Mobile Phone
When we power up the system then it reads previous values of rupees stored in
EEPROM and restores them into the variables then checks the available balance with
the predefined value and take action according to them, like if available balance is
greater than 15 rupees then Arduino turns On the electricity of home or office by using
relay. And if balance is less than 15 rupees then Arduino sends a SMS to user phone
regarding low balance alert and requesting to recharge soon. And if balance is less than
5 rupees then Arudino turns Off the electricity connection of home and sends a SMS to
user’s phone for ‘Light Cut’ alert and requesting to recharge soon. GSM module has
been used to send and receive messages, you can check about GSM module and AT
commands here.
Now when we need to recharge our system, we can recharge it simply by sending a
SMS to the system, through our Cellphone. Like if we want to recharge by 45 bucks
then we will send #45*, here # and * are prefix and suffix to the recharge amount.
System receives this message and extract recharge amount and update the balance of
system. And system again turns On the electricity of the house or office. This flow of
working can be understood through the video at the end.
Circuit Description:
Circuit connections for this Wireless Electricity Meter Reading Project, are shown in
the diagram; we have used a Arduino UNO for processing all the things used in
project. A liquid crystal display is used for displaying the status of Units and remaining
balance. Data pins of LCD namely RS, EN, D4, D5, D6, D7 are connected to Arduino
digital pin number 7, 6, 5, 4, 3, 2. And Rx and Tx pins of GSM module are directly
connected to the Tx and Rx pins of Arduino respectively. And GSM module is powered
by using a 12 volt adaptor. A relay is used for switching electricity connection which is
connected at pin 12 of Arduino though ULN2003 relay driver.
How to Connect Energy Meter with Arduino:
First user need to buy an Analogue Electricity Energy Meter. After it user needs to
open it and find the Pulse LED or Cal LED’s terminals (cathode and Anode). Now
solder two wires at both the terminals and take it out from the energy meter and then
close energy meter and tight the screws.
Now user needs to connect anode terminal of LED at pin number 1
of Optocoupler and cathode terminal to pin 2. Pin number four of optocouper should
be directly connected to ground. A LED and a Pull-up resistor are connected at pin
number 5 of optocoupler. And same terminal should go to the Arduino pin 8 too.
Calculation of Pulses and Units:
Before proceeding for the calculations, first we have to keep in mind the pulse rate of
energy meter. There are two pulse rates of energy meter first is 1600 imp/kwh and
second is 3200 imp/kwh. So here we are using 3200 imp/kwh pulse rate energy meter.
So first we need to calculate the Pulses for 100watt, means how many times Pulse
LED will blink in a minute, for the load of 100 watts.
Pulse= (Pluse_rate*watt*time)/ (1000*3600)
So pulses for 100 watt bulb in 60 seconds, with energy meter of 3200 imp/kwh pulse
rate can be calculated as below:
Pulses=3200*100*60/1000*3600
Pulses = ~5.33 pulse per minute
Now we need to calculate Power factor of a single pulse, means how much electricity
will be consumed in one pulse:
PF= watt/(hour*Pulse)
PF=100/60*5.33
PF=0.3125 watt in a single pulse
Programing explanation:
First of all we include required library and Define pins & variables that are required in
our project. This can be seen in first few lines of our program code below.
After it we initialize the LCD, serial communication, GSM and display some message
message.
After this in loop function we read serial received data if any. And reads pulse from
energy meter and show units and balance on LCD.
void setup()
{
lcd.begin(16,2);
Serial.begin(9600);
pinMode(led, OUTPUT);
.. ...
... ....
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
delay(2000);
lcd.print("GSM Initilizing...");
gsm_init();
.. ...
... ....
After this in loop function we read serial received data if any. And reads pulse from
energy meter and show units and balance on LCD.
void loop()
{
serialEvent();
rupees=EEPROM.read(1);
units=rupees/5.0;
lcd.setCursor(0,0);
lcd.print("Units:");
.. ...
... ....
void gsm_init()
{
lcd.clear();
lcd.print("Finding Module..");
boolean at_flag=1;
while(at_flag)
.. ...
... ...
void check_status()
{
if(rupees>15)
{
digitalWrite(relay, HIGH);
flag1=0;
.. ...
... ....
void read_pulse()
{
if(!digitalRead(pulsein))
{
digitalWrite(led, HIGH);
if(units<1){}
.. ...
... ....
serialEvent() function is used for serial communication and receiving the message.
Code:
#include<EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
int led=13;
#define pulsein 8
#define relay 12
unsigned int pusle_count=0;
float units=0;
unsigned int rupees=0;
float watt_factor=0.3125;
unsigned int temp=0,i=0,x=0,k=0;
char str[70],flag1=0,flag2=0;
String bal="";
void setup()
{
lcd.begin(16,2);
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(pulsein, INPUT);
pinMode(relay, OUTPUT);
digitalWrite(pulsein, HIGH);
lcd.setCursor(0,0);
lcd.print("Automatic Energy");
lcd.setCursor(0,1);
lcd.print(" Meter ");
delay(2000);
lcd.clear();
lcd.print("Circuit Digest");
delay(2000);
lcd.clear();
lcd.print("GSM Initilizing...");
gsm_init();
lcd.clear();
lcd.print("System Ready");
Serial.println("AT+CNMI=2,2,0,0,0");
init_sms();
send_data("System Ready");
send_sms();
delay(1000);
digitalWrite(led, LOW);
lcd.clear();
// EEPROM.write(1,0);
// rupees=EEPROM.read(1);
}
void loop()
{
serialEvent();
rupees=EEPROM.read(1);
units=rupees/5.0;
lcd.setCursor(0,0);
lcd.print("Units:");
lcd.print(units);
lcd.print(" ");
lcd.setCursor(0,1);
if(rupees<15)
lcd.print("LOW Balance:");
else
lcd.print("Balance:");
lcd.print(rupees);
lcd.print(" ");
read_pulse();
check_status();
if(temp==1)
{
decode_message();
send_confirmation_sms();
}
}
void serialEvent()
{
while(Serial.available())
{
char ch=(char)Serial.read();
str[i++]=ch;
if(ch == '*')
{
temp=1;
lcd.clear();
lcd.print("Message Received");
delay(500);
break;
}
}
}
void init_sms()
{
Serial.println("AT+CMGF=1");
delay(200);
Serial.println("AT+CMGS=\"+918287114222\"");
delay(200);
}
void send_sms()
{
Serial.write(26);
}
void read_pulse()
{
if(!digitalRead(pulsein))
{
digitalWrite(led, HIGH);
//count++;
//units=watt_factor*count/1000;
if(units<1){}
else
units--;
rupees=units*5;
EEPROM.write(1,rupees);
while(!digitalRead(pulsein));
digitalWrite(led,LOW);
// delay(2000);
}
}
void check_status()
{
if(rupees>15)
{
digitalWrite(relay, HIGH);
flag1=0;
flag2=0;
}
if(rupees<15 && flag1==0)
{
lcd.setCursor(0,1);
lcd.print("LOW Balance ");
init_sms();
send_data("Energy Meter Balance Alert:");
send_data("Low Balance\n");
Serial.println(rupees);
delay(200);
send_data("Please recharge your energy meter soon.\n Thank you");
send_sms();
message_sent();
flag1=1;
}
if(rupees<5 && flag2==0)
{
digitalWrite(relay, LOW);
lcd.clear();
lcd.print("Light Cut Due to");
lcd.setCursor(0,1);
lcd.print("Low Balance");
delay(2000);
lcd.clear();
lcd.print("Please Recharge ");
lcd.setCursor(0,1);
lcd.print("UR Energy Meter ");
init_sms();
send_data("Energy Meter Balance Alert:\nLight cut due to low Balance\nPlease
recharge your energy meter soon.\n Thank you");
send_sms();
message_sent();
flag2=1;
}
}
void decode_message()
{
x=0,k=0,temp=0;
while(x<i)
{
while(str[x]=='#')
{
x++;
bal="";
while(str[x]!='*')
{
bal+=str[x++];
}
}
x++;
}
bal+='\0';
}
void send_confirmation_sms()
{
int recharge_amount=bal.toInt();
rupees+=recharge_amount;
EEPROM.write(1, rupees);
lcd.clear();
lcd.print("Energy Meter ");
lcd.setCursor(0,1);
lcd.print("Recharged:");
lcd.print(recharge_amount);
init_sms();
send_data("Energy Meter Balance Alert:\nYour energy meter has been recharged
Rs:");
send_data(bal);
send_data("Total Balance:");
Serial.println(rupees);
delay(200);
send_data("Eelctricity Has Been Connected\nThank you");
send_sms();
temp=0;
i=0;
x=0;
k=0;
delay(1000);
message_sent();
}
void message_sent()
{
lcd.clear();
lcd.print("Message Sent.");
delay(1000);
}
void gsm_init()
{
lcd.clear();
lcd.print("Finding Module..");
boolean at_flag=1;
while(at_flag)
{
Serial.println("AT");
while(Serial.available()>0)
{
if(Serial.find("OK"))
at_flag=0;
}
delay(1000);
}
lcd.clear();
lcd.print("Module Connected..");
delay(1000);
lcd.clear();
lcd.print("Disabling ECHO");
boolean echo_flag=1;
while(echo_flag)
{
Serial.println("ATE0");
while(Serial.available()>0)
{
if(Serial.find("OK"))
echo_flag=0;
}
delay(1000);
}
lcd.clear();
lcd.print("Echo OFF");
delay(1000);
lcd.clear();
lcd.print("Finding Network..");
boolean net_flag=1;
while(net_flag)
{
Serial.println("AT+CPIN?");
while(Serial.available()>0)
{
if(Serial.find("+CPIN: READY"))
net_flag=0;
}
delay(1000);
}
lcd.clear();
lcd.print("Network Found..");
delay(1000);
lcd.clear();
}
Link: https://circuitdigest.com/microcontroller-projects/prepaid-energy-meter-using-gsm-and-arduino