#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <ModbusRTU.h>
#include <SoftwareSerial.h>
SoftwareSerial S(2, 3);
ModbusRTU mb;
//=====MODBUS PARAM=====
String inputString = "";
bool stringComplete = false;
unsigned long lastReceive = 0;
int valueHreg[20];
bool valueCoil[20];
String lastSend = "";
int menu = 0, cMenu = 0;
int valueTimer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
const int pinButton[4] = {A0, A1, A2, A3};
bool statusButton[4] = {1, 1, 1, 1};
int arrangeMenu[8] = {0, 4, 1, 5, 2, 6, 3, 7};
unsigned long lastDisplay = 0;
boolean connection = false;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(pinButton[i], INPUT_PULLUP);
}
Serial.begin(9600);
lcd.init(); lcd.backlight();
lcd.clear();
lcd.setCursor(0, 1); lcd.print(" [TIMER HMI.] ");
lcd.setCursor(0, 2); lcd.print(" Inisialisasi... ");
//=====MODBUS=====
S.begin(57600);
mb.begin(&S);
mb.master();
mb.readHreg(1, 0, valueHreg, 20); //hanya untuk trigger
while (mb.slave()) {
mb.task();
delay(10);
}
//=====
delay(1500);
}
void loop() {
for (int i = 0; i < 4; i++) {
statusButton[i] = digitalRead(pinButton[i]);
}
if (statusButton[0] == LOW) {
cMenu = (cMenu + 1) % 10;
menu = arrangeMenu[cMenu];
delay(500);
}
if (statusButton[1] == LOW) {
if (cMenu < 8) {
valueTimer[menu]++;
}
delay(300);
}
if (statusButton[2] == LOW) {
if (cMenu < 8) {
valueTimer[menu]--;
if (valueTimer[menu] < 1)valueTimer[menu] = 9999;
}
delay(300);
}
if (millis() > lastDisplay + 500) {
updateDisplay();
watchdog();
lastDisplay = millis();
}
}
void writeParameter() {
for (int i = 0; i < 8; i++) {
mb.writeHreg(1, 10 + i, valueTimer[8]);
while (mb.slave()) {
mb.task();
delay(10);
}
delay(300);
}
}
void readParameter() {
mb.readHreg(1, 0, valueHreg, 20);
while (mb.slave()) {
mb.task();
delay(10);
}
}
void watchdog() {
mb.readCoil(1, 0, valueCoil, 20);
while (mb.slave()) {
mb.task();
delay(10);
}
}
void updateDisplay() {
char buff[30];
if (cMenu < 8) {
sprintf(buff, " [VALVE %02d] ", (menu % 4) + 1);
lcd.setCursor(0, 0); lcd.print(buff);
sprintf(buff, "%sTimer OFF : %5d s", menu < 4 ? ">" : " ", valueTimer[menu % 4]);
lcd.setCursor(0, 1); lcd.print(buff);
sprintf(buff, "%sTimer ON : %5d s", menu >= 4 ? ">" : " ", valueTimer[menu % 4 + 4]);
lcd.setCursor(0, 2); lcd.print(buff);
}
else if (cMenu < 10) {
lcd.setCursor(2, 1); lcd.print(" Parameter Read ");
lcd.setCursor(2, 2); lcd.print(" Parameter Write ");
lcd.setCursor(0, cMenu - 7); lcd.print(">");
}
sprintf(buff, "%02d [Connect:%s]", cMenu + 1, connection ? "Ok" : "--");
lcd.setCursor(0, 3); lcd.print(buff);
}