#include <Arduino.
h>
#include <EEPROM.h>
#include <HX711_ADC.h>
#include <MARCH_BTS7960.h>
#include <MARCH_Button.h>
#include <MARCH_Indicator.h>
#include <MARCH_LCD_I2C.h>
#define BUTTON 13
#define EN 11
#define LPWM 10
#define RPWM 9
#define SCK 5
#define DOUT 4
#define BUZZER 2
#define SENSOR A0
#define MAIN 0x00
#define SAMPLE 0x01
#define START 0x02
#define EXTRACT 0x03
#define STOP 0x04
#define CLICK1X 0
#define CLICK2X 1
#define ADDR 0x00
#define INTERVAL 1000
#define STABILIZE 2000
#define EXTRACTED (analogRead(SENSOR) > 0x3AF)
HX711_ADC loadcell(DOUT, SCK);
MARCH_BTS7960 hydraulic(EN, RPWM, LPWM);
MARCH_Button button(BUTTON);
MARCH_Indicator buzzer(BUZZER);
MARCH_LCD_I2C lcd(0x27, 16, 2);
int menu = 0;
int lastExtract = HIGH;
bool click = false;
bool doubleClick = false;
bool startBack = false;
bool started1 = false;
bool started2 = false;
unsigned long last;
unsigned long startMillis;
unsigned long lastMillis;
byte click1x[] = {
B00101,
B00010,
B00101,
B11000,
B01000,
B01000,
B01000,
B11100
};
byte click2x[] = {
B00101,
B00010,
B00101,
B11100,
B00100,
B01000,
B10000,
B11100
};
void initialize(void);
void mainDisplay(void);
void sampleDisplay(void);
void startDisplay(void);
void extractDisplay(void);
void stopDisplay(void);
void forceDisplay(void);
void errorDisplay(void);
void printPressure(void);
void turnBackHydraulic(bool);
void clickedCb(void);
void doubleClickedCb(void);
void longClickedCb(void);
bool clicked(void);
bool doubleClicked(void);
void setup() {
[Link](9600);
float calibration;
[Link](ADDR, calibration);
[Link](clickedCb);
[Link](doubleClickedCb);
[Link](longClickedCb);
[Link](2000);
pinMode(SENSOR, INPUT);
[Link]();
[Link]();
[Link](CLICK1X, click1x);
[Link](CLICK2X, click2x);
[Link]();
[Link](STABILIZE, true);
if ([Link]()) {
errorDisplay();
while(1);
} else [Link](calibration);
[Link]();
[Link](255);
initialize();
void loop() {
[Link]();
switch (menu) {
case MAIN:
if (clicked()) {
sampleDisplay();
menu = SAMPLE;
break;
case SAMPLE:
if (clicked()) {
startDisplay();
menu = START;
} else if (doubleClicked()) {
mainDisplay();
menu = MAIN;
}
break;
case START:
if (clicked()) {
[Link]();
extractDisplay();
[Link]();
} else if (doubleClicked()) {
sampleDisplay();
menu = SAMPLE;
if ([Link]()) {
[Link]();
[Link]();
[Link](127);
menu = EXTRACT;
break;
case EXTRACT:
printPressure();
bool extracted = EXTRACTED;
if (extracted && !started1 && !started2) {
started1 = true;
delay(1000);
} else if (!extracted && started1 && !started2) {
started2 = true;
delay(1000);
} else if (extracted && started1 && started2) {
stopDisplay();
[Link]();
[Link](LEFT);
[Link](255);
[Link]();
delay(3000);
[Link]();
started1 = false;
started2 = false;
startBack = true;
startMillis = millis();
menu = STOP;
break;
case STOP:
mainDisplay();
menu = MAIN;
break;
turnBackHydraulic(startBack);
}
void initialize() {
[Link]();
[Link]("WELCOME", 0);
[Link]();
[Link](255);
delay(3000);
[Link]();
[Link]("BLOOD PLASMA", 0);
[Link]("EXTRACTOR", 1);
delay(3000);
[Link]();
[Link]("DEWI SARTIKA", 0);
[Link]("P320013", 1);
delay(3000);
[Link](255);
[Link]();
mainDisplay();
void mainDisplay() {
[Link]();
[Link]("PLASMA EXTRACTOR", 0);
[Link]("CLICK TO START->", 1);
void sampleDisplay() {
[Link]();
[Link]("Put the sample!", 0);
[Link](0, 1);
[Link]("Back");
[Link](CLICK2X);
[Link](11, 1);
[Link](CLICK1X);
[Link]("Next");
void startDisplay() {
[Link]();
[Link]("Start Extraction?", 0);
[Link](0, 1);
[Link]("Back");
[Link](CLICK2X);
[Link](10, 1);
[Link](CLICK1X);
[Link]("START");
void extractDisplay() {
[Link]();
[Link]("EXTRACTING", 0);
}
void stopDisplay() {
[Link]();
[Link]("DONE!", 0);
void forceDisplay() {
[Link]();
[Link]("FORCIBLY", 0);
[Link]("TERMINATED", 1);
void errorDisplay() {
[Link]();
[Link]("LOADCELL ERROR!", 0);
void printPressure() {
static boolean newData = false;
if ([Link]()) newData = true;
if (newData) {
if (millis() - lastMillis >= INTERVAL) {
double pressure = [Link]();
[Link](1);
[Link](String((abs(pressure) / 1000), 2) + " kg", 1);
[Link](pressure);
newData = false;
lastMillis = millis();
}
void turnBackHydraulic(bool start) {
if (start) {
if ((millis() - startMillis) >= 3000) {
[Link]();
[Link]();
startBack = false;
startMillis = millis();
void clickedCb() {
if (menu != EXTRACT) {
[Link](BIP);
click = true;
void doubleClickedCb() {
if (menu != MAIN) {
[Link](BIP2x);
doubleClick = true;
}
void longClickedCb() {
if (menu == EXTRACT) {
forceDisplay();
[Link]();
[Link](LEFT);
[Link](255);
[Link]();
delay(3000);
[Link]();
started1 = false;
started2 = false;
startBack = true;
startMillis = millis();
menu = STOP;
bool clicked() {
if (click) {
click = false;
return true;
return false;
bool doubleClicked() {
if (doubleClick) {
doubleClick = false;
return true;
return false;