#include <SPI.h>
#include <TFT_eSPI.h>
#include <String.h>
#include "Config.h"
// #include <Preferences.h>
/*** initial instance ***/
TFT_eSPI tft = TFT_eSPI();
// Preferences preferences;
void setup() {
Serial.begin(115200);
pinMode(PUMP, OUTPUT);
digitalWrite(PUMP, HIGH);
pinMode(PILOT, OUTPUT);
pinMode(PSW, INPUT_PULLUP);
pinMode(LSEN, INPUT);
while (!Serial);
pad.begin(0x20, 200); // addr|interval
pad.on(PRESS, [](char key) {
KeypadEvent(key);
});
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE);
tft.setCursor(0, 0);
tft.setTextSize(5);
tft.println("TFT TEST");
Serial.println("Setup sucess!");
digitalWrite(PILOT, LOW);
Serial.print("\n\n\nEnter Volume : ");
}
void loop() {
pad.scand();
/*** Level Check ***/
if(millis() - WCLastTime >= WCDelay){
WaterState = digitalRead(LSEN);
digitalWrite(PILOT, WaterState);
// Serial.print("Senval : ");
// Serial.println(WaterState);
WCLastTime = millis();
}
// กรณีน้ำหมดระหว่างที่เครื่องทำงานให้เข้าสู่สถานะพักชั่วคราว
if (PumpStart && WaterState) {
digitalWrite(PUMP, HIGH);
PumpStart = false;
PauseTime += millis() - PumpLastTime;
TimeUse = TimeUse - (millis() - PumpLastTime);
PauseState = true;
}
/*** SW Start Check ***/
if (!WaterState) {
if (!PauseState && !PumpStart && !digitalRead(PSW)) {
digitalWrite(PUMP, LOW);
PumpStart = true;
PumpLastTime = millis();
}
if (!PauseState && PumpStart && !digitalRead(PSW)) {
digitalWrite(PUMP, HIGH);
PumpStart = false;
PauseTime += millis() - PumpLastTime;
TimeUse = TimeUse - (millis() - PumpLastTime);
PauseState = true;
}
if (PauseState && !PumpStart && !digitalRead(PSW)) {
digitalWrite(PUMP, LOW);
PumpStart = true;
PauseState = false;
PumpLastTime = millis();
}
}
/*** Timer-Counter ***/
if (PumpStart && millis() - PumpLastTime >= TimeUse) {
PumpStart = false;
digitalWrite(PUMP, HIGH);
Count++;
Serial.print("\n Start Count : ");
Serial.println(Count);
float t = millis() - PumpLastTime + PauseTime - Offset;
float v = GetVolume(FlowRate, t) * 1000;
Serial.print("Time : ");
Serial.print(t);
Serial.println(" mS");
Serial.print("Vol : ");
Serial.print(v);
Serial.println(" mL");
}
}
float GetTime(float FlowRate, float Volume) {
// Flowrate base L/sec
float time = Volume / FlowRate;
return time * 1000; // millissec
}
float GetVolume(float FlowRate, int Time) {
return FlowRate * Time / 1000.0;
}
void KeypadEvent(char key) {
if(TimeUse != 0){
return;
}
if (key != 'A' && key != 'B' && key != 'C' && key != 'D' && key != '*' && key != '#') {
Vol += key;
Serial.print(key);
} else if (!DotCheck && key == 'D') {
Vol += '.';
Serial.print(".");
DotCheck = true;
}
if (key == '#') {
Serial.println();
Serial.println(Vol);
float t = GetTime(FlowRate, Vol.toFloat());
Serial.print("SetTime : ");
Serial.print(t);
Serial.println(" mS");
float v = GetVolume(FlowRate, (int)t) * 1000;
Serial.print("SetVol : ");
Serial.print(v);
Serial.println(" mL");
// TimeUse = t + Offset;
TimeUse = t + (t*PrecentOffset/100);
// digitalWrite(PUMP, LOW);
// PumpStart = true;
// PumpLastTime = millis();
}
}
/**************** Note ****************/
/*
# FlowRate unit
- Base
- L/SEC
- Input Unit
- L/HOUR
- L/MIN
- L/SEC
- Convest Function
- L/HOUR -> L/SEC
- L/MIN -> L/SEC
Arg [Base,DestBase,Var]
Re [VarDestBase]
*/