Untitled

 avatar
user_6434122
plain_text
a year ago
14 kB
5
Indexable
#include <CMBMenu.hpp>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"

#define LCDPINSCL A5
#define LCDPINSDA A4

#define BUTTON_PIN1 2
#define BUTTON_PIN2 3
#define BUTTON_PIN3 4
#define BUTTON_PIN4 5
// #define RESET_BUTTON 6
bool HOLD_BUTTON = 0;

//displaying text
const char MenuMain_[] PROGMEM = {"PROJECT"};
  //displaying menu 1
const char MenuHitung_[] PROGMEM = {"1. Hitung"};
const char MenuHitungA_[] PROGMEM = {"1.1 Berat"};
const char MenuHitungB_[] PROGMEM = {"1.2 Panjang"};
const char MenuHitungC_[] PROGMEM = {"1.3 Volume"};
const char MenuHitungD_[] PROGMEM = {"1.4 Massa Jenis"};
  //displaying menu 2
const char MenuKalibrasi_[] PROGMEM = {"2. Kalibrasi"};
const char MenuKalibrasiA_[] PROGMEM = {"2.1 S. HCSR04"};
const char MenuKalibrasiB_[] PROGMEM = {"2.2 S. HX711"};
const char MenuKalibrasiC_[] PROGMEM = {"2.3 Massa Wadah"};
  //displaying menu 3

//define function IDs
enum MenuFID {
  MenuDummy,
  MenuMain,
  MenuHitung,
  MenuHitungA,
  MenuHitungB,
  MenuHitungC,
  MenuHitungD,
  MenuKalibrasi,
  MenuKalibrasiA,
  MenuKalibrasiB,
  MenuKalibrasiC
};

enum KeyType {
  KeyNone,
  KeyLeft,
  KeyRight,
  KeyEnter,
  KeyExit,

  KeyUp, // Special
  KeyTurn,
};

// KeyType key = KeyNone;

//custom character:
const uint8_t Left[] = {
  B00001,
  B00011,
  B00111,
  B01111,
  B00111,
  B00011,
  B00001,
  B00000
};

const uint8_t Right[] = {
  B10000,
  B11000,
  B11100,
  B11110,
  B11100,
  B11000,
  B10000,
  B00000
};

const uint8_t Enter[] = {
  B00001,
  B00001,
  B00101,
  B01101,
  B11111,
  B01100,
  B00100,
  B00000
};

const uint8_t Exit[] = {
  B00000,
  B10001,
  B01010,
  B00100,
  B01010,
  B10001,
  B00000,
  B00000
};

const uint8_t Up[] = {
  B00000,
  B00100,
  B01110,
  B11111,
  B00000,
  B11111,
  B01110,
  B00100
};

//declaring libraries and function
CMBMenu<100> Menu;
LiquidCrystal_I2C lcd(0x27, 16 ,2);
HX711 scale;

//HCSR04 WORK
const uint8_t trigPin = 10;
const uint8_t echoPin = 9;
long duration;
float distanceCm;
float CalFactor_HCSR04;
float value_HCSR04 = 0;

//HX711 WORK
#define KNOWN_WEIGHT 100
#define LOADCELL_DOUT_PIN 12
#define LOADCELL_SCK_PIN 13
double CalFactor_HX711 = 0;
long LOADCELLVAL1;
long LOADCELLVAL2;
double WeightTare;

//VOLUME WORK
double VOLUME_OBJECT;
float Panjang = 14.50; //cm
float Lebar; //cm
float Tinggi; //cm

//MASSA JENIS WORK
static double Massa_Wadah = 0;

