#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte arrow[] = {B10000, B11000, B11100, B11110, B11110, B11100, B11000, B10000};
byte down[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b01110, 0b00100};
byte up[8] = {0b00100, 0b01110, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
byte calBack[8] = {0b00100, 0b01000, 0b11111, 0b01001, 0b00101, 0b00001, 0b11111, 0b00000};
// String nameManu[] = {"READING", "CALIBRETION"};
String nameSensor[] = {"S1", "S2", "S3", "S4", "S5", "S6"};
float valueSensor[] = {0, 1.84646, 2, 3, 4, 5};
String nameCal[] = {"C1", "C2", "C3", "C4", "C5", "C6", "C7"};
float valueCal[] = {1000.123456789987654321, 10.646854, 22.455484, 33.8484484, 44.48465418, 55.584848, 66.15456};
float arrDigit[] = {0.01, 0.1, 1, 10, 100, 1000};
int numSensor = sizeof(valueSensor) / sizeof(float);
int numCal = sizeof(valueCal) / sizeof(float);
int inDex = 0;
bool modeCal = true;
float lastAdd = 0.01;
float addFactor = 1.5;
bool btnUp = false;
bool btnDown = false;
int btnCen = false;
bool btnDigit = false;
bool lstUp = false;
bool lstDown = false;
bool lstCen = false;
int numIndex = 0;
int locateCal = 0;
int back = 0;
void setup() {
pinMode(16, INPUT);
pinMode(17, INPUT);
pinMode(18, INPUT);
pinMode(19, INPUT);
Serial.begin(115200);
Serial.println(numSensor);
lcd.init();
lcd.createChar(0, arrow);
lcd.createChar(1, down);
lcd.createChar(2, up);
lcd.createChar(3, calBack);
lcd.clear();
lcd.backlight();
lcd.setCursor(5, 0);
lcd.print("COD SENSOR");
lcd.setCursor(0, 1);
lcd.print("SELECT MODE");
lcd.setCursor(0, 2);
lcd.print("1.READING");
lcd.setCursor(0, 3);
lcd.print("2.CLIBRETION");
while (!btnDown && !btnUp) {
btnDown = digitalRead(17);
btnUp = digitalRead(18);
if (btnDown) {
numIndex = numSensor;
modeCal = false;
lcd.clear();
delay(300);
} else if (btnUp) {
numIndex = numCal;
modeCal = true;
lcd.clear();
delay(300);
}
}
}
bool cal = false;
void loop() {
btnDown = digitalRead(16);
btnCen = digitalRead(17);
btnDigit = digitalRead(19);
back = 0;
while (digitalRead(17)) {
back++;
Serial.println(back);
if (back >= 2000) {
modeCal = !modeCal;
Serial.print("back ");
lcd.clear();
btnCen = 2;
break;
// delay(3000);
} else {
btnCen = 1;
}
delay(1);
}
btnUp = digitalRead(18);
if (btnDown) {
if (cal == 0)lcd.clear();
if (cal) {
if (lstDown) {
lastAdd = lastAdd * addFactor;
if (lastAdd >= 100)lastAdd = 100;
delay(lastAdd * 5);
} else {
lastAdd = 0.01;
// addFactor = 1.5;
}
valueCal[inDex] -= lastAdd;
} else {
inDex --;
}
if (inDex < 0) {
inDex = numIndex;
}
Serial.println(inDex);
delay(10);
} else if (btnUp) {
if (cal == 0)lcd.clear();
if (cal) {
if (lstUp) {
lastAdd = lastAdd * addFactor;
if (lastAdd >= 100)lastAdd = 100;
delay(lastAdd * 5);
} else {
lastAdd = 0.01;
// addFactor = 1.5;
}
valueCal[inDex] += lastAdd;
} else {
inDex ++;
}
if (inDex >= numIndex) {
inDex = 0;
}
Serial.println(inDex);
delay(10);
}
lstUp = btnUp;
lstDown = btnDown;
//======================================================
if (modeCal) {
lcd.setCursor(5, 0);
lcd.print("CALIBRETION ");
calDiskplay(inDex);
} else {
lcd.setCursor(7, 0);
lcd.print("READING ");
valueDiskplay(inDex);
cal = false;
}
if (btnCen == 1 && modeCal) {
lcd.clear();
cal = !cal;
if (modeCal) {
numIndex = numCal;
} else {
numIndex = numSensor;
}
}
delay(300);
}
//=============================================================//
void calDiskplay(int _inDex) {
// if (cal == 1) {
lcd.setCursor(0, 1);
// lcd.print("* ");
lcd.write(byte(0));
// }
lcd.setCursor(2, 1);
// if (_inDex < numCal)lcd.print(nameCal[_inDex] + " " + String(valueCal[_inDex]));
//===================================================
if (_inDex < numCal)lcd.print(nameCal[_inDex] + " ");
lcd.print(valueCal[_inDex], 2);
lcd.print(" ");
//==============================================
if (cal == 1) {
lcd.setCursor(17, 1);
lcd.print("[+]");
} else {
lcd.setCursor(19, 1);
lcd.write(byte(2));
}
lcd.setCursor(2, 2);
if (_inDex + 1 < numCal) {
lcd.print(nameCal[_inDex + 1] + " ");
lcd.print(valueCal[_inDex + 1], 2);
lcd.print(" ");
} else {
lcd.print(" ");
}
if (cal == 1) {
lcd.setCursor(18, 2);
lcd.write(byte(3));
} else {
lcd.setCursor(17, 2);
lcd.print("CAL");
}
lcd.setCursor(2, 3);
if (_inDex + 2 < numCal) {
lcd.print(nameCal[_inDex + 2] + " ");
lcd.print(valueCal[_inDex + 2], 2);
lcd.print(" ");
} else {
lcd.print(" ");
}
if (cal == 1) {
lcd.setCursor(17, 3);
lcd.print("[-]");
} else {
lcd.setCursor(19, 3);
lcd.write(byte(1));
}
}
//=====================================================//
void valueDiskplay(int _inDex) {
lcd.setCursor(0, 1);
if (_inDex < numSensor)lcd.print(nameSensor[_inDex] + " ");
lcd.print(valueSensor[_inDex], 4);
lcd.print(" ");
lcd.setCursor(19, 1);
lcd.write(byte(2));
lcd.setCursor(0, 2);
if (_inDex + 1 < numSensor) {
lcd.print(nameSensor[_inDex + 1] + " ");
lcd.print(valueSensor[_inDex + 1], 4);
lcd.print(" ");
} else {
lcd.print(" ");
}
lcd.setCursor(0, 3);
if (_inDex + 2 < numSensor) {
lcd.print(nameSensor[_inDex + 2] + " ");
lcd.print(valueSensor[_inDex + 2], 4);
lcd.print(" ");
} else {
lcd.print(" ");
}
lcd.setCursor(19, 3);
lcd.write(byte(1));
}