#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
#include "RTClib.h"
#include <ModbusRTU.h>
ModbusRTU mb;
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
bool SW1, Old_SW1, LED_Status;
#define SW1_Pin 19
#define LED1 12
#define LED2 2
//-----------
#define RELAY1 18
#define RELAY2 5
#define RELAY3 4
#define RELAY4 2
#define SLAVE_ID 1
#define FIRST_REG 1
#define REG_COUNT 2
unsigned int SEC_Cx;
unsigned long Now_Time, Pre_Time;
bool cb(Modbus::ResultCode event, uint16_t transactionId, void* data) { // Callback to monitor errors
if (event != Modbus::EX_SUCCESS) {
Serial.print("Request result: 0x");
Serial.print(event, HEX);
} else {
Serial.print("Request result: 0x");
Serial.print(event, HEX);
}
return true;
}
void setup() {
// put your setup code here, to run once:
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
Serial.begin(9600);
mb.begin(&Serial);
mb.master();
Serial.println("Hello, ESP32!");
pinMode(LED1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(19, INPUT_PULLUP);
Old_SW1 = digitalRead(19);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("Hello, IoT_World!");
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}
String Time_Str;
unsigned int YEAR, MONTH, DAY, HOUR, MIN, SEC;
unsigned char H_Prog_ON[5] = {17, 17,};
unsigned char M_Prog_ON[5] = {59, 11};
unsigned char OnTime_Valve_Prog1[8] = {5, 3, 0, 5, 0, 0, 0, 0};
unsigned char OnTime_Valve_Prog2[8] = {3, 3, 0, 5, 0, 0, 0, 0};
unsigned char OnTime_Valve_Prog3[8] = {3, 3, 0, 5, 0, 0, 0, 0};
unsigned char OnTime_Valve_Prog4[8] = {3, 3, 0, 5, 0, 0, 0, 0};
unsigned char OnTime_Valve_Prog5[8] = {3, 3, 0, 5, 0, 0, 0, 0};
unsigned char oldMin = 0, oldSec = 0;
unsigned char ValveOn_Sec = 0;
bool TimerProg_Num1 = false;
bool TimerProg_Num2 = false;
bool TimerProg_Num3 = false;
bool TimerProg_Num4 = false;
bool TimerProg_Num5 = false;
void setAllValveOff(void)
{
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
}
unsigned char ValveNum = 0;
unsigned char RY_Num = 0;
void timerProg_01(void)
{
Serial.println("ValveNum:" + String(RY_Num));
if (ValveOn_Sec == 0)
{
setAllValveOff();
ValveOn_Sec = OnTime_Valve_Prog1[RY_Num];
while (ValveOn_Sec == 0)
{
ValveOn_Sec = OnTime_Valve_Prog1[RY_Num];
RY_Num++;
if (RY_Num == 4)
{
break;
}
}
}
else
{
ValveOn_Sec--;
if (ValveOn_Sec == 0)
{
setAllValveOff();
RY_Num++;
}
//-----------------------
lcd.setCursor(4, 1); lcd.print(ValveOn_Sec);
lcd.setCursor(0, 1); lcd.print(RY_Num);
//--- Last Number of Relay Module -----
if (RY_Num == 4)
{
TimerProg_Num1 = false;
RY_Num = 0;
lcd.setCursor(0, 1); lcd.print(RY_Num);
return;
}
}
//---------
if (RY_Num == 0)
{
digitalWrite(RELAY1, HIGH);
}
else if (RY_Num == 1)
{
digitalWrite(RELAY2, HIGH);
}
else if (RY_Num == 2)
{
digitalWrite(RELAY3, HIGH);
}
}
void timeProgComp(void)
{
if (SEC == 0)
{
//-------- TIMER_01 Comparison ------------
if ((H_Prog_ON[0] == HOUR) && (M_Prog_ON[0] == MIN))
{
TimerProg_Num1 = true;
Serial.println("TimerProg01_ON");
}
//-------- TIMER_02 Comparison ------------
if ((H_Prog_ON[1] == HOUR) && (M_Prog_ON[1] == MIN))
{
}
}
}
void getRTC()
{
DateTime now = rtc.now();
YEAR = now.year();
MONTH = now.month();
DAY = now.day();
HOUR = now.hour();
MIN = now.minute();
SEC = now.second();
if (oldSec != SEC)
{
if (TimerProg_Num1)
{
timerProg_01();
}
}
if (oldMin != MIN)
{
Serial.println("Timer_Compared");
oldMin = MIN;
timeProgComp();
}
Time_Str = {String(YEAR) + "/" + String(MONTH) + "/" + String(DAY) + " | " +
String(HOUR) + ":" + String(MIN) + ":" + String(SEC)
};
lcd.setCursor(1, 3); lcd.print(Time_Str);
Serial.println(Time_Str);
}
void loop() {
Now_Time = millis();
if (Now_Time > (Pre_Time + 100))
{
SEC_Cx++;
digitalWrite(LED1, !digitalRead(LED1));
//digitalWrite(LED2, !digitalRead(SW1_Pin));
SW1 = digitalRead(SW1_Pin);
if (SW1 != Old_SW1)
{
digitalWrite(LED2, LED_Status);
Serial.print("Switch Status : ");
Serial.println(LED_Status);
lcd.setCursor(1, 2); lcd.print("Switch Status : "); lcd.print(LED_Status);
LED_Status = !LED_Status;
}
if (SEC_Cx >= 5)
{
SEC_Cx = 0;
getRTC();
// uint16_t res[REG_COUNT];
// if (!mb.slave()) { // Check if no transaction in progress
// mb.readIreg(SLAVE_ID, FIRST_REG, res, REG_COUNT, cb); // Send Read Hreg from Modbus Server
// while (mb.slave()) { // Check if transaction is active
// mb.task();
// // delay(10);
// }
// Serial.print("\n readHreg 1 : ");
// for (int i = 0; i < REG_COUNT; i++) {
// Serial.print(res[i]); Serial.print(" ");
// }
// }
}
Pre_Time = Now_Time;
}
}