#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
//Pendefinisian konstanta untuk keypad
const byte ROWS = 4; //empat baris keypad
const byte COLS = 3; //tiga kolom keypad
char keys[ROWS][COLS] = { // Pemetaan keypad
{ '1', '2', '3' },
{ '4', '5', '6' },
{ '7', '8', '9' },
{ '*', '0', '#' }
};
// inisialisasi pin
byte rowPins[ROWS] = {6, 5, 4, 3}; //Terhubung pinout baris keypad
byte colPins[COLS] = {2, 1, 0}; //Terhubung pinout kolom keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const int relayPin = 7;
const int sensorPin = A0;
//deklarasi variabel
boolean angka_yang_ditekan = false;
boolean next = false;
boolean final = false;
boolean relayState = false; // Status relay (nyala/mati)
unsigned long timer_tenan; // Durasi pengkabutan (dalam detik)
unsigned long startTime = 0;
String angka_ke1, angka_ke2;
int volume;
float tekanan = 0.0; // Variabel untuk menyimpan nilai tekanan dari sensor MPX4115
const float maxPressure = 103.5; // Batas maksimum tekanan kompresor (dalam kPa)
//===========================================================================
void setup() {
pinMode(sensorPin, INPUT);
pinMode(relayPin, OUTPUT);
// setup untuk awalan tampilan di LCD
lcd.begin(0x27, 16, 2);
lcd.setCursor(1, 0);
lcd.print(" NEBULIZER ");
lcd.setCursor(3, 1);
lcd.print(" TIM 2B ");
delay(2000); //tunda text 1 dt
lcd.clear(); //clear display
}
//===========================================================================
void loop() {
char pencet = keypad.getKey();
//set durasi
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(2, 0);
lcd.print("Set Volume : ");
lcd.setCursor(8, 1);
lcd.print(" (ml)");
lcd.setCursor(1, 1);
if (pencet != NO_KEY && (pencet == '1' || pencet == '2' || pencet == '3' || pencet == '4' || pencet == '5' || pencet == '6' || pencet == '7' || pencet == '8' || pencet == '9' || pencet == '0')) {
if (angka_yang_ditekan != true) {
lcd.setCursor(1, 1);
angka_ke1 = angka_ke1 + pencet;
int angka = angka_ke1.length();
lcd.setCursor(4, 1);
lcd.print(angka_ke1);
}
else {
angka_ke2 = angka_ke2 + pencet;
int angka = angka_ke2.length();
lcd.setCursor(15 - angka, 1);
lcd.print(angka_ke2);
final = true;
}
}
//Set sistem !!
if (pencet == '#') { //Tombol enter
volume = angka_ke1.toInt(); // nilai yg dimasukan adalah dalam ml
int timer_tenan = ((volume * 2.5) + 1) * 60; // persamaan dari y = 2,5x + 1
for (int i = 0; i = timer_tenan; i++) {
timer_tenan--;
int jam = timer_tenan / 3600;
int menit = (timer_tenan % 3600)/ 60;
int detik = (timer_tenan % 3600) % 60;
int detik_tenan = timer_tenan - menit * 60;
delay(1000);
// Baca tekanan dari sensor MPX5500
int sensorValue = analogRead(sensorPin);
tekanan = (sensorValue) / 8.4042553191; // Konversi ke kPa
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Press= ");
if (volume >= 10) {
lcd.setCursor(8, 0);
} else {
lcd.setCursor(7, 0);
}
lcd.print(tekanan);
lcd.setCursor(13, 0);
lcd.print("kPa");
lcd.setCursor(0, 1);
lcd.print("Waktu=");
if (jam >= 10) {
lcd.setCursor(7, 1);
} else {
lcd.setCursor(7, 1);
lcd.print("0");
lcd.setCursor(8, 1);
}
lcd.print(jam);
lcd.setCursor(9, 1);
lcd.print(":");
if (menit >= 10) {
lcd.setCursor(10, 1);
} else {
lcd.setCursor(10, 1);
lcd.print("0");
lcd.setCursor(11, 1);
}
lcd.print(menit);
lcd.setCursor(12, 1);
lcd.print(":");
if (detik_tenan >= 10) {
lcd.setCursor(13, 1);
} else {
lcd.setCursor(13, 1);
lcd.print("0");
lcd.setCursor(14, 1);
}
lcd.print(detik_tenan);
if (timer_tenan != 0) {
digitalWrite(relayPin, HIGH);
} else {
digitalWrite(relayPin, LOW);
}
// Menghentikan alat jika tekanan kompresor melebihi batas maksimum
if (tekanan > maxPressure) {
digitalWrite(relayPin, LOW);
relayState = false;
lcd.clear();
lcd.print("Tekanan Melebihi");
lcd.setCursor(0, 1);
lcd.print("Batas Max");
delay(1000); // Waktu penundaan sebelum reset
asm volatile(" jmp 0"); // Melakukan reset
}
}
// Menghentikan pengkabutan setelah durasi tercapai
digitalWrite(relayPin, LOW);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("=== HABIS ===");
timer_tenan = 0;
relayState = false;
delay(5000);
}
//batal
else if (pencet == '*') //Tombol Delete (backspace)
{
lcd.clear();
angka_yang_ditekan = false;
final = false;
angka_ke1 = "";
angka_ke2 = "";
volume = 0;
}
}