//=========================================================================LCD #1
  #include <Wire.h> 
  #include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x27,20,4);  

//=========================================================================ULTRAOSNIC #2
  #define echoPin 11 //echo Pin
  #define trigPin 12  //Trig Pin

  long duration; 
  int distance;
  float cm;

//=========================================================================RTC #3
  #include "Arduino.h"
  #include "uRTCLib.h"
  uRTCLib rtc(0x68);

  char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  //CHECKED


//=========================================================================SDcard #4
  #include<SPI.h>
  #include<SD.h>
  File myFile;

//=========================================================================Keypad #5
  #include <Keypad.h>

  const uint8_t ROWS = 4;
  const uint8_t COLS = 4; 

  char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
  };

  uint8_t rowPins[ROWS] = {39,38,37,36}; 
  uint8_t colPins[COLS] = {35,34,33,32}; 

  Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
  String inputKey = "";

//=========================================================================Thermal Printer #6
  #include<SoftwareSerial.h>
  SoftwareSerial Printer(3,13); //RX TX

//=====================================================================Weight Scale #7
#include <HX711.h> 
HX711 scale;
#define calibration_factor -23980
#define LOADCELL_DOUT_PIN  A0
#define LOADCELL_SCK_PIN  A1
float weight = 0;

void setup()
{
Serial.begin(9600);
Printer.begin(9600);
delay(500); 

//WeightScale
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale(calibration_factor);
  scale.tare();
  
//RealTimeClock
  URTCLIB_WIRE.begin();

  // Comment out below line once you set the date & time.
   rtc.set(0, 56, 12, 6, 13, 1, 23);
  // rtc.set(second, minute, hour, dayOfWeek, dayOfMonth, month, year)
  // set day of week (1=Sunday, 7=Saturday)

//Ultrasonic
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  
// Liquid Crystal Disyplay
  lcd.init();                      
  lcd.init();
  lcd.backlight();

//============================================================================SETUP======BOOTING
  
  lcd.setCursor(3,1);
  lcd.print("Portable BMI");
  lcd.setCursor(6,2);
  lcd.print("Machine");
  delay(2000);
  lcd.clear();
  /*
  if (!SD.begin(4))
  {
    lcd.setCursor(3,2);
    lcd.print("--Not Found--");
    lcd.setCursor(4,3);
    lcd.print("Walk-In Mode");
    while (1);
  }
  lcd.setCursor(2,2);
  lcd.print("Good");
  delay(2000);
  lcd.clear();
 */


}
void loop() //===================================VOID LOOOP ================
{

//Ultrasonic
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  int maxheight = 194.9;
cm = maxheight - cm;



char keys = keypad.getKey();

switch(keys)
{
  case 'A': 
    checkbmistatus(); 
    keys= "";
  
  break;
  
  case 'B': 
    lcd.clear();
    char key = keypad.getKey();
    lcd.setCursor(0,0);
    lcd.print("Enter ID#:");
    lcd.setCursor(2,1);
    lcd.print("02-");
    lcd.setCursor(0,3);
    lcd.print("D) Enter");
    if (key != NO_KEY) 
    {
    if(key!='D') 
    {
      inputKey = inputKey + key; //append to input storage
      lcd.setCursor(5,1);
      lcd.print(inputKey);
    } 
    else {
    myFile = SD.open(inputKey);
    if (myFile){
    // Printer.print("ID#:") 
    // Printer.print(InputKey);
    // Printer.print("");
    while (myFile.available()) {
    // Printer.write(myFile.read());
    // Printer.print("");
    // Printer.print("");  
    }
    myFile.close();
    }
    else 
    {
    // if the file didn't open, print an error:
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("ID# not Exist!");
    lcd.setCursor(2,1);
    lcd.print("02-");
    lcd.setCursor(5,1);
    lcd.print(inputKey);
    inputKey="";
    delay(3000);
    lcd.clear();
    } 
    }  
    }
  break; 
  
  case'D':

    lcd.setCursor(0,0);
    lcd.print("Portable BMI");
    lcd.setCursor(0,1);
    lcd.print("A)Check BMI ");
    lcd.setCursor(0,2);
    lcd.print("B)Print Old Status");
    keys="";
  break;
  
}

}//===============================================================================EndLoop


//=============================================VOID RTC
  void RTC()
  {
  rtc.refresh();
  lcd.setCursor(0,3);
  lcd.print(daysOfTheWeek[rtc.dayOfWeek()-1]);
  delay(1000);
  }//end


//==========================AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA===================CHECK BMI STATUS

void checkbmistatus()
{   

//WeightScale
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale(calibration_factor);
  scale.tare();


  float height = 0;
  float calculateBMI = 0;

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("  Please Stand on     ");
  lcd.setCursor(0,1);
  lcd.print("   the Platform");

  int x = 6;
  while (x !=0)
  {
  weight  =   (scale.get_units());
 height = (cm/100)*(cm/100);
 calculateBMI =  weight/height;
  x--;  
  lcd.setCursor(9,2);
  lcd.print(x);
  delay(1000);
  }

//Calculation BMI

  weight  =  (scale.get_units()) /42 *(0.1);
  height = (cm/100)*(cm/100);
  calculateBMI =  weight/height;

  char BMI = " ";

  if (calculateBMI < 18.5)
  { 
  BMI = "Underweight";
          delay(1000);  
  }
  else if (calculateBMI >= 18.5 && calculateBMI <=24.9)
  {
  BMI = "Normal";
          delay(1000); 
  }
  else if (calculateBMI >= 25 && calculateBMI <=29.9)
  {
   BMI = "Overweight";
          delay(1000); 
  }
  else if (calculateBMI >=30 && calculateBMI <=34.9)
  {
  BMI = "Obese I";
          delay(1000); 
  }
  else if (calculateBMI >=35 && calculateBMI <=39.9)
  {
  BMI = "Obese II";
          delay(1000); 
  }
  else if (calculateBMI >=40)
  {
  BMI = "Obese III";
          delay(1000); 
  }

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Calculation");
lcd.setCursor(0,1);
lcd.print("Complete!");
delay(2000);

lcd.clear();
lcd.setCursor(0,0);
lcd.print(BMI);
lcd.setCursor(0,1);
lcd.print("Complete!");
delay(2000);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Want to save?");
lcd.setCursor(0,1);
lcd.print("A = Yes");
lcd.setCursor(0,2);
lcd.print("B = No");


char keys = keypad.getKey();

if(keys== 'C');
{
 
  if (keys != NO_KEY) {
   
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("Enter ID#");
    lcd.setCursor(0,2);
    inputKey = inputKey + keys;
    lcd.setCursor(0,3);
    lcd.print(keys);
    
    if(keys !='D') {
  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.println("input ID#");
    myFile = SD.open(inputKey, FILE_WRITE);  
    if (myFile) {
    myFile.print(daysOfTheWeek[rtc.dayOfWeek()-1]);
    myFile.print("Height:");
    myFile.print(height);
    myFile.print("Weight:");
    myFile.print(weight);
    myFile.print("BMI:");
    myFile.print(BMI);

    // close the file:
    myFile.close();
   
    
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.println("ID# created!");
    
    
}
    }
  }
}


}//endloop



  

  






GND5VSDASCLSQWRTCDS1307+