#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#include <Keypad.h>

#define Pin_VOLT_SIG1 1
#define Pin_VOLT_SIG2 11
#define Pin_VOLT_SIG3 17
#define Pin_AMP_SIG1 3
#define Pin_AMP_SIG2 4
#define Pin_AMP_SIG3 5
#define Pin_AMP_SIG4 6
#define Pin_AMP_SIG5 7
#define Pin_AMP_SIG6 12
#define Pin_HX711_SCK 20
#define Pin_HX711_DT 21
#define Pin_BUTTON 26
#define Pin_KEYPAD_Itr 36
uint8_t Pin_KEYPAD_Row[4] = {41, 40, 39, 38};
uint8_t Pin_KEYPAD_Col[4] = {33, 34, 35, 36};

// HX711 load cell and sensors calibration setting
const int C[8] = {0, 50, 2100, 12, 8191, 30, 8191, 0};
const char Keys[4][4] =
{{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }};

int Bit[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int Mode[8] = {0, 0, 0, 0, 0, 0, 0, 0};
float Data[20] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
HX711 HX711;
Keypad KEYPAD(makeKeymap(Keys), Pin_KEYPAD_Row, Pin_KEYPAD_Col, 4, 4);

void setup() {
Serial.begin(9600);
pinMode(Pin_BUTTON, INPUT);
LCD.init();
LCD.backlight();
print_LCD_text(2, "Welcome MMU !!!", 0, 0, 0);
print_LCD_text(2, "Starting .....", 0, 0, 1);
delay(3000);
print_LCD_text(4, "", 0, 0, 1);
HX711.begin(Pin_HX711_DT, Pin_HX711_SCK);
set_HX711_reading();
attachInterrupt(Pin_KEYPAD_Itr, get_KEYPAD_selection, HIGH);
}

void loop() {
read_VOLT_data();
read_AMP_data();
read_HX711_data();
if (Mode[0] == 0) {set_LCD_load();} // A
if (Mode[0] == 1) {set_LCD_volt();} // B
if (Mode[0] == 2) {set_LCD_amp();} // C
if (Mode[0] == 3) {set_HX711_reading();} // D
}

void print_LCD_text(int type, char* text, float value, int column, int row) {
LCD.setCursor(column, row);
switch (type) {
case 1: LCD.println(value, DEC); break;
case 2: LCD.println(text); break;
case 3: LCD.clear(); LCD.println(text); break;
case 4: LCD.clear(); break;
}}

void get_KEYPAD_data() {
int j = 4;
while (j < 8) {
char keyin = KEYPAD.getKey();
Data[j] = 0 - 48 + int(keyin);
if (keyin) {
print_LCD_text(3, "Press 4x", 0, 0, 0);
j++;
}}}

void get_KEYPAD_selection() {
int j = 0;
while (j < 1) {
char keyin = KEYPAD.getKey();
Data[j] = 0 - 48 + int(keyin);
if (keyin) {
j++;
}}
if (Data[0] == 17) {Mode[0] = 0;}
if (Data[0] == 18) {Mode[0] = 1;}
if (Data[0] == 19) {Mode[0] = 2;}
if (Data[0] == 20) {Mode[0] = 3;}
return;
}

void read_HX711_data() {
Data[11] = HX711.get_units(10);
Data[12] = C[1]*(Data[11] - Data[10])/C[2];
}

void set_LCD_load() {
print_LCD_text(2, "HX711 reading   ", 0, 0, 0);
print_LCD_text(1, "", Data[12], 9, 1);
print_LCD_text(2, " N", 0, 14, 1);
}

void set_LCD_amp() {
LCD.clear();
print_LCD_text(1, "", Data[4], 0, 0);
print_LCD_text(2, " ", 0, 4, 0);
print_LCD_text(1, "", Data[5], 5, 0);
print_LCD_text(2, " ", 0, 9, 0);
print_LCD_text(1, "", Data[6], 10, 0);
print_LCD_text(2, " A", 0, 14, 0);
print_LCD_text(1, "", Data[7], 0, 1);
print_LCD_text(2, " ", 0, 4, 1);
print_LCD_text(1, "", Data[8], 5, 1);
print_LCD_text(2, " ", 0, 9, 1);
print_LCD_text(1, "", Data[9], 10, 1);
print_LCD_text(2, " A", 0, 14, 1);
}

void set_LCD_volt() {
LCD.clear();
print_LCD_text(1, "", Data[1], 0, 0);
print_LCD_text(2, " ", 0, 4, 0);
print_LCD_text(1, "", Data[2], 5, 0);
print_LCD_text(2, " ", 0, 9, 0);
print_LCD_text(1, "", Data[3], 10, 0);
print_LCD_text(2, " V", 0, 14, 0);
}

void read_VOLT_data() {
Data[1] = analogRead(Pin_VOLT_SIG1);
Data[2] = analogRead(Pin_VOLT_SIG2);
Data[3] = analogRead(Pin_VOLT_SIG3);
Data[1] = Data[1]*C[3]/C[4];
Data[2] = Data[2]*C[3]/C[4];
Data[3] = Data[3]*C[3]/C[4];
}

void read_AMP_data() {
Data[4] = analogRead(Pin_AMP_SIG1);
Data[5] = analogRead(Pin_AMP_SIG2);
Data[6] = analogRead(Pin_AMP_SIG3);
Data[7] = analogRead(Pin_AMP_SIG4);
Data[8] = analogRead(Pin_AMP_SIG5);
Data[9] = analogRead(Pin_AMP_SIG6);
Data[4] = Data[4]*C[5]/C[6];
Data[5] = Data[5]*C[5]/C[6];
Data[6] = Data[6]*C[5]/C[6];
Data[7] = Data[7]*C[5]/C[6];
Data[8] = Data[8]*C[5]/C[6];
Data[9] = Data[9]*C[5]/C[6];
}

void set_HX711_reading() {
print_LCD_text(3, "Press button to", 0, 0, 0);
print_LCD_text(2, "reset ...", 0, 0, 1);
for (int i = 0; i <= 9; i++) {
print_LCD_text(1, "", 9 - i, 15, 1);
delay(990);
}
Bit[0] = digitalRead(Pin_BUTTON);
if (Bit[0] == HIGH) {
print_LCD_text(3, "Resetting ...", 0, 0, 0);
Data[10] = HX711.get_units(10);
delay(2000);
}
if (Bit[0] == LOW) {
print_LCD_text(3, "HX711 not reset", 0, 0, 0);
delay(2000);
}
Mode[0] = 0;
}
$abcdeabcde151015202530fghijfghij