void setup() {
  pinMode(LCDPINSCL, OUTPUT);
  pinMode(LCDPINSDA, OUTPUT);
  pinMode(BUTTON_PIN1, INPUT_PULLUP);
  pinMode(BUTTON_PIN2, INPUT_PULLUP);
  pinMode(BUTTON_PIN3, INPUT_PULLUP);
  pinMode(BUTTON_PIN4, INPUT_PULLUP);
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  int fid = 0;
  KeyType key = KeyNone;
  

  Serial.begin(9600);
  lcd.begin();
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  Serial.println("LABEL,Date,Tinggi(cm),Berat(g),Volume(cm^3),Massa Jenis(g/cm^3)");

  //CreateChar
  lcd.createChar(0, Left);
  lcd.createChar(1, Right);
  lcd.createChar(2, Enter);
  lcd.createChar(3, Exit);
  lcd.createChar(4, Up);

  lcd.backlight();
  lcd.clear();
  lcd.setCursor(3,0);

  lcd.print("UAS FISIKA");
  lcd.setCursor(3,1);
  lcd.print("-PRAKTIKUM");
  delay(5000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Oleh:");
  lcd.setCursor(0,1);
  lcd.print("Pramuditya AR");
  delay(2000);
  lcd.clear();
  lcd.print("Oleh:");
  lcd.setCursor(0,1);
  lcd.print("Enrico Fran G");
  delay(2000);
  lcd.clear();
  lcd.print("Oleh:");
  lcd.setCursor(0,1);
  lcd.print("Aldo Dzar A.");
  delay(2000);
  lcd.clear();
  lcd.print("Oleh:");
  lcd.setCursor(0,1);
  lcd.print("Indyash Maryuba");
  delay(2000);
  lcd.clear();
  lcd.print("Oleh:");
  lcd.setCursor(0,1);
  lcd.print("Ketut Widya A.");
  delay(2000);
  lcd.clear();
  lcd.print("Oleh:");
  lcd.setCursor(0,1);
  lcd.print("Ni Wayan Lina S.");
  delay(2000);

  Menu.addNode(0, MenuHitung_, MenuHitung);
  Menu.addNode(1, MenuHitungA_, MenuHitungA);
  Menu.addNode(1, MenuHitungB_, MenuHitungB);
  Menu.addNode(1, MenuHitungC_, MenuHitungC);
  Menu.addNode(1, MenuHitungD_, MenuHitungD);
  Menu.addNode(0, MenuKalibrasi_, MenuKalibrasi);
  Menu.addNode(1, MenuKalibrasiA_, MenuKalibrasiA);
  Menu.addNode(1, MenuKalibrasiB_, MenuKalibrasiB);
  Menu.addNode(1, MenuKalibrasiC_, MenuKalibrasiC);

  const char* info;
  Menu.buildMenu(info);
  Menu.printMenu();

  printMenuEntry(info, fid, key);

}

void loop() {
  int fid = 0;
  // int holdfid;

  //HCSR04
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distanceCm = duration * 0.034 / 2;

  const char* info;

  bool layerChanged=false;

  lcd.setCursor(9,1);
  lcd.write(byte(0));
  lcd.setCursor(11,1);
  lcd.write(byte(1));
  lcd.setCursor(13,1);
  lcd.write(byte(2));
  lcd.setCursor(15,1);
  lcd.write(byte(3));

  KeyType key = getKey();

  switch(key) {
    case KeyExit:
      Menu.exit();
      break;
    
    case KeyEnter:
      Menu.enter(layerChanged);
      break;
    
    case KeyRight:
      Menu.right();
      break;

    case KeyLeft:
      Menu.left();
      break;

    default:
      break;
  }

  if(KeyNone != key) {
    
    fid = Menu.getInfo(info);
    // holdfid = fid;
    // Serial.println(fid);
    // Serial.println(holdfid);
    printMenuEntry(info, fid, key);
    
  }

  if((0 != fid) && (KeyEnter == key) && (!layerChanged)) {
    switch (fid){
      case MenuHitungA:
        HitungA(CalFactor_HX711);
        break;
      
      case MenuHitungB:
        HitungB(CalFactor_HCSR04, distanceCm);
        
        break;

      case MenuHitungC:
        HitungC(CalFactor_HCSR04, distanceCm);
        break;

      case MenuHitungD:
        HitungD(CalFactor_HX711, CalFactor_HCSR04, distanceCm);
        break;
      
      case MenuKalibrasiA:
        KalibrasiA(distanceCm);
        break;

      case MenuKalibrasiB:
        KalibrasiB();
        break;
      
      case MenuKalibrasiC:
        KalibrasiC(CalFactor_HX711);
        break;
      
      default:
        break;
    }
  }
}


void printMenuEntry(const char* f_info, int f_fid, int f_key){
  String info_s;
  MBHelper::stringFromPgm(f_info, info_s);

  lcd.clear();
  lcd.setCursor(0,0);
  
  lcd.print(info_s);
  

}

KeyType getKey(){
  KeyType key = KeyNone;

  // while(Serial.available() > 0){
  //   String Key_s = Serial.readString();
  //   Key_s.trim();
  //   Serial.println("");
  //   if(Key_s.equals("l")){
  //     key = KeyLeft;
  //     Serial.println("<left>");
  //   } else if(Key_s.equals("r")){
  //     key = KeyRight;
  //     Serial.println("<right>");
  //   } else if(Key_s.equals("e")){
  //     key =  KeyEnter;
  //     Serial.println("<enter>");
  //   } else if(Key_s.equals("x")){
  //     key = KeyExit;
  //     Serial.println("<exit>");
  //   }
  // }
  if ((HOLD_BUTTON == LOW) && (digitalRead(BUTTON_PIN1) == LOW)){
    key = KeyLeft;
    Serial.print("<left>");

    HOLD_BUTTON == HIGH;
    delay(1000);
  } else if ((HOLD_BUTTON == LOW) && (digitalRead(BUTTON_PIN2) == LOW)){
    key = KeyRight;
    Serial.print("<right>");

    HOLD_BUTTON == HIGH;
    delay(1000);
  } else if ((HOLD_BUTTON == LOW) && (digitalRead(BUTTON_PIN3) == LOW)){
    key = KeyEnter;
    Serial.print("<enter>");

    HOLD_BUTTON == HIGH;
    delay(1000);
  } else if ((HOLD_BUTTON == LOW) && (digitalRead(BUTTON_PIN4) == LOW)){
    key = KeyExit;
    Serial.print("<exit>");

    HOLD_BUTTON == HIGH;
    delay(1000);
  }

  return key;
}

void HitungA(long calFactor_f){ // Hitung Berat
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Berat: ");

  // scale.tare();
  
  scale.set_scale(calFactor_f);
  WeightTare = (scale.get_units(50));
  double WEIGHT_OBJECT = WeightTare - Massa_Wadah;

  Serial.print("\t| average:\t");
  Serial.println(WEIGHT_OBJECT);

  // lcd.print((WeightTare));

  if (WEIGHT_OBJECT < -3.50){
    lcd.setCursor(0,0);
    lcd.print("Kalibrasi ...");
    lcd.setCursor(0,1);
    lcd.print("dahulu");
  } else if(WEIGHT_OBJECT < 0.40) {
    lcd.print(WEIGHT_OBJECT - WEIGHT_OBJECT);
    lcd.print("g");
  } else {
     lcd.print(WEIGHT_OBJECT);
     lcd.print("g");
  }


}

void HitungB(float CalFactor_HCSR04_f, float distanceCm_f){ // Hitung Panjang
  value_HCSR04 = CalFactor_HCSR04_f - distanceCm_f;
  lcd.setCursor(0, 0);
  lcd.print("Panjang: ");

  Serial.print("\t| panjangDumb:\t");
  Serial.println(value_HCSR04);

  if(value_HCSR04 < -1.50){a
    lcd.setCursor(0,0);
    lcd.print("Kalibrasi ...");
    lcd.setCursor(0,1);
    lcd.print("dahulu");
  } else if(value_HCSR04 < 0.50) {
    lcd.print(distanceCm_f - distanceCm_f);
    lcd.print("cm");
  } else {
    lcd.print(value_HCSR04);
    lcd.print("cm");
  }
  
}

void HitungC(float CalFactor_HCSR04_f, float distanceCm_f){ // Hitung Volume
  //FIX SHAPE
  value_HCSR04 = CalFactor_HCSR04_f - distanceCm_f;
  // Lebar = 7.36; //cm
  Tinggi =  value_HCSR04; //cm

  if(Tinggi > -1 && Tinggi < 0){
    Tinggi = 0;
  }

  VOLUME_OBJECT = Panjang/2 * (3.14*3.14) * Tinggi ;
  Serial.print("VOLUME: ");
  Serial.println(VOLUME_OBJECT);
  Serial.print("Tinggi ");
  Serial.println(Tinggi);

  if(VOLUME_OBJECT < -1.5){
    lcd.setCursor(0,0);
    lcd.print("Kalibrasipanjang");
    lcd.setCursor(0,1);
    lcd.print("dahulu");
  } else if(VOLUME_OBJECT < 0.5){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("V: ");
    lcd.print(VOLUME_OBJECT - VOLUME_OBJECT);
    lcd.print("cbc");

    lcd.setCursor(0,1);
    lcd.print("t: ");
    lcd.print(Tinggi);
    lcd.print("cm");
  } else {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("V: ");
    lcd.print(VOLUME_OBJECT);
    lcd.print("cbc");

    lcd.setCursor(0,1);
    lcd.print("t: ");
    lcd.print(Tinggi);
    lcd.print("cm");
  }

}

void HitungD(long calFactor_f, float CalFactor_HCSR04_f, float distanceCm_f){ // Hitung Massa Jenis
  lcd.clear();
  scale.set_scale(calFactor_f);
  WeightTare = (scale.get_units(50));
  double WEIGHT_OBJECT = WeightTare - Massa_Wadah;
  value_HCSR04 = CalFactor_HCSR04_f - distanceCm_f;

   //cm
  // Lebar = 7.36; //cm
  Tinggi =  value_HCSR04; //cm

  if(Tinggi > -1 && Tinggi < 0.08){
    Tinggi = 0;
  }

  VOLUME_OBJECT = Panjang/2 * (3.14*3.14) * (Tinggi);
  
  if (WEIGHT_OBJECT < -1.50 || VOLUME_OBJECT < -1.5){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Kalibrasi ...");
    lcd.setCursor(0,1);
    lcd.print("dahulu");
  } 
  
  if(WEIGHT_OBJECT < 0.08 && WeightTare > -100) {
    WeightTare = 0;
  }

  if(VOLUME_OBJECT < 0.5 && VOLUME_OBJECT > -0.1){
    VOLUME_OBJECT = 0;
  } 

  Serial.print("\t| average:\t");
  Serial.println(WEIGHT_OBJECT);
  Serial.print("\t| Volume:\t");
  Serial.println(VOLUME_OBJECT);
  Serial.print("\t| Tinggi:\t");
  Serial.println(Tinggi);


  if (WEIGHT_OBJECT == 0 || VOLUME_OBJECT == 0 ){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("MJ = ");
    lcd.print(0);
    Serial.println((String) "DATA,DATE," + Tinggi + "," + WEIGHT_OBJECT + "," + VOLUME_OBJECT + "," + ((WEIGHT_OBJECT) / VOLUME_OBJECT));
  } else if(WeightTare > 0) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("MJ = ");
    lcd.print((WEIGHT_OBJECT) / VOLUME_OBJECT);
    Serial.println((String) "DATA,DATE," + Tinggi + "," + WEIGHT_OBJECT + "," + VOLUME_OBJECT + "," + ((WEIGHT_OBJECT) / VOLUME_OBJECT));

  }
}

