#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESPRotary.h>
#include <OneButton.h>
#include <MsTimer2.h>
volatile float realangle;
volatile int motorspeed;
volatile float anglelast;
volatile float angle;
volatile int encoderDir;
volatile int i;
LiquidCrystal_I2C mylcd(0x27,16,2);
ESPRotary encoder1;
OneButton button4(4,true);
OneButton button12(12,true);
OneButton button13(13,true);
void checkEncoder() {
if (digitalRead(2) == 0) {
delayMicroseconds(1000);
if (digitalRead(2) != digitalRead(3)) {
encoderDir = 1;
} else {
encoderDir = -1;
}
}
}
void attachInterrupt_fun_FALLING_2() {
checkEncoder();
angle = angle + 0.9*encoderDir*400;
}
void lcdDisplay() {
mylcd.setCursor(3-1, 1-1);
mylcd.print("Set Motor rounds:");
mylcd.setCursor(4-1, 2-1);
mylcd.print(String(angle / 360) + String(" rounds"));
}
void attachClick4() {
MotorMove();
}
void attachClick12() {
motorspeed = motorspeed - 1000;
Serial.println(motorspeed);
}
void MotorMove() {
int n = 0;
float delta = 0;
delta = abs(angle - anglelast);
n = delta / 0.1125;
if (angle >= anglelast) {
digitalWrite(5,HIGH);
} else {
digitalWrite(5,LOW);
}
for (int i = (1); i <= (n); i = i + (1)) {
steponepulse();
}
anglelast = angle;
MsTimer2::stop();
}
void attachClick13() {
motorspeed = motorspeed + 1000;
Serial.println(motorspeed);
}
void steponepulse() {
digitalWrite(6,HIGH);
delayMicroseconds(motorspeed);
digitalWrite(6,LOW);
delayMicroseconds(motorspeed);
}
void setup(){
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT);
realangle = 0;
motorspeed = 5000;
anglelast = 0;
angle = 0;
encoderDir = 1;
i = 0;
mylcd.init();
mylcd.backlight();
encoder1.begin(3, 2);
encoder1.setStepsPerClick(4);
pinMode(7, OUTPUT);
encoder1.loop();
pinMode(0, OUTPUT);
digitalWrite(7,LOW);
button4.attachClick(attachClick4);
button12.attachClick(attachClick12);
Serial.begin(9600);
pinMode(5, OUTPUT);
button13.attachClick(attachClick13);
pinMode(6, OUTPUT);
}
void loop(){
attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_FALLING_2,FALLING);
button4.tick();
button12.tick();
lcdDisplay();
button13.tick();
}