#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
/*
Pistol Lapping Controller Code
Copyright 2/12/2024 David S Harmer. All rights reserved.
Used to control the DH Armory Pistol Lapping machine (Patent Applied for)
Version 1.02 4/22/2024
Update notes -
1.01:
* Added funtion code for initial lapping and slide lapping.
* set up variables for digital control.
* adjusted timing variables for 10 second maximum throw.
1.02:
* Added variable setup for loop count.
* added 4 switch programming.
* Added mode and function code for assembled cycling mode (with barrel).
* Added LCD display support.
*/
int relay_1 = 1;
int relay_2 = 2;
bool InitMe = true;
int LED_1 = 3;
int LED_2 = 4;
int HalfSec = 500;
int OneSec = 1000;
int NineSec = 6000;
int FullLap = 7000;
int LappingReps = 1;
int InitReps = 14; /* needs to be 14 for production - 3 for testing*/
void setup() {
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("DH ARMORY Lapper");
lcd.setCursor(0, 1);
lcd.print("Patent Pending");
lcd.setCursor(0, 2);
lcd.print("Arduino LCM IIC 2024");
lcd.setCursor(2, 3);
lcd.print("Copyright 2004");
pinMode(relay_1, OUTPUT);
pinMode(relay_2, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(A0, INPUT_PULLUP);
pinMode(A1, INPUT_PULLUP);
pinMode(A2, INPUT_PULLUP);
pinMode(A3, INPUT_PULLUP);
SetupMode();
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Setup Complete");
lcd.setCursor(0, 1);
lcd.print("Please Wait. ");
delay(OneSec);
delay(OneSec);
if (InitMe) {
InitialPosition();
}
}
/* execution code */
void loop() {
/* wait for start button (A1) press*/
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Waiting to start");
lcd.setCursor(0, 1);
lcd.print("Press Button");
while (digitalRead(A1) < 1) {
FirstLap();
LappingCycle();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Lapping Complete");
lcd.setCursor(0, 1);
lcd.print("Sled Reset");
ResetPosition();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Lapping Complete");
lcd.setCursor(0, 1);
lcd.print("Remove Elevator");
delay(FullLap);
/* END Execution Code*/
}
}
/* Functions */
void FirstLap() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 1);
lcd.print("Init First Lap");
lcd.setCursor(0, 0);
lcd.print("Pass 0 of");
lcd.setCursor(10, 0);
lcd.print(InitReps);
delay(OneSec);
for (int i = 1; i <= InitReps; i++) {
int varpush = i * HalfSec;
lcd.setCursor(5, 0);
lcd.print(i);
digitalWrite(LED_1, HIGH);
digitalWrite(relay_1, HIGH);
digitalWrite(relay_2, LOW);
digitalWrite(LED_2, LOW);
delay(varpush); /* push for varpush seconds*/
digitalWrite(relay_1, LOW);
digitalWrite(LED_1, LOW);
digitalWrite(relay_2, HIGH);
digitalWrite(LED_2, HIGH);
delay(varpush);
delay(OneSec);
}
lcd.setCursor(0, 1);
lcd.print("Complete. ");
}
void LappingCycle() {
lcd.init();
lcd.backlight();
lcd.print("Lapping Cycle");
lcd.setCursor(0, 1);
lcd.print("Pass 0 of");
lcd.setCursor(10, 1);
lcd.print(LappingReps);
lcd.setCursor(9, 1);
lcd.print("0");
for (int i = 1; i <= LappingReps; i++) {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Lapping Cycle");
lcd.setCursor(0, 1);
lcd.print("Pass 0 of");
lcd.setCursor(10, 1);
lcd.print(LappingReps);
lcd.setCursor(5, 1);
lcd.print(i);
digitalWrite(LED_1, HIGH);
digitalWrite(relay_1, HIGH);
digitalWrite(relay_2, LOW);
digitalWrite(LED_2, LOW);
delay(FullLap);
digitalWrite(relay_1, LOW);
digitalWrite(LED_1, LOW);
digitalWrite(relay_2, HIGH);
digitalWrite(LED_2, HIGH);
delay(FullLap);
}
}
void InitialPosition() {
lcd.setCursor(0, 0);
lcd.print("SETTING START POS");
lcd.setCursor(0, 1);
lcd.print("Please Wait. ");
digitalWrite(relay_1, LOW);
digitalWrite(LED_1, HIGH);
digitalWrite(relay_1, HIGH);
digitalWrite(relay_2, LOW);
lcd.setCursor(0, 1);
lcd.print("Please Wait 10s");
delay(OneSec);
digitalWrite(LED_1, LOW);
lcd.setCursor(0, 1);
lcd.print("Please Wait 9s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 8s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 7s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 6s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 5s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 4s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 3s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 2s ");
delay(OneSec);
lcd.setCursor(0, 1);
lcd.print("Please Wait 1s ");
delay(OneSec);
digitalWrite(relay_1, LOW);
digitalWrite(relay_2, LOW);
digitalWrite(LED_1, LOW);
}
void SetupModeINC() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Setup Mode");
lcd.setCursor(0, 1);
lcd.print("Count");
lcd.setCursor(7, 1);
lcd.print(LappingReps);
LappingReps++;
lcd.setCursor(0, 1);
lcd.print("Count");
lcd.setCursor(7, 1);
lcd.print(LappingReps);
delay(OneSec);
return;
}
void SetupModeDEC() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Setup Mode");
lcd.setCursor(0, 1);
lcd.print("Count");
lcd.setCursor(7, 1);
lcd.print(LappingReps);
LappingReps--;
lcd.setCursor(0, 1);
lcd.print("Count");
lcd.setCursor(7, 1);
lcd.print(LappingReps);
delay(OneSec);
return;
}
void ResetPosition() {
digitalWrite(LED_1, LOW);
digitalWrite(relay_1, HIGH);
digitalWrite(LED_1, HIGH);
digitalWrite(relay_2, LOW);
digitalWrite(LED_2, LOW);
delay(FullLap);
digitalWrite(LED_1, LOW);
digitalWrite(relay_1, LOW);
digitalWrite(relay_2, LOW);
digitalWrite(LED_2, LOW);
}
void SetupMode() {
/* wait for exit button (A3) press*/
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Setup Loop count");
lcd.setCursor(0, 1);
lcd.print("Press INC/DEC");
while (digitalRead(A3 )) {
if (!digitalRead(A0) ) { SetupModeINC(); }
if (!digitalRead(A1) ) SetCycleMode();
if (!digitalRead(A2) ) { SetupModeDEC(); }
if (!digitalRead(A3) ) return;
}
return;
}
void SetCycleMode() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Set Cycle Mode");
lcd.setCursor(0, 1);
lcd.print("Move to Position");
/* Move to position*/
digitalWrite(LED_1, HIGH);
digitalWrite(relay_1, HIGH);
digitalWrite(relay_2, LOW);
digitalWrite(LED_2, LOW);
/* time in seconds is a guess now*/
for (int secs = 1; secs <= 6; secs++) {
delay(OneSec);
}
InitMe = false;
}