void KalibrasiA(float distanceCm_f){ // Kalibrasi HCSR04
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Kosongkan ...");
  delay(5000);
  CalFactor_HCSR04 = distanceCm_f;
  Serial.print(CalFactor_HCSR04);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Kalibrasi ...");
  lcd.setCursor(0,1);
  lcd.print("selesai");
  delay(1000);

  
}

void KalibrasiB(){ // Kalibrasi HX711
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Siapkan Beban...");
  lcd.setCursor(0, 1);
  lcd.print("100 & 50 g");
  delay(5000);

  scale.tare();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Letakkan ....");
  lcd.setCursor(0, 1);
  lcd.print("Beban 50g");
  delay(5000);
  LOADCELLVAL1 = scale.get_units(50) * 2;
  Serial.print("\nValue1: ");
  Serial.println(LOADCELLVAL1);
  

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Angkat Beban ....");
  lcd.setCursor(0, 1);
  lcd.print(LOADCELLVAL1);
  delay(5000);

  scale.tare();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Letakkan ....");
  lcd.setCursor(0, 1);
  lcd.print("Beban 100g");
  delay(5000);
  LOADCELLVAL2 = scale.get_units(50);
  Serial.print("\nValue2: ");
  Serial.println(LOADCELLVAL2);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Angkat Beban ....");
  lcd.setCursor(0, 1);
  lcd.print(LOADCELLVAL2);
  delay(5000);


  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Kalibrasi ...");
  lcd.setCursor(0,1);
  lcd.print("selesai");
  CalFactor_HX711 = (((LOADCELLVAL1 + LOADCELLVAL2)/2)/KNOWN_WEIGHT);
  Serial.print("CalFactor: ");
  Serial.println(CalFactor_HX711);
  delay(1000);

}

void KalibrasiC(float calFactor_f){
  lcd.clear();
  lcd.setCursor(0,0);
  // scale.tare();
  scale.set_scale(calFactor_f);
  

  Serial.print("\t| average:\t");
  Serial.println(WeightTare);

  // lcd.print((WeightTare));

  if (WeightTare < -1.50){
    lcd.setCursor(0,0);
    lcd.print("Kalibrasi HX711");
    lcd.setCursor(0,1);
    lcd.print("dahulu");
  } else {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Taruh wadah");
    delay(10000);

    WeightTare = (scale.get_units(50));
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Kalibrasi ...");
    lcd.setCursor(0,1);
    lcd.print("selesai");
    delay(1000);

    if(WeightTare < 1){
      Massa_Wadah = 0;
    } else {
      Massa_Wadah = WeightTare;
    }
    Serial.print("Massa Wadah: ");
    Serial.println(Massa_Wadah);

  }


}
Editor is loading...
Leave a Comment