You are on page 1of 31

Code

#include <SD.h>
#include <SPI.h>
#include <DS3231.h>
#include <LiquidCrystal.h>

//LiquidCrystal lcd1(A0, A1, A2, A3, A4, A5);


//LiquidCrystal lcd2(26, 28, 30, 32, 34, 36);

LiquidCrystal lcd2(A0, A1, A2, A3, A4, A5);


LiquidCrystal lcd1(26, 28, 30, 32, 34, 36);

DS3231 rtc(SDA, SCL);

void pem(); //display Personal Energy Meter


void menu();
void peakpower(); // display Peak Power
void tec(); //display Total Energy Consumed
void voltage_current(); //display voltage and current
void power_peakpower(); // display power and peak power
void tpc_tec(); // display total power consumed and total energy consumed
void scrollup();
void scrolldown();
void Limits();
void maxvalues();
void Cursor1();
void Cursor2();
void Cursor3();

72
void Cursor4();
void option1();
void option2();
void option3();
void option4();
void option30();
void option31();
void option32();
void GetTEC();
void GetPeakPower();
void GetDates();
void SaveTEC();
void SavePeakPower();
void ReadTEC();
void ReadPP();
void ReadDOW();
void ReadDATE();
void ReadTIME();

void DisplayTEC();
void DisplayDOW();
void DisplayDATE();
void DisplayTIME();

void kwhbytes();
void ppbytes();
void ClearLCD1();
void ClearLCD2();

72
int button = 4; //interrupt button display for LCD1
int button2 = 5; //interrupt button display for LCD2
int buttondown = 1; //interrupt button for scroll down
int buttonup = 0; //interrupt button for scroll up
int state = 0; //mode displays for LCD1
int state2 = 0; //mode displays for LCD2
int scrollstate = 0;
int scrollstate2 = 0;

int clr1 = 0; //variable for function ClearLCD1();


int clr2 = 0; //variable for function ClearLCD2();

File myFile;
const int CSpin = 49;
float totalbytes = 0; //store total bytes read of a file in SD card
const float ppinterval = 33.00; //total bytes of a saved file in Peak Power
const float kwhinterval = 37.00; //total bytes of a saved file in KWH
float numsaves = 0; //number of saves in float
int totalnumsaves = 0; //number of saves in integer

int num = 1; //start number at 1


int ppline = 0; //first line and store line number of Peak Power saved in SD Card
int pplinemax = 0;//store last line value of Peak Power saved in SD card
int kwhline = 0; //first line and store line number of KWH saved in SD Card
int kwhlinemax = 0; //store last line value of KWH saved in SD card
int dowline = 1; //first line and store line number of DOW saved in SD Card
int dowlinemax = 0; //store last line value of DOW saved in SD card

72
int dateline = 2; //first line and store line number of Date saved in SD Card
int datelinemax = 0; //store last line value of Date saved in SD card
int timeline = 3; //first line and store line number of Time saved in SD Card
int timelinemax = 0; //store last line value of Time saved in SD card

String KWHval; //store string value of KiloWattHour


String PeakPowerval; //store string value of Peak Power
String DOW; //store string value of Day of the Week
String DATE; //store string value of Date
String TIME; //store string value of Time

//================create arrow symbol in lcd2=====================//


//===rectangle symbol===//
byte rectangle[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
//===triangle===//
byte triangle[8] = {
B11000,
B11100,
B11110,

72
B11111,
B11111,
B11110,
B11100,
B11000,
};

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lcd1.begin(20,4);
lcd2.begin(20,4);
pinMode(CSpin, OUTPUT);
SD.begin(CSpin); //initialize SD card
attachInterrupt(button, ChangeState1, RISING);
attachInterrupt(button2, ChangeState2, RISING);
attachInterrupt(buttondown, scrolldown, RISING);
attachInterrupt(buttonup, scrollup, RISING);

rtc.begin(); //initialize Real Time Clock


// rtc.setDOW(MONDAY);
// rtc.setTime(22, 38, 25); //hr:min:sec
// rtc.setDate(14, 02, 2017); //day,month,year

lcd2.createChar(0, rectangle); //store symbol rectangle


lcd2.createChar(1, triangle); //store symbol triangle
}

72
void ChangeState1(){
state++;
clr1 = 1;

if(state > 2){


state = 0;
}
}
void ChangeState2(){
state2++;
clr2 = 1;
}

void loop() {
ClearLCD1();
ClearLCD2();

//LCD1 display==============================//
switch(state){
case 0:
voltage_current();
break;

case 1:
power_peakpower();
break;

case 2:

72
tpc_tec();
break;
}

//LCD2 display===============================//
if(state2 == 0){
pem();
}
if(state2 >= 1){
menu();
}
delay(500);
}

void menu(){
switch(scrollstate){
case 0:
option1();
break;
case 1:
option2();
break;
case 2:
option3();
break;
case 3:
option4();
break;

72
}
}

void option1(){
if(state2 == 1){
lcd2.home();
Cursor1();
lcd2.setCursor(2,0);
lcd2.print("Save KWH");
lcd2.setCursor(0,1);
lcd2.print("2.Save Peak Power");
lcd2.setCursor(0,2);
lcd2.print("3.Saved Data");
lcd2.setCursor(0,3);
lcd2.print("4.Back");
}

if(state2 == 2){
myFile = SD.open("Kwh.txt", FILE_WRITE); //enable write to file
SaveTEC(); //void to save KWWH reading
lcd2.home();
lcd2.print("Saved . . .");
lcd2.setCursor(0,1);
lcd2.print("KWH Reading: ");
lcd2.setCursor(2,2);
lcd2.print(KWHval);
lcd2.setCursor(10,2);
lcd2.print(" KWH");

72
delay(2000);
lcd2.clear();
myFile.close(); //close Kwh.txt file
state2 = 1;
scrollstate = 0;
}

void option2(){
if(state2 == 1){
lcd2.home();
lcd2.print("1.Save KWH");
Cursor2();
lcd2.setCursor(2,1);
lcd2.print("Save Peak Power");
lcd2.setCursor(0,2);
lcd2.print("3.Saved Data");
lcd2.setCursor(0,3);
lcd2.print("4.Back");
}

if(state2 == 2){
myFile = SD.open("Pp.txt", FILE_WRITE); //enable write to file
SavePeakPower(); //void to save KWWH reading
lcd2.home();
lcd2.print("Saved . . .");

72
lcd2.setCursor(0,1);
lcd2.print("Peak Power Reading: ");
lcd2.setCursor(2,2);
lcd2.print(PeakPowerval);
lcd2.setCursor(7,2);
lcd2.print(" Watts");
delay(2000);
lcd2.clear();
myFile.close(); //close Kwh.txt file
state2 = 1;
scrollstate = 0;
}
}

void option3(){
if(state2 == 1){
lcd2.home();
lcd2.print("1.Save KWH");
lcd2.setCursor(0,1);
lcd2.print("2.Save Peak Power");
Cursor3();
lcd2.setCursor(2,2);
lcd2.print("Saved Data");
lcd2.setCursor(0,3);
lcd2.print("4.Back");
}

if(state2 >= 2){

72
Serial.println(state2);
switch(scrollstate2){
case 0:
option30();
break;

case 1:
option31();
break;

case 2:
option32();
break;
}
}
}

void option30(){
if(state2 == 2){
Cursor1();
lcd2.setCursor(2,0);
lcd2.print("KWH Data");
lcd2.setCursor(0,1);
lcd2.print("2.Peak Power Data");
lcd2.setCursor(0,2);
lcd2.print("3.Back");
}

72
if(state2 >= 3){
myFile = SD.open("Kwh.txt", FILE_READ);
kwhbytes();
if(state2 == 3){
if(totalnumsaves > 0){
Serial.println(num);
DisplayTEC();
DisplayDOW();
DisplayDATE();
DisplayTIME();
}
}

if(state2 == 4){
state2 = 2;
scrollstate2 = 0;
num = 1;
kwhline = 0;
dowline = 1;
dateline = 2;
timeline = 3;
}

if(totalnumsaves <= 0){


lcd2.home();
lcd2.print("No Saved Data");
delay(2000);
lcd2.clear();

72
myFile.close();
state2 = 2;
scrollstate2 = 0;
}
}
}

void option31(){
if(state2 == 2){
lcd2.home();
lcd2.print("1.KWH Data");
Cursor2();
lcd2.setCursor(2,1);
lcd2.print("Peak Power Data");
lcd2.setCursor(0,2);
lcd2.print("3.Back");
}

if(state2 >= 3){


myFile = SD.open("Pp.txt", FILE_READ);
ppbytes();
if(state2 == 3){
if(totalnumsaves > 0){
Serial.println(totalnumsaves);
DisplayPP();
DisplayDOW();
DisplayDATE();
DisplayTIME();

72
}
}

if(state2 == 4){
state2 = 2;
scrollstate2 = 0;
num = 1;
kwhline = 0;
dowline = 1;
dateline = 2;
timeline = 3;
}

if(totalnumsaves <= 0){


lcd2.home();
lcd2.print("No Saved Data");
delay(2000);
lcd2.clear();
myFile.close();
state2 = 2;
scrollstate2 = 0;
}
}
}

void option32(){
lcd2.home();
lcd2.print("1.KWH Data");

72
lcd2.setCursor(0,1);
lcd2.print("2.Peak Power Data");
Cursor3();
lcd2.setCursor(2,2);
lcd2.print("Back");

if(state2 == 3){
state2 = 1;
scrollstate = 0;
scrollstate2 = 0;
}
}

void option4(){
if(state2 == 1){
lcd2.home();
lcd2.print("1.Save KWH");
lcd2.setCursor(0,1);
lcd2.print("2.Save Peak Power");
lcd2.setCursor(0,2);
lcd2.print("3.Saved Data");
Cursor4();
lcd2.setCursor(2,3);
lcd2.print("Back");
}

//exit menu() function


if(state2 >= 2){

72
state2 = 0;
scrollstate = 0;
}
}

void pem(){
peakpower();
tec();
}

void voltage_current(){
lcd1.home();
lcd1.print("Voltage: ");
lcd1.setCursor(1,1);
lcd1.print("000.00");
lcd1.setCursor(8,1);
lcd1.print("Volts");
lcd1.setCursor(0,2);
lcd1.print("Current: ");
lcd1.setCursor(1,3);
lcd1.print("00.00");
lcd1.setCursor(7,3);
lcd1.print("Amps");
}

void power_peakpower(){
lcd1.home();

72
lcd1.print("Power: ");
lcd1.setCursor(1,1);
lcd1.print("000.00");
lcd1.setCursor(8,1);
lcd1.print("Watts");
lcd1.setCursor(0,2);
lcd1.print("Peak Power: ");
lcd1.setCursor(1,3);
lcd1.print("000.00");
lcd1.setCursor(8,3);
lcd1.print("Watts");
}

void tpc_tec(){
lcd1.home();
lcd1.print("Total Power Cons: ");
lcd1.setCursor(1,1);
lcd1.print("0000.00");
lcd1.setCursor(9,1);
lcd1.print("KW");
lcd1.setCursor(0,2);
lcd1.print("Total Energy Cons: ");
lcd1.setCursor(0,2);
lcd1.print("Total Energy Cons: ");
lcd1.setCursor(1,3);
lcd1.print("0000.00");
lcd1.setCursor(9,3);
lcd1.print("KWH");

72
}

void peakpower(){
lcd2.home();
lcd2.print("Peak Power: ");
lcd2.setCursor(1,1);
lcd2.print("000.00");
lcd2.setCursor(8,1);
lcd2.print("Watts");
}

void tec(){
lcd2.setCursor(0,2);
lcd2.print("Total Energy Cons: ");
lcd2.setCursor(1,3);
lcd2.print("0000.00");
lcd2.setCursor(9,3);
lcd2.print("KWH");
}

void SaveTEC(){
GetTEC();
GetDates();
WriteToFile(KWHval); //1st line
WriteToFile(DOW); //2nd line
WriteToFile(DATE); // 3rd line
WriteToFile(TIME); // 4th line

72
}

void SavePeakPower(){
GetPeakPower();
GetDates();
WriteToFile(PeakPowerval); //1st line
WriteToFile(DOW); //2nd line
WriteToFile(DATE); // 3rd line
WriteToFile(TIME); // 4th line
}

void GetTEC(){
KWHval = "00000.00";
}

void GetPeakPower(){
PeakPowerval = "00.00";
}

void GetDates(){
DOW = rtc.getDOWStr();
if(DOW == "Sunday"){
DOW = "SUN";
}
if(DOW == "Monday"){
DOW = "MON";
}
if(DOW == "Tuesday"){

72
DOW = "TUE";
}
if(DOW == "Wednesday"){
DOW = "WED";
}
if(DOW == "Thursday"){
DOW = "THU";
}
if(DOW == "Friday"){
DOW = "FRI";
}
if(DOW == "Saturday"){
DOW = "SAT";
}
DATE = rtc.getDateStr();
TIME = rtc.getTimeStr();
}

void DisplayTEC(){
lcd2.home();
lcd2.print(num);
lcd2.setCursor(1,0);
lcd2.print(".");
lcd2.setCursor(3,0);
ReadTEC();
lcd2.setCursor(11,0);
lcd2.print(" KWH");
}

72
void DisplayPP(){
lcd2.home();
lcd2.print(num);
lcd2.setCursor(1,0);
lcd2.print(".");
lcd2.setCursor(3,0);
ReadPP();
lcd2.setCursor(9,0);
lcd2.print("Watts");
}

void DisplayDOW(){
lcd2.setCursor(0,1);
lcd2.print("DOW: ");
lcd2.setCursor(5,1);
ReadDOW();
}

void DisplayDATE(){
lcd2.setCursor(0,2);
lcd2.print("DATE: ");
lcd2.setCursor(6,2);
ReadDATE();
}

void DisplayTIME(){
lcd2.setCursor(0,3);

72
lcd2.print("TIME: ");
lcd2.setCursor(6,3);
ReadTIME();
}

void ReadTEC(){
myFile.seek(0);
char cr;
for(unsigned int i = 0; i < kwhline;){
cr = myFile.read();
if(cr == '\n'){
i++;
}
}
while(true){
cr = myFile.read();
if((cr == '\n')||(cr == '\r')||(cr < 0))
break;
lcd2.print(cr);
}
}

void ReadPP(){
myFile.seek(0);
char cr;
for(unsigned int i = 0; i < ppline;){
cr = myFile.read();
if(cr == '\n'){

72
i++;
}
}
while(true){
cr = myFile.read();
if((cr == '\n')||(cr == '\r')||(cr < 0))
break;
lcd2.print(cr);
}
}

void ReadDOW(){
myFile.seek(0);
char cr;
for(unsigned int i = 0; i < dowline;){
cr = myFile.read();
if(cr == '\n'){
i++;
}
}
while(true){
cr = myFile.read();
if((cr == '\n')||(cr == '\r')||(cr < 0))
break;
lcd2.print(cr);
}
}

72
void ReadDATE(){
myFile.seek(0);
char cr;
for(unsigned int i = 0; i < dateline;){
cr = myFile.read();
if(cr == '\n'){
i++;
}
}
while(true){
cr = myFile.read();
if((cr == '\n')||(cr == '\r')||(cr < 0))
break;
lcd2.print(cr);
}
}

void ReadTIME(){
myFile.seek(0);
char cr;
for(unsigned int i = 0; i < timeline;){
cr = myFile.read();
if(cr == '\n'){
i++;
}
}
while(true){
cr = myFile.read();

72
if((cr == '\n')||(cr == '\r')||(cr < 0))
break;
lcd2.print(cr);
}
}

void scrollup(){
if(state2 == 1){
scrollstate--;
if(scrollstate < 0){
scrollstate = 3;
}
}

if(state2 == 2 && scrollstate == 2){


scrollstate2--;
if(scrollstate2 < 0){
scrollstate2 = 2;
}
}

if(state2 >= 3){


kwhline-=4;
ppline-=4;
dowline-=4;
dateline-=4;
timeline-=4;
num--;

72
Limits();
}
}

void scrolldown(){
if(state2 == 1){
scrollstate++;
if(scrollstate > 3){
scrollstate = 0;
}
}

if(state2 == 2 && scrollstate == 2){


scrollstate2++;
if(scrollstate2 > 2){
scrollstate2 = 0;
}
}

if(state2 >= 3){


kwhline+=4;
ppline+=4;
dowline+=4;
dateline+=4;
timeline+=4;
num++;
Limits();
}

72
// if(num < 1){
// num = 1;
// }
// if(num >= totalnumsaves){
// num = totalnumsaves;
// }
}

void Limits(){

if(num < 1){


num = 1;
}
if(num >= totalnumsaves){
num = totalnumsaves;
}

//peak power reading limits


if(ppline < 0){
ppline = 0;
}
if(ppline >= pplinemax){
ppline = pplinemax;
}

// kwh limits
if(kwhline < 0){
kwhline = 0;

72
}
if(kwhline >= kwhlinemax){
kwhline = kwhlinemax;
}

//dow limits
if(dowline < 1){
dowline= 1;
}
if(dowline >= dowlinemax){
dowline = dowlinemax;
}

//date limits
if(dateline < 2){
dateline = 2;
}
if(dateline >= datelinemax){
dateline = datelinemax;
}

//timelimits
if(timeline < 3){
timeline= 3;
}
if(timeline >= timelinemax){
timeline = timelinemax;
}

72
}

void Cursor1(){
lcd2.setCursor(0,0);
lcd2.write(byte(0));
lcd2.setCursor(1,0);
lcd2.write(byte(1));
}

void Cursor2(){
lcd2.setCursor(0,1);
lcd2.write(byte(0));
lcd2.setCursor(1,1);
lcd2.write(byte(1));
}

void Cursor3(){
lcd2.setCursor(0,2);
lcd2.write(byte(0));
lcd2.setCursor(1,2);
lcd2.write(byte(1));
}

void Cursor4(){
lcd2.setCursor(0,3);
lcd2.write(byte(0));
lcd2.setCursor(1,3);

72
lcd2.write(byte(1));
}

void maxvalues(){
kwhlinemax = (totalnumsaves*4)-4;
pplinemax = (totalnumsaves*4)-4;
dowlinemax = (totalnumsaves*4)-3;
datelinemax = (totalnumsaves*4)-2;
timelinemax = (totalnumsaves*4)-1;
}

void ppbytes(){
totalbytes = myFile.size();
numsaves = totalbytes/ppinterval;
totalnumsaves = (int)numsaves;
}

void kwhbytes(){
totalbytes = myFile.size();
numsaves = totalbytes/kwhinterval;
totalnumsaves = (int)numsaves;

maxvalues();
}

int WriteToFile(String text){


if(myFile){
myFile.println(text);

72
return 1;
}else{
return 0;
}
}

void ClearLCD1(){
if(clr1 == 1){
lcd1.clear();
}
clr1 = 0;
}

void ClearLCD2(){
if(clr2 == 1){
lcd2.clear();
}
clr2 = 0;
}

72

You might also like