/*how to calculate encoder to mm
(66.65x3.142)/1200 = 209.281 //หาเส้นรอบวงกลม จากจุด point กึ่งกลาง
1200/209.281 = 5.734 //pulse 600x2 0 || 1 = 1200 pulse
1/5.734 = 0.174*/
//pulse 1 รอบคลื่น
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
/////////////////////////// Display ///////////////////////////////////////
const byte Button_Set = A0;
const byte Button_UP = A1;
const byte Button_DW = A2;
const byte Button_CANCEL = A3;
const int ResetPin = 4; //Reset encoder
///////////////////////// Menu case ///////////////////////////////////////
int temp, counter = 0; // ตัวแปรนับค่า encoder
int referenceValue = 0;
const float mmPerPulse = 0.174; //pulse 1 รอบคลื่น
///////////////////////// Encoder sensor //////////////////////////////////
void setup() {
Serial.begin(115200);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
// ตั้งค่า interrupt
attachInterrupt(0, A, RISING); // ใช้ฟังก์ชัน A เมื่อขา DigitalPin 2 ตกลงที่ LOW
attachInterrupt(1, B, RISING); // ใช้ฟังก์ชัน B เมื่อขา DigitalPin 3 ตกลงที่ LOW
pinMode(ResetPin, INPUT_PULLUP);
/////////////////////////// Display ///////////////////////////////////////
lcd.init();
lcd.backlight();
pinMode(Button_Set, INPUT_PULLUP);
pinMode(Button_UP, INPUT_PULLUP);
pinMode(Button_DW, INPUT_PULLUP);
pinMode(Button_CANCEL, INPUT_PULLUP);
}
void loop() {
static boolean Display = true;
static boolean ButtonSet = false;
if (Display) {
Display = false;
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Counter IC");
lcd.setCursor(4, 1);
lcd.print("In Tube");
}
if (digitalRead(Button_Set) == 0) {
delay(500);
if (digitalRead(Button_Set) == 0) {
if (!ButtonSet) {
ButtonSet = true;
SelectMenu();
Display = true;
}
}
} else {
ButtonSet = false;
}
if (digitalRead(ResetPin) == 0) {
delay(250);
if (digitalRead(ResetPin) == 0) {
counter = 0;
}
}
}
void SelectMenu() {
boolean Display = true;
boolean Exit = false;
boolean ButtonSet = true;
boolean ButtonUP = false;
boolean ButtonDW = false;
boolean ButtonExit = false;
byte Menu = 0;
const char MenuText[4][17] = {
"1: A(4050) ",
"2: B(5032) ",
"3: C(3225) ",
"4: D(2025) ",
};
while (!Exit) {
if (Display) {
Display = false;
lcd.setCursor(0, 0);
lcd.print("Select PACKAGE");
lcd.setCursor(0, 1);
lcd.print(MenuText[Menu]);
}
if (digitalRead(Button_Set) == 0) {
delay(250);
if (digitalRead(Button_Set) == 0) {
if (!ButtonSet) {
ButtonSet = true;
switch (Menu) {
case 0:
Serial.println("you select menu 1");
packageA_7050();
break;
case 1:
Serial.println("you select menu 2");
packageB_5032();
break;
case 2:
Serial.println("you select menu 3");
packageC_3225();
break;
case 3:
Serial.println("you select menu 4");
packageD_2025();
break;
}
}
}
} else {
ButtonSet = false;
}
if (digitalRead(Button_UP) == 0) {
delay(250);
if (digitalRead(Button_UP) == 0) {
if (!ButtonUP) {
ButtonUP = true;
if (Menu < 3) {
Menu++;
} else {
Menu = 0; // Corrected from Menu == 0;
}
Display = true;
}
}
} else {
ButtonUP = false;
}
if (digitalRead(Button_DW) == 0) {
delay(250);
if (digitalRead(Button_DW) == 0) {
if (!ButtonDW) {
ButtonDW = true;
if (Menu > 0) {
Menu--;
} else {
Menu = 3; // Corrected from Menu == 3;
}
Display = true;
}
}
} else {
ButtonDW = false;
}
if (digitalRead(Button_CANCEL) == 0) {
delay(250);
if (digitalRead(Button_CANCEL) == 0) {
if (!ButtonExit) {
ButtonExit = true;
Exit = true;
}
}
} else {
ButtonExit = false;
}
}
}
void A() {
if (digitalRead(3) == LOW) {
counter++;
} else {
counter--;
}
}
void B() {
if (digitalRead(2) == LOW) {
counter--;
} else {
counter++;
}
}
void packageA_7050() {
float distance = (counter - referenceValue) * mmPerPulse;
if (distance < 0) { distance = 0; }
temp = counter;
/**/
int divided_value = (distance) / 7;
if (divided_value < 0) { divided_value = 0; }
/**/
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("PACKAGE_7050");
// lcd.println("Distance: " + String(distance) + " mm");
lcd.setCursor(0, 1);
lcd.println("Count: " + String(divided_value) + " Unit");
// Serial.print("Count:");Serial.print(abs(divided_value));Serial.println(" Unit");
}
void packageB_5032() {
float distance = (counter - referenceValue) * mmPerPulse;
if (distance < 0) { distance = 0; }
temp = counter;
/**/
int divided_value = (distance) / 5;
if (divided_value < 0) { divided_value = 0; }
/**/
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("PACKAGE_5032");
// lcd.println("Distance: " + String(distance) + " mm");
lcd.setCursor(0, 1);
lcd.println("Count: " + String(divided_value) + " Unit");
// Serial.print("Count:");Serial.print(abs(divided_value));Serial.println(" Unit");
}
void packageC_3225() {
float distance = (counter - referenceValue) * mmPerPulse;
if (distance < 0) { distance = 0; }
temp = counter;
/**/
int divided_value = (distance) / 3.2;
if (divided_value < 0) { divided_value = 0; }
/**/
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("PACKAGE_3225");
// lcd.println("Distance: " + String(distance) + " mm");
lcd.setCursor(0, 1);
lcd.println("Count: " + String(divided_value) + " Unit");
// Serial.print("Count:");Serial.print(abs(divided_value));Serial.println(" Unit");
}
void packageD_2025() {
float distance = (counter - referenceValue) * mmPerPulse;
if (distance < 0) { distance = 0; }
temp = counter;
/**/
int divided_value = (distance) / 2.5;
if (divided_value < 0) { divided_value = 0; }
/**/
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("PACKAGE_2025");
// lcd.println("Distance: " + String(distance) + " mm");
lcd.setCursor(0, 1);
lcd.println("Count: " + String(divided_value) + " Unit");
// Serial.print("Count:");Serial.print(abs(divided_value));Serial.println(" Unit");
}