#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define encoder_a 2 //encoder A = arduino pin 2
#define encoder_b 3 //encoder B = arduino pin 3
#define motor_step 4 //motor step = arduino pin 4
#define motor_direction 5 //motor direction = arduino pin 5
#define FirstButtonPin 6 //First Button Pin to arduino pin 6
#define SecondtButtonPin 7 //Second Button Pin to arduino pin 7
#define SelectionPin 8 //SelectionPin= arduino pin 8
#define LimitRightPin 9 //Right Limit switch Pin to arduino pin 9
#define LimitLeftPin 10 //Left Limit switch Pin to arduino pin 10
#define StartSwitchPin 11 //Start Switch Pin Pin to arduino pin 11
#define HomeSwitchPin 12 //HomeSwitchPin to arduino pin 12
#define ENpin 13 //Enable Pin to arduino pin 13
bool Button1 , Button2 , Selection, LimitSwitchR, LimitSwitchL , StartSwitch , HomeSwitch ;
short Ratio = 2 , counter = 0 , X = 0 , Y = 0 ;
volatile long motor_position, encoder;
void setup ()
{
// Initialize LCD
lcd.init();
lcd.backlight();
//set up the various outputs
pinMode(motor_step, OUTPUT);
pinMode(motor_direction, OUTPUT);
pinMode(FirstButtonPin, INPUT_PULLUP);
pinMode(SecondtButtonPin, INPUT_PULLUP);
pinMode(LimitRightPin, INPUT_PULLUP);
pinMode(LimitLeftPin, INPUT_PULLUP);
pinMode(StartSwitchPin, INPUT_PULLUP);
pinMode(HomeSwitchPin, INPUT_PULLUP);
pinMode (ENpin,OUTPUT); digitalWrite(ENpin, LOW);
pinMode(SelectionPin , INPUT);
// then the encoder inputs
pinMode(encoder_a, INPUT);
pinMode(encoder_b, INPUT);
digitalWrite(encoder_a, HIGH);
digitalWrite(encoder_b, HIGH);
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, encoderPinChangeA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, encoderPinChangeB, CHANGE);
encoder = 0;
}
void encoderPinChangeA()
{
if (digitalRead(encoder_a) == digitalRead(encoder_b))
{
encoder--;
}
else
{
encoder++;
}
}
void encoderPinChangeB()
{
if (digitalRead(encoder_a) != digitalRead(encoder_b) )
{
encoder--;
}
else
{
encoder++;
}
}
void Clockwise () {
digitalWrite(motor_direction, HIGH);
digitalWrite(motor_step, HIGH);
digitalWrite(motor_step, LOW);
counter++;
encoder = 0;
delay(100);
}
void Counterclockwise() {
digitalWrite(motor_direction, LOW);
digitalWrite(motor_step, HIGH);
digitalWrite(motor_step, LOW);
delay(100);
counter--;
encoder = 0;
delay(100);
}
void loop()
{
Button1 = digitalRead(FirstButtonPin);
Button2 = digitalRead(SecondtButtonPin);
Selection = digitalRead(SelectionPin);
LimitSwitchR = digitalRead(LimitRightPin);
LimitSwitchL = digitalRead(LimitLeftPin);
StartSwitch = digitalRead(StartSwitchPin);
HomeSwitch = digitalRead(HomeSwitchPin);
if (Selection == LOW) {
if (Button1 == LOW && LimitSwitchR == LOW) {
Clockwise ();
}
else if (Button2 == LOW && LimitSwitchL == LOW) {
Counterclockwise();
}
}
else {
if (encoder > 0 && LimitSwitchR == LOW)
{
delay(50);
motor_position++;
counter++;
if (motor_position % Ratio == 0) {
digitalWrite(motor_direction, HIGH);
digitalWrite(motor_step, HIGH);
digitalWrite(motor_step, LOW);
}
encoder = 0 ;
if (motor_position % Ratio == 0) {
motor_position = 0;
}
}
else if (encoder < 0 && LimitSwitchL == LOW)
{
delay(50);
motor_position++;
counter--;
if (motor_position % Ratio == 0) {
digitalWrite(motor_direction, LOW);
digitalWrite(motor_step, HIGH);
digitalWrite(motor_step, LOW);
}
encoder = 0 ;
if (motor_position % Ratio == 0) {
motor_position = 0;
}
}
}
if ((StartSwitch == LOW && LimitSwitchR == LOW) || X == 1) {
X = 1 ; Y = 2 ;
Clockwise ();
}
else if ((HomeSwitch == LOW && LimitSwitchL == LOW) || Y == 1) {
X = 2 ; Y = 1 ;
Counterclockwise();
}
if ( LimitSwitchR == HIGH){X = 2;}
if ( LimitSwitchL == HIGH){Y = 2;}
lcd.setCursor(0, 1);
lcd.print("counter:");
lcd.setCursor(9, 1);
lcd.print(counter);
}