Untitled

 avatar
unknown
plain_text
2 months ago
7.8 kB
2
Indexable
/*
@Author : Mayur Khatri
Description: Smart Energy Meter 
Last Edited: 01-May-2016
Implementatation: GSM Module shield implementation with arduino tested with LCD.

*/
#include <SoftwareSerial.h>
#include <LiquidCrystal.h> // Importing LCD Library file
/*
 * RS: Pin 12
 * EN: Pin 11
 * D4: Pin 5
 * D5: Pin 4
 * D6: Pin 3
 * D7: Pin 2
 */
LiquidCrystal lcd (12, 11, 5, 4, 3, 2); //lcd display pin
 
char mobileNumber; // Will hold the incoming character from the GSM shield
SoftwareSerial SIM900(9, 10);
const int voltageSensor = A0; // voltage pin
const int currentSensor = A1; // current pin
int mVperAmp = 66; // use 100 for 20A Module and 66 for 30A Module
double sumWH = 0.00000;
float WH = 0;//energy consumption in watt hour 
double sumRupees = 0.00000;//Total energy consumption in rupees 
float rupees = 0;//energy consumption in rupees
double Voltage = 0;//AC supply peak voltage
double vrms = 0;//AC supply rms voltage
double current = 0;//load peak current
double irms = 0;//load rms current
double power = 0;//

void setup()
{ 
 
 Serial.begin(19200); 
 SIM900.begin(19200);
 delay(500); 
 SIM900.print("AT+CLIP=1\r"); // turn on caller ID notification , to get missed call number
 delay(100);  
 lcd.begin(16,2); // Display Columms, Rows and Size
 lcd.clear(); 

}

// Used to send Total Energy Consumption Billing to Customer
void sendBilling()
{
  SIM900.println("AT+CLIP=1\r");
  SIM900.println("AT+CMGF=1");    // Setting the GSM Module in Text mode
  delay(1000);  
  SIM900.println("AT+CMGS=\"XXXXXXXXXX\"\r"); // Sending Energy Consumption to Customer's Mobile Number
  delay(1000);
  
    SIM900.print("Dear Customer, Your Energy Consumption is :");
    SIM900.print(sumWH);
    SIM900.print(" and Total Billing is Rs. ");
    SIM900.print(sumRupees);
  
  delay(100);
  SIM900.println((char)26); // ASCII code of CTRL+Z
  delay(100);
}


void energyCalculations()
{
  // getting voltage from Input PIN
 Voltage = getVPP(0);
 vrms = (Voltage / 2.0) * 0.707 * 575; //find total voltage
  Serial.print("VOLTAGE : "); 
  Serial.print(vrms);
  Serial.println("Volt"); 
 // getting current from Input PIN
 current = getVPP(1);
 irms = (current / 2.0) * 0.707 * 1000 / mVperAmp; 
 // Serial.print("CURRENT :"); 
 // Serial.print(irms);
 // Serial.println("Amps"); 
 power=(vrms * irms * 0.3099);
 
 //Serial.print("POWER :"); 
// Serial.print(power);
 //Serial.println("watt"); 


 WH = (power / 3600);
 //Serial.print("ENERGY CONSUMED :"); 
 //Serial.print(WH);
 //Serial.println("Watt-Hour"); 

 sumWH = sumWH + WH;
 //Serial.print("TOTAL ENERGY CONSUMED :"); 
 //Serial.print(sumWH);
 //Serial.println("Watt-Hour"); 

 
 rupees = getReading();
 // Serial.print("ENERGY CONSUMED IN RUPEES :"); 
 //Serial.print(rupees);
 // Serial.println("Rs."); 

 sumRupees = sumRupees + rupees ;
 //Serial.print("TOTAL ENERGY CONSUMED IN RUPEES :"); 
 //Serial.print(sumRupees);
 //Serial.println("Rs."); 
 //Serial.println(""); // print the next sets of parameter after a blank line

 lcd.setCursor(1,0); // set the cursor at 1st col and 1st row
 lcd.print(vrms);
 lcd.print("v ");
 lcd.print(irms);
 lcd.print("A");
 lcd.setCursor(1,1); // set the cursor at 1st col and 2nd row
 lcd.print(power);                                                                                
 lcd.print("w");
 //delay(1000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1,0); // set the cursor at 1st col and 1st row
 lcd.print(WH);
 lcd.print("WH ");                                                                                                 
 lcd.setCursor(1,1); // set the cursor at 1st col and 2nd row
 lcd.print(rupees);
 lcd.print("Rs.");
 //delay(1000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1,0); // set the cursor at 1st col and 1st row 
 lcd.print(sumWH);
 lcd.print("Total WH ");
 lcd.setCursor(1,1); // set the cursor at 1st col and 2nd row
 lcd.print(sumRupees);
 lcd.print("Total Rs.");
 //delay(1000);
 lcd.clear();

}

void loop()
{





energyCalculations();
gsm();


//if(SIM900.available() > 0)
//  {
//   Serial.println("Inside SIM900 avaialble");
//   Serial.write(SIM900.read()); 
//   delay(200);
//  }
   

}

void gsm() 
{
  //Serial.println("Inside GSM");
  if(SIM900.available() > 0)
  {
    //Serial.println("SIM900 is available");   

    delay(10);
    mobileNumber = SIM900.read();
    Serial.print(mobileNumber); 
    if(mobileNumber == 'X')
      {
        delay(10);
        mobileNumber = SIM900.read();
        if(mobileNumber == 'X')
        {
          delay(10);
          mobileNumber = SIM900.read();
          if(mobileNumber == 'X')
            {
              delay(10);
              mobileNumber = SIM900.read();
              if(mobileNumber == 'X')
                {
                    delay(10);
                    mobileNumber = SIM900.read();
                    if(mobileNumber == 'X')
                    {
                        delay(10);
                        mobileNumber = SIM900.read();
                        if(mobileNumber == 'X')
                        {
                          delay(10);
                          mobileNumber = SIM900.read();
                          if(mobileNumber == 'X')
                          {
                            delay(10);
                            mobileNumber = SIM900.read();
                            if(mobileNumber == 'X')
                            {
                              delay(10);
                              mobileNumber = SIM900.read();
                              if(mobileNumber == 'X')
                              {
                                delay(10);
                                mobileNumber = SIM900.read();
                                if(mobileNumber == 'X')
                                {
                                 // delay(10);
                                  Serial.println("Number Matched !");
                                  Serial.println("Sending Billing to Customer");
                                  //delay(90000);
                                  sendBilling();
                                }
                              }
                            }
                          }
                        }
                    }
                }
            
          
             }
        }
      }
                
    
    
    

  }
}


float getVPP(int pinValue)
{
  // pinValue = 0 means it is Voltage Input , pinValue = 1 means it is Current Input
  float result;
  
  int readValue;             // value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1024;          // store min value here
  
   uint32_t start_time = millis();
   while((millis() - start_time) < 1000) //sample for 1 Sec
   {
        if(pinValue == 0)
       {
          // reading Voltage Input PIN
          readValue = analogRead(voltageSensor);
       }
       else if(pinValue == 1)
       {  
          // reading Current Input PIN
            readValue = analogRead(currentSensor);       
       }
       
       // see if you have a new maxValue
       if (readValue > maxValue) 
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
       if (readValue < minValue) 
       {
           /*record the maximum sensor value*/
           minValue = readValue;
       }
   }
   
   // Subtract min from max
   result = ((maxValue - minValue) * 5.0) / 1024.0;
      
   return result;
 }

  
 float getReading()
 { 

 float solution;
 
 if(sumWH <= 50)
  solution = (WH * 3.15);
 if(( sumWH > 50 ) && ( sumWH <= 100 ))
  solution = ( WH * 3.60 );
 if(( sumWH > 100 ) && (sumWH <= 250))
  solution = (WH * 4.25);
 if(sumWH > 250)
  solution = (WH * 5.20);
 
 return solution;
 
 }
Editor is loading...
Leave a Comment