//KURANG BACA DAN TULIS FILE DARI SD CARD NEXTION
//BACA DAN TULIS FILE UNIT CODE, BACA DAN TULIS FILE SECONDMETER
//KONSEPNYA MENAMBAH SECONDMETER, JADI TIDAK BERDASARKAN WAKTU START/ STOP
//YANG DIKIRIM DARI ARDUINO : STATUS KONEKSI, STATUS INPUT, UNIT CODE (REFRESH), HM
//YANG DIKIRIM DARI HMI : DATETIME, UNITCODE EDIT, HM EDIT, QR CODE, flagSave, flagPrint, flagRefresh
//TRIGGER: SAVE, REFRESH, PRINT
#include "EasyNextionLibrary.h"
#include "TimeLib.h"
#include <SPI.h>
#include <SD.h>
File hmFile, unitFile;
tmElements_t te; //Time elements structure
time_t unixTime; // a time stamp
// SoftwareSerial mySerial(2, 3);
EasyNex myNex(Serial2);
const int REFRESH_TIME = 100; // time to refresh the Nextion data every 1000 ms
unsigned long refresh_timer = millis(); // timer for refreshing Nextion's page
String stringFromNextion;
//RECEIVE
int nexDateTime[6];//year,month,date,hour,min,sec
String nexUnitCode, nexQR;
unsigned long nexHourmeter;
bool flagPrint = 0, flagRefresh = 0, flagSave = 0;
//hourmeter
#define pinTrigger 4
bool inputTrigger = false;
unsigned long hourMeter, secondMeter, lastUnix;
String unitName;
void setup() {
Serial.begin(9600);
myNex.begin(9600);
pinMode(pinTrigger, INPUT_PULLUP);
if (!SD.begin(53)) {
myNex.writeStr("page 4");
myNex.writeStr("t8.txt", "SD Card Error, Reset Device");
Serial.println("Initialization SD CARD GAGAL");
delay(1000);
}
myNex.writeStr("page 0");
Serial.println("Initialization SD CARD OK");
//===== INIT CONDITION =====
hmFile = SD.open("hm.txt");
if (hmFile) {
Serial.println("Read Data");
if (hmFile.available()) {
String readFromSD = hmFile.readString();
Serial.print(readFromSD);
secondMeter = readFromSD.toInt();
}
hmFile.close();
}
else {
hmFile = SD.open("hm.txt", FILE_WRITE);
if (hmFile) {
hmFile.println(secondMeter);
hmFile.close();
}
}
loadUnitCode();
}
void loop() {
myNex.NextionListen();
unsigned long thisMillis = millis();
if ((thisMillis - refresh_timer) > REFRESH_TIME) {
//===== READ FROM HMI =====
nexDateTime[0] = myNex.readNumber("mainPage.xYear.val");
nexDateTime[1] = myNex.readNumber("mainPage.xMonth.val");
nexDateTime[2] = myNex.readNumber("mainPage.xDate.val");
nexDateTime[3] = myNex.readNumber("mainPage.xHour.val");
nexDateTime[4] = myNex.readNumber("mainPage.xMin.val");
nexDateTime[5] = myNex.readNumber("mainPage.xSecond.val");
nexQR = myNex.readStr("mainPage.g0.txt");
flagPrint = false, flagRefresh = false, flagSave = false;
int tempFlag = myNex.readNumber("mainPage.flagPrint.val");
if (tempFlag > 0)flagPrint = true;
tempFlag = myNex.readNumber("mainPage.flagRefresh.val");
if (tempFlag > 0)flagRefresh = true;
tempFlag = myNex.readNumber("mainPage.flagSave.val");
if (tempFlag > 0)flagSave = true;
// Serial.println("===== READ FROM HMI =====");
// Serial.println("Date : " + String(nexDateTime[2]) + "-" + String(nexDateTime[1]) + "-" + String(nexDateTime[0]));
// Serial.println("Time : " + String(nexDateTime[3]) + ":" + String(nexDateTime[4]) + ":" + String(nexDateTime[5]));
// Serial.println("QR : " + nexQR);
//===== PROSES =====
te.Second = nexDateTime[5];
te.Hour = nexDateTime[3];
te.Minute = nexDateTime[4];
te.Day = nexDateTime[2];
te.Month = nexDateTime[1];
te.Year = nexDateTime[0] - 1970;
unixTime = makeTime(te);
cekInput();
cekHMITrig();
//===== SEND TO HMI =====
myNex.writeNum("mainPage.b4.bco", 1024);
if (inputTrigger == true)myNex.writeNum("mainPage.b5.bco", 1024);
//unit code edit
myNex.writeNum("mainPage.x0.val", hourMeter);
// Serial.println("===== SEND TO HMI =====");
// Serial.println("mainPage.b4.bco 1024");
// if (inputTrigger == true)Serial.println("mainPage.b5.bco 1024");
// Serial.println("x0.val : " + String(hourMeter));
myNex.writeNum("mainPage.flagPrint.val", 0);
myNex.writeNum("mainPage.flagRefresh.val", 0);
myNex.writeNum("mainPage.flagSave.val", 0);
//===== DEBUG =====
// Serial.println("===== DEBUG =====");
// Serial.println("UNIX : " + String(unixTime));
// Serial.println("LAST : " + String(lastUnix));
Serial.println("SM : " + String(secondMeter));
myNex.writeStr("mainPage.t13.txt", String(unixTime));
refresh_timer = thisMillis;
}
}
void cekInput() {
if (unixTime != lastUnix) {
if (digitalRead(pinTrigger) == 0) {
secondMeter++;
hmFile = SD.open("hm.txt", O_WRITE);
if (hmFile) {
hmFile.println(String(secondMeter));
hmFile.close();
}
inputTrigger = true;
}
else {
inputTrigger = false;
}
unsigned long tempHourmeter = secondMeter / 3600;
unsigned long per10 = int((secondMeter % 3600) / 360);
// unsigned long tempHourmeter = secondMeter / 360;
// unsigned long per10 = int((secondMeter % 360) / 36);
hourMeter = tempHourmeter * 10 + per10;
lastUnix = unixTime;
}
}
//4000.2 = 4000*3600 + 2*10*60 = 14.400.000 + 1200
void cekHMITrig() {
if (flagPrint == 1)Serial.println("PRINTING...");
if (flagRefresh == 1) {
Serial.println("REFRESHING...");
loadUnitCode();
myNex.writeStr("mainPage.t8.txt", unitName);
myNex.writeStr("mainPage.code.txt", unitName);
}
if (flagSave == 1) {
Serial.println("SAVING...");
hourMeter = myNex.readNumber("mainPage.hm.val");
unsigned long tempHourmeter = hourMeter / 10;
unsigned long per10 = hourMeter % 10;
secondMeter = (tempHourmeter * 3600) + (per10*360) ;
hmFile = SD.open("hm.txt", O_WRITE);
if (hmFile) {
hmFile.println(String(secondMeter));
hmFile.close();
}
myNex.readStr("mainPage.code.txt");
unitFile = SD.open("unitCode.txt", O_WRITE);
if (unitFile) {
unitFile.println(unitFile);
unitFile.close();
}
}
}
void loadUnitCode() {
unitFile = SD.open("unitCode.txt");
if (unitFile) {
Serial.println("Read Data");
if (unitFile.available()) {
String readFromSD = unitFile.readString();
Serial.print(readFromSD);
unitName = readFromSD;
}
unitFile.close();
}
else {
unitName = "OPELIOT";
unitFile = SD.open("unitCode.txt", FILE_WRITE);
if (unitFile) {
unitFile.println("OPELIOT");
unitFile.close();
}
}
}