You are on page 1of 10

#include <LiquidCrystal.

h>
#include <EEPROM.h>
#include <SoftwareSerial.h>

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);


SoftwareSerial mySerial(10, 11); // RX, TX

#define load 9

const byte interruptPin = 2;


char card_no[15], irq_uc = 0;

int pulse = 0, unit = 0, intrr = 0;

const static char card1[] = "2100202F4A64";


char read_data = 0, newcard = 0;

volatile char eminter = 0;


volatile char units = 0;

int irq_wifi, irq_gsm = 0;


char result[3];

unsigned char gsm[64];


char mobilenum[11] = "8099495301";
char msg[30];

void gsm_init(void);
char gsm_clear_msg(char num);
void gsm_send_num_mesg1(char *num, char *msg1, char *msg2, char *msg3, char *msg4);

void load_on()
{
pinMode(load, OUTPUT);
digitalWrite(load, LOW);
}
void load_off()
{
pinMode(load, OUTPUT);
digitalWrite(load, HIGH);
}

void clear_gsm()
{
unsigned char uc;
for (uc = 0; uc < 70; uc++)
gsm[uc] = '\0';
}

void read_gsm(void)
{
while (Serial.available())
{
gsm[irq_gsm] = Serial.read();
irq_gsm++;
if (irq_gsm > 62)
irq_gsm = 63;
}
}
//==============================
void blink()
{
pulse++;
if ((pulse / 4) == 3)
{
pulse = 0;
unit++;
intrr = 1;
}
}

int t_units = 0, ba_units = 0;

void setup()
{
load_off();

Serial.begin(9600);
mySerial.begin(9600);

lcd.begin(16, 2);
lcd.clear(); lcd.setCursor(4, 0); lcd.print("WELCOME"); delay(2000);

pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);

lcd.clear(); lcd.print(F("PREPAID ENERGY "));


lcd.setCursor(0, 1); lcd.print(F("METER With GSM")); delay(2000);

//EEPROM.write(1, 6); delay(30);


//EEPROM.write(2, 0);

ba_units = EEPROM.read(1); delay(30);


t_units = EEPROM.read(2); delay(30);

lcd.clear(); lcd.print(F("GSM init ....")); //delay(1000);

gsm_init();
gsm_clear_msg(1); gsm_clear_msg(2);

lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("Send any MSG to "));
lcd.setCursor(0, 1); lcd.print(F("Store ur ph.num "));
clear_gsm(); irq_gsm = 0;
delay(200);

while (1)
{
if (Serial.available())
{
delay(300); read_gsm(); clear_gsm(); irq_gsm = 0;

Serial.print("AT+CMGR=1"); irq_gsm = 0; Serial.println(); delay(500);


read_gsm();
//lcd.clear();
//lcd.write(gsm[2]); lcd.write(gsm[3]); lcd.write(gsm[4]);
lcd.write(gsm[5]); lcd.write(gsm[6]);

if (gsm[2] == '+' && gsm[3] == 'C' && gsm[4] == 'M' && gsm[5] == 'G' &&
gsm[6] == 'R' && gsm[7] == ':')
{
lcd.clear(); lcd.setCursor(2, 0); lcd.print(F("I GOT MSG")); delay(1000);
read_msg();

lcd.clear();
lcd.setCursor(0, 0); lcd.print((String)mobilenum);
lcd.setCursor(0, 1); lcd.print((String)msg); delay(3000);
irq_gsm = 0;

//gsm_send_num_mesg1(mobilenum, (char *)"Mobile number stored


successfully", "", "", ""); delay(100);
break;
}
else
{
read_gsm(); delay(500); clear_gsm(); irq_gsm = 0;
}
}
}
}

/*
char bal = 0, bal_f, send_bit = 1, war = 1, bit_s = 0;
int bill_status = 0, m_bill = 0;
char s1[10], s2[10], s3[10], s4[10], s5[10], s6[10], s7[10];

int pls, t_unit = 0, s_cnt = 0, m_cnt = 0;


int bill = 0, count = 0, cnt = 0, balance = 10;
*/

void loop()
{
int cnt = 0;
intrr = 0;
char firsttime = 1, l1 = 1;

start:
lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("P: BU: "));
lcd.setCursor(0, 1); lcd.print(F("TU: "));

lcd.setCursor(2, 0); lcd.print(pulse / 2);


lcd.setCursor(10, 0); lcd.print(ba_units);

lcd.setCursor(3, 1); lcd.print(t_units); delay(100);

while (1)
{
lcd.setCursor(2, 0); lcd.print(pulse / 2);

if (mySerial.available())
{
lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("card detected.."));
delay(1500);

cnt = 0; delay(20);
while ( (mySerial.available()) && (cnt < 13)) // Read 12 characters
and store them in input array
{
card_no[cnt] = mySerial.read();
cnt++;
}
card_no[12] = '\0';// Print RFID tag number
newcard = 1;
}
if (newcard == 1)
{
newcard = 0;
delay(100);
if (!strcmp(card_no, card1))
{
lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("authorised card."));
lcd.setCursor(0, 1); lcd.print(F("C.MNY:10/- ")); delay(2000);

lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("Unit Cost:5/-"));
lcd.setCursor(0, 1); lcd.print(F("YOU GOT 2 UNITS")); delay(2000);

ba_units = EEPROM.read(1); delay(50);

lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("Pre Bal Uni:"));
lcd.setCursor(12, 0); lcd.print(ba_units + 0); delay(2000);

EEPROM.write(1, ba_units);
ba_units = EEPROM.read(1);

lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("Recharged Succes"));
lcd.setCursor(0, 1); lcd.print("P.Bal:");
lcd.setCursor(8, 1); lcd.print(ba_units + 0); delay(2000);
}
else
{
lcd.setCursor(0, 1); lcd.print(F("un auth card..."));
}
lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("P: BU: "));
lcd.setCursor(0, 1); lcd.print(F("TU: "));

lcd.setCursor(10, 0); lcd.print(ba_units);

lcd.setCursor(3, 1); lcd.print(t_units); delay(100);

if (ba_units > 0)
{
load_on();
}
else
{
load_off();
}

if (intrr == 1)
{
t_units = (t_units + 1);
EEPROM.write(1, ba_units); delay(100);
EEPROM.write(2, t_units); delay(100);
intrr = 0;
ba_units = EEPROM.read(1);
t_units = EEPROM.read(2);

lcd.clear();
lcd.setCursor(0, 0); lcd.print(F("P: BU: "));
lcd.setCursor(0, 1); lcd.print(F("TU: "));

lcd.setCursor(2, 0); lcd.print(pulse / 2);


lcd.setCursor(10, 0); lcd.print(ba_units);

lcd.setCursor(3, 1); lcd.print(t_units); delay(100);

if (ba_units < 4 && firsttime == 1)


{
firsttime = 0;
lcd.clear(); lcd.print(F("YOUR HAVE LOW U"));
lcd.setCursor(0, 1); lcd.print(F("PLZ RECHARGE...")); delay(2000);

gsm_send_num_mesg1(mobilenum, (char *)"Please recharge, Your are running with


low balance ", "", "", "");
goto start;
}
if (ba_units == 0 && l1 == 1)
{
l1 = 0;
lcd.clear(); lcd.print(F("YOUR HAVE NO U"));
lcd.setCursor(0, 1); lcd.print(F("POWER OFF")); delay(2000);

gsm_send_num_mesg1(mobilenum, (char *)"YOU HAVE NO BALANCE , POWER OFF ", "",


"", "");
goto start;
}
if (ba_units > 0)
l1 = 1;
if (ba_units > 4)
firsttime = 1;
}
}

void gsm_init(void)
{
char E_count = 0;

gsminit:
clear_gsm();
lcd.clear(); lcd.print(F("GSM INIT..."));
Serial.print("AT"); irq_gsm = 0; Serial.println(); delay(500);
Serial.print("ATE0"); irq_gsm = 0; Serial.println(); delay(500);

read_gsm(); clear_gsm(); E_count = 0;


AT:
delay(100);
Serial.print("AT"); irq_gsm = 0; Serial.println(); delay(500);
read_gsm();

if (gsm[2] == 'O' && gsm[3] == 'K')


{
lcd.clear(); lcd.print(F("AT : OK")); delay(500);
}
else
{
E_count++;
lcd.clear(); lcd.print(F(" GSM Not"));
lcd.setCursor(0, 1); lcd.print(F(" Conected")); delay(500);
if (E_count > 9)
{
E_count = 0;
goto gsminit;
}
goto AT;
}

clear_gsm(); E_count = 0;
ATCPIN:
Serial.print("AT+CPIN?"); Serial.println(); irq_gsm = 0; delay(500);
read_gsm();

if (gsm[2] == '+' && gsm[3] == 'C' && gsm[4] == 'P' && gsm[5] == 'I' && gsm[6] ==
'N' && gsm[7] == ':' && gsm[8] == ' ' && gsm[9] == 'R')
{
lcd.clear(); lcd.print(F(" SIM "));
lcd.setCursor(0, 1); lcd.print(F(" CONNECTED")); delay(800);
}
else
{
E_count++;
lcd.clear(); lcd.print(F("SIM CHECKING "));
lcd.setCursor(0, 1); lcd.print(F(" PLEASE WAIT")); delay(800);
if (E_count > 20)
{
E_count = 0;
goto gsminit;
}
goto ATCPIN;
}

clear_gsm(); E_count = 0;

clear_gsm(); E_count = 0;
ATCMGF:
Serial.print("AT+CMGF=1"); irq_gsm = 0; Serial.println(); delay(500);
read_gsm();

if (gsm[2] == 'O' && gsm[3] == 'K')


{
lcd.clear(); lcd.print(F("TEXT MODE OK")); delay(800);
}
else
{
E_count++;
lcd.clear(); lcd.print(F("TEXT MODE NOT"));
lcd.setCursor(0, 1); lcd.print(F(" OK ")); delay(800);
if (E_count > 20)
{
E_count = 0;
goto gsminit;
}
goto ATCMGF;
}

clear_gsm(); E_count = 0;
ATCNMI:
Serial.print("AT+CNMI=2,1"); irq_gsm = 0; Serial.println(); delay(500);
read_gsm();

if (gsm[2] == 'O' && gsm[3] == 'K')


{
lcd.clear(); lcd.print(F("SMS Settings OK")); delay(1000);
}
else
{
E_count++;
lcd.clear(); lcd.print(F("SMS Settings "));
lcd.setCursor(0, 1); lcd.print(F(" NOT OK ")); delay(1000);
if (E_count > 20)
{
E_count = 0;
goto gsminit;
}
goto ATCNMI;
}

}
char gsm_clear_msg(char num)
{
char E_count = 0;

clear_gsm(); E_count = 0;
ATCMGD:
Serial.print("AT+CMGD="); Serial.print(num, DEC); irq_gsm = 0;
Serial.println(); delay(500);
read_gsm();

if (gsm[2] == 'O' && gsm[3] == 'K')


{
lcd.clear(); lcd.print(F(" MSG DELETED")); delay(800);
}
else
{
E_count++;
lcd.clear(); lcd.print(F("MSG DELETE ERROR")); delay(800);
if (E_count > 50)
{
E_count = 0;
return (0);
}
goto ATCMGD;
}
return (1);
}

void gsm_send_num_mesg1(char *num, char *msg1, char *msg2, char *msg3, char *msg4)
{
lcd.clear(); lcd.print(F("MSG SENDING..."));
lcd.setCursor(0, 1); lcd.print((String )num); delay(500);
Serial.print("AT+CMGS="); Serial.print('"'); Serial.print((String)num);
Serial.print('"');
Serial.println(""); delay(1000);
Serial.print((String)msg1);
Serial.print('\n');
Serial.print((String)msg2);
Serial.print('\n');
Serial.print((String)msg3);
Serial.print('\n');
Serial.print((String)msg4);
Serial.print(" "); delay(500);
Serial.write(0x1A); delay(500);
read_gsm();
while (!Serial.available());
delay(3000);
irq_gsm = 0; clear_gsm();
read_gsm();

lcd.clear();
//lcd.print(gsm); delay(3000);
if (gsm[2] == '+' && gsm[3] == 'C')
{
lcd.print(F(" MSG SENT "));
lcd.setCursor(0, 1); lcd.print(F(" Successfully"));
}
else
{
lcd.print(F(" MSG Sending "));
lcd.setCursor(0, 1); lcd.print(F("Error"));
}
Serial.println(); delay(2000);
}

void read_msg()
{
unsigned char a, b, i, count, numcnt, j;

while (Serial.available())
{
j = !Serial.available();
delay(100);
}

Serial.print("AT+CMGR=1");
Serial.println();

count = 0;
i = 0;
a = 0;
numcnt = 0;

while (count != 3)
{
while (!Serial.available());
b = Serial.read();;

if ((b == ',') || (a == 1))


{
if (numcnt < 15)
{
if (numcnt > 4)
{
mobilenum[numcnt - 5] = b;
}
a = 1;
numcnt++;
}
else
a = 0;
}
if (count == 2)
{
msg[i] = b;
i++;
}
j = 0;
if (b == 10)
count += 1;
}
msg[--i] = '\0';
msg[--i] = '\0';
mobilenum[10] = '\0';
Serial.print("AT+CMGD=1");
Serial.println(); delay(500);
}

You might also like