#include <EEPROM.h>
#include <HCSR04.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define upb A2
#define okb A1
#define dnb A0
#define trig 7
#define echo 6
#define DT 4
#define SCK 5
#define maxHeight 250

HX711 scale;
LiquidCrystal_I2C lcd(0x27,20,4);
UltraSonicDistanceSensor distanceSensor(7,6);
SoftwareSerial mySoftwareSerial(13, 12); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

// variable use to measuer the intervals inbetween impulses
int  i=0;
// Number of impulses detected
unsigned int impulsCount=0;
// Sum of all the  coins inseted
unsigned int total_amount=0;
// number of service offered
unsigned int serviceCount=0;

void setup() 
{
  lcd.begin();
  welcomeDisplay();
  scale.begin(DT,SCK);
  EEPROM.get(0, total_amount);
  EEPROM.get(100, serviceCount);
  pinMode(upb,INPUT);
  pinMode(okb,INPUT);
  pinMode(dnb,INPUT);
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(30);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop() 
{
  
}


float getHeight()
{
  float length = distanceSensor.measureDistanceCm();
  length= maxHeight-length;
  Serial.print("length is :");
  Serial.println(length);
  return length;
}

String getSex()
{
  String sex ="MALE";
  sexDisplay(sex);
  while(digitalRead(okb)==LOW)
  {
    if(digitalRead(upb)==HIGH || digitalRead(dnb)==HIGH)
    {
      delay(500);
      if(sex =="FEMALE"){sex = "MALE";Serial.println(sex)};
      if(sex =="MALE"){sex = "FEMALE";Serial.println(sex)};
      sexDisplay(sex);
    }
  }
  Serial.print("THE CHOICE OF SEX IS: ");
  Serial.print(sex);
  return sex;
}

int getAge()
{
 int age=25;
 ageDisplay(age);
 while(digitalRead(okb)==LOW)
 {
   if(digitalRead(upb)==HIGH)
   {
    delay(500);
    age++;
    Serial.println(age);
    ageDisplay(age);
   }
   if(digitalRead(dnb)==HIGH)
   {
    delay(500);
    age--;
    Serial.println(age);
    ageDisplay(age);
   }
 }
 return age;
}

bool getpayment()
{
  attachInterrupt(0,incomingImpuls, FALLING);
  while(total_amount<200)
  {
    i=i+1;

  Serial.print("i=");
  Serial.print(i);
  Serial.print(" Impulses:");
  Serial.print(impulsCount);
  Serial.print(" Total:");
  Serial.println(total_amount);
 
   if (i>=30 and impulsCount==2)
   {
    total_amount=total_amount+100;
    impulsCount=0;
    EEPROM.put(0, total_amount);
  }
  
   if (i>=30 and impulsCount==5)
   {
    total_amount=total_amount+200;
    impulsCount=0;
    EEPROM.put(0, total_amount);
   }

  }
  detachInterrupt(digitalPinToInterrupt(2));
  return HIGH;
}

void incomingImpuls()
{
  impulsCount=impulsCount+1;
  i=0;
}

float getMass()
{
  if (scale.is_ready()) {
    scale.set_scale();    
    Serial.println("Tare... remove any weights from the scale.");
    delay(5000);
    scale.tare();
    Serial.println("Tare done...");
    Serial.print("Place a known weight on the scale...");
    delay(5000);
    long reading = scale.get_units(10);
    Serial.print("Result: ");
    Serial.println(reading);
    reading =reading;
    return reading;
  } 
  else {
    Serial.println("HX711 not found.");
    return 9999;
  }
  delay(1000);
}

/////////////////////////////// welcome display screen//////////////////////////////////////////
void welcomeDisplay()
{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" SMART BMI MACHINE ");
    lcd.setCursor(0,1);
    lcd.print(" BY GPC ICT STUDENT"); 
    lcd.setCursor(0,2);
    lcd.print("*SYSTEM INITIALIZE!*"); 
    lcd.setCursor(0,3);
    for(int i=0;i<20;i++)
    {
     lcd.setCursor(i,3); 
     lcd.print('-');
     delay(500);
    }
}

/////////////////////////////// welcome data display///////////////////////////
void sexDisplay(String text)
{
  lcd.clear();
  lcd.setCursor(0,8);
  lcd.print(text);
  lcd.setCursor(0,3);
  lcd.print("CHANGE ACCEPT CHANGE");
}

void ageDisplay(int num)
{
  lcd.clear();
  lcd.setCursor(0,8);
  lcd.print(num);
  lcd.setCursor(0,3);
  lcd.print("DOWN    ACCEPT   UP");
}#include <EEPROM.h>
#include <HCSR04.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define upb A2
#define okb A1
#define dnb A0
#define trig 7
#define echo 6
#define DT 4
#define SCK 5
#define maxHeight 250

HX711 scale;
LiquidCrystal_I2C lcd(0x27,20,4);
UltraSonicDistanceSensor distanceSensor(7,6);
SoftwareSerial mySoftwareSerial(13, 12); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

// variable use to measuer the intervals inbetween impulses
int  i=0;
// Number of impulses detected
unsigned int impulsCount=0;
// Sum of all the  coins inseted
unsigned int total_amount=0;
// number of service offered
unsigned int serviceCount=0;

void setup() 
{
  lcd.begin();
  welcomeDisplay();
  scale.begin(DT,SCK);
  EEPROM.get(0, total_amount);
  EEPROM.get(100, serviceCount);
  pinMode(upb,INPUT);
  pinMode(okb,INPUT);
  pinMode(dnb,INPUT);
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(30);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop() 
{
  
}


float getHeight()
{
  float length = distanceSensor.measureDistanceCm();
  length= maxHeight-length;
  Serial.print("length is :");
  Serial.println(length);
  return length;
}

String getSex()
{
  String sex ="MALE";
  sexDisplay(sex);
  while(digitalRead(okb)==LOW)
  {
    if(digitalRead(upb)==HIGH || digitalRead(dnb)==HIGH)
    {
      delay(500);
      if(sex =="FEMALE"){sex = "MALE";Serial.println(sex)};
      if(sex =="MALE"){sex = "FEMALE";Serial.println(sex)};
      sexDisplay(sex);
    }
  }
  Serial.print("THE CHOICE OF SEX IS: ");
  Serial.print(sex);
  return sex;
}

int getAge()
{
 int age=25;
 ageDisplay(age);
 while(digitalRead(okb)==LOW)
 {
   if(digitalRead(upb)==HIGH)
   {
    delay(500);
    age++;
    Serial.println(age);
    ageDisplay(age);
   }
   if(digitalRead(dnb)==HIGH)
   {
    delay(500);
    age--;
    Serial.println(age);
    ageDisplay(age);
   }
 }
 return age;
}

bool getpayment()
{
  attachInterrupt(0,incomingImpuls, FALLING);
  while(total_amount<200)
  {
    i=i+1;

  Serial.print("i=");
  Serial.print(i);
  Serial.print(" Impulses:");
  Serial.print(impulsCount);
  Serial.print(" Total:");
  Serial.println(total_amount);
 
   if (i>=30 and impulsCount==2)
   {
    total_amount=total_amount+100;
    impulsCount=0;
    EEPROM.put(0, total_amount);
  }
  
   if (i>=30 and impulsCount==5)
   {
    total_amount=total_amount+200;
    impulsCount=0;
    EEPROM.put(0, total_amount);
   }

  }
  detachInterrupt(digitalPinToInterrupt(2));
  return HIGH;
}

void incomingImpuls()
{
  impulsCount=impulsCount+1;
  i=0;
}

float getMass()
{
  if (scale.is_ready()) {
    scale.set_scale();    
    Serial.println("Tare... remove any weights from the scale.");
    delay(5000);
    scale.tare();
    Serial.println("Tare done...");
    Serial.print("Place a known weight on the scale...");
    delay(5000);
    long reading = scale.get_units(10);
    Serial.print("Result: ");
    Serial.println(reading);
    reading =reading;
    return reading;
  } 
  else {
    Serial.println("HX711 not found.");
    return 9999;
  }
  delay(1000);
}

/////////////////////////////// welcome display screen//////////////////////////////////////////
void welcomeDisplay()
{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" SMART BMI MACHINE ");
    lcd.setCursor(0,1);
    lcd.print(" BY GPC ICT STUDENT"); 
    lcd.setCursor(0,2);
    lcd.print("*SYSTEM INITIALIZE!*"); 
    lcd.setCursor(0,3);
    for(int i=0;i<20;i++)
    {
     lcd.setCursor(i,3); 
     lcd.print('-');
     delay(500);
    }
}

/////////////////////////////// welcome data display///////////////////////////
void sexDisplay(String text)
{
  lcd.clear();
  lcd.setCursor(0,8);
  lcd.print(text);
  lcd.setCursor(0,3);
  lcd.print("CHANGE ACCEPT CHANGE");
}

void ageDisplay(int num)
{
  lcd.clear();
  lcd.setCursor(0,8);
  lcd.print(num);
  lcd.setCursor(0,3);
  lcd.print("DOWN    ACCEPT   UP");
}#include <EEPROM.h>
#include <HCSR04.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define upb A2
#define okb A1
#define dnb A0
#define trig 7
#define echo 6
#define DT 4
#define SCK 5
#define maxHeight 250

HX711 scale;
LiquidCrystal_I2C lcd(0x27,20,4);
UltraSonicDistanceSensor distanceSensor(7,6);
SoftwareSerial mySoftwareSerial(13, 12); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

// variable use to measuer the intervals inbetween impulses
int  i=0;
// Number of impulses detected
unsigned int impulsCount=0;
// Sum of all the  coins inseted
unsigned int total_amount=0;
// number of service offered
unsigned int serviceCount=0;

void setup() 
{
  lcd.begin();
  welcomeDisplay();
  scale.begin(DT,SCK);
  EEPROM.get(0, total_amount);
  EEPROM.get(100, serviceCount);
  pinMode(upb,INPUT);
  pinMode(okb,INPUT);
  pinMode(dnb,INPUT);
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(30);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop() 
{
  
}


float getHeight()
{
  float length = distanceSensor.measureDistanceCm();
  length= maxHeight-length;
  Serial.print("length is :");
  Serial.println(length);
  return length;
}

String getSex()
{
  String sex ="MALE";
  sexDisplay(sex);
  while(digitalRead(okb)==LOW)
  {
    if(digitalRead(upb)==HIGH || digitalRead(dnb)==HIGH)
    {
      delay(500);
      if(sex =="FEMALE"){sex = "MALE";Serial.println(sex)};
      if(sex =="MALE"){sex = "FEMALE";Serial.println(sex)};
      sexDisplay(sex);
    }
  }
  Serial.print("THE CHOICE OF SEX IS: ");
  Serial.print(sex);
  return sex;
}

int getAge()
{
 int age=25;
 ageDisplay(age);
 while(digitalRead(okb)==LOW)
 {
   if(digitalRead(upb)==HIGH)
   {
    delay(500);
    age++;
    Serial.println(age);
    ageDisplay(age);
   }
   if(digitalRead(dnb)==HIGH)
   {
    delay(500);
    age--;
    Serial.println(age);
    ageDisplay(age);
   }
 }
 return age;
}

bool getpayment()
{
  attachInterrupt(0,incomingImpuls, FALLING);
  while(total_amount<200)
  {
    i=i+1;

  Serial.print("i=");
  Serial.print(i);
  Serial.print(" Impulses:");
  Serial.print(impulsCount);
  Serial.print(" Total:");
  Serial.println(total_amount);
 
   if (i>=30 and impulsCount==2)
   {
    total_amount=total_amount+100;
    impulsCount=0;
    EEPROM.put(0, total_amount);
  }
  
   if (i>=30 and impulsCount==5)
   {
    total_amount=total_amount+200;
    impulsCount=0;
    EEPROM.put(0, total_amount);
   }

  }
  detachInterrupt(digitalPinToInterrupt(2));
  return HIGH;
}

void incomingImpuls()
{
  impulsCount=impulsCount+1;
  i=0;
}

float getMass()
{
  if (scale.is_ready()) {
    scale.set_scale();    
    Serial.println("Tare... remove any weights from the scale.");
    delay(5000);
    scale.tare();
    Serial.println("Tare done...");
    Serial.print("Place a known weight on the scale...");
    delay(5000);
    long reading = scale.get_units(10);
    Serial.print("Result: ");
    Serial.println(reading);
    reading =reading;
    return reading;
  } 
  else {
    Serial.println("HX711 not found.");
    return 9999;
  }
  delay(1000);
}

/////////////////////////////// welcome display screen//////////////////////////////////////////
void welcomeDisplay()
{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" SMART BMI MACHINE ");
    lcd.setCursor(0,1);
    lcd.print(" BY GPC ICT STUDENT"); 
    lcd.setCursor(0,2);
    lcd.print("*SYSTEM INITIALIZE!*"); 
    lcd.setCursor(0,3);
    for(int i=0;i<20;i++)
    {
     lcd.setCursor(i,3); 
     lcd.print('-');
     delay(500);
    }
}

/////////////////////////////// welcome data display///////////////////////////
void sexDisplay(String text)
{
  lcd.clear();
  lcd.setCursor(0,8);
  lcd.print(text);
  lcd.setCursor(0,3);
  lcd.print("CHANGE ACCEPT CHANGE");
}

void ageDisplay(int num)
{
  lcd.clear();
  lcd.setCursor(0,8);
  lcd.print(num);
  lcd.setCursor(0,3);
  lcd.print("DOWN    ACCEPT   UP");
}