#include "AccelStepper.h"
#include "Timer.h"
int buttonState=0;
int prevButtonState=0;
int mode=0;
int pot=0;
int prvbtnstate=0;
int sw;
int mod=0;
Timer timer;
const int RotaryCLK = 2; //CLK pin on the rotary encoder
const int RotaryDT = 1; //DT pin on the rotary encoder
const int RotarySW = 0; //SW pin on the rotary encoder (Button function)
//Defining variables
int ButtonCounter = 0;
int RotateCounter = 0;
//Statuses
int CLKNow;
int CLKPrevious;
int DTNow;
int DTPrevious;
// Time
float TimeNow1;
float TimeNow2;
float TimeNow3;
#define dirPin 3
#define stepPin 4
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// put your setup code here, to run once:
digitalWrite(5, HIGH);
digitalWrite(6,HIGH);
Serial.begin(9600);
stepper.setMaxSpeed(1000);
pinMode(7,INPUT);
pinMode(8, INPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
CLKPrevious = digitalRead(RotaryCLK);
DTPrevious = digitalRead(RotaryDT);
attachInterrupt(digitalPinToInterrupt(RotaryCLK), rotate, CHANGE);
attachInterrupt(digitalPinToInterrupt(RotarySW), buttonPressed, FALLING);
TimeNow1 = millis(); //Start time
timer.start();
timer.stop();
}
void RunTheMotor() //function for the motor
{
stepper.enableOutputs(); //enable pins
stepper.moveTo(RotateCounter); //-1 is to match the rotation of the encoder with the rotation of the stepper
while(stepper.distanceToGo() != 0)
{
stepper.runToNewPosition(RotateCounter);
}
}
void buttonPressed()
{
TimeNow2 = millis();
if(TimeNow2 - TimeNow3 > 1000)
{
ButtonCounter++; //increase the counter
}
TimeNow3 = millis();
//You can add something here, like resetting the RotateCounter (e.g. redefine 0 position)
}
void rotate()
{
CLKNow = digitalRead(RotaryCLK); //Read the state of the CLK pin
// If last and current state of CLK are different, then a pulse occurred
if (CLKNow != CLKPrevious && CLKNow == 1){
// If the DT state is different than the CLK state then
// the encoder is rotating CCW so increase
if (digitalRead(RotaryDT) != CLKNow) {
RotateCounter++;
} else {
// Encoder is rotating CW so decrease
RotateCounter--;
}
}
CLKPrevious = CLKNow; // Store last CLK state
}
void button(){
buttonState=digitalRead(7);
if(buttonState != prevButtonState){
if(buttonState==HIGH){
if(mode==1){
mode=0;
timer.stop();
digitalWrite(12,HIGH);//red
digitalWrite(11,LOW);
digitalWrite(5, LOW);
digitalWrite(6,LOW);
}else{
//yellow
mode=1;
timer.start();
digitalWrite(5, HIGH);
digitalWrite(6,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
}
}
}
prevButtonState=buttonState;
delay(50);
}
void motor(){
stepper.setCurrentPosition(0);
stepper.moveTo(66.6667);
stepper.setSpeed(500);
stepper.runSpeedToPosition();
stepper.setCurrentPosition(0);
}
void loop() {
// put your main code here, to run repeatedly:
sw=digitalRead(8);
Serial.println(sw);
while(sw!=1){
sw=digitalRead(8);
button();
if(mode==0){
TimeNow2 = millis();
if(TimeNow2 - TimeNow1 > 200)
{
TimeNow1 = millis();
}
RunTheMotor();
}else{
if(timer.read()>=4999){
timer.stop();
stepper.setCurrentPosition(0);
stepper.moveTo(66.67);
stepper.setSpeed(200);
if(stepper.distanceToGo() !=0){
while(stepper.distanceToGo()!=0)
stepper.runSpeedToPosition();
stepper.setCurrentPosition(0);
}else{
stepper.setSpeed(0);
stepper.runSpeed();
}
timer.start();
}
}
}
if(sw==1){
digitalWrite(5, HIGH);
digitalWrite(6,HIGH);
stepper.setSpeed(-1);
stepper.runSpeed();
}
}