/* KY-040 Rotary Encoder Counter
Rotate clockwise to count up, counterclockwise to counter done.
Press to reset the counter.
Copyright (C) 2021, Uri Shaked
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
int counter = 0;
int result;
#include <AccelStepper.h>
int velocidade_motor = 100;
int aceleracao_motor = 100;
int sentido_horario = 0;
int sentido_antihorario = 0;
int numero = 0;
// Definicao pino ENABLE
int pino_enable = 7;
// Definicao pinos STEP e DIR
AccelStepper motor1(1,8,9 );
void setup() {
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize encoder pins
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
Serial.begin(9600);
pinMode(pino_enable, OUTPUT);
// Configuracoes iniciais motor de passo
motor1.setMaxSpeed(velocidade_motor);
motor1.setSpeed(velocidade_motor);
motor1.setAcceleration(aceleracao_motor);
Serial.println("Digite 1, 2 ou 3 e clique em ENVIAR...");
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
counter++; // Clockwise
}
if (dtValue == LOW) {
counter--; // Counterclockwise
}
}
// Get the counter value, disabling interrupts.
// This make sure readEncoder() doesn't change the value
// while we're reading it.
int getCounter() {
noInterrupts();
result = counter;
interrupts();
if (result >= 5)
{
Serial.println("Encoder OK - Parando motor...");
sentido_horario = 0;
sentido_antihorario = 0;
motor1.moveTo(0);
digitalWrite(pino_enable, HIGH);
resetCounter();
}
return result;
}
void resetCounter() {
noInterrupts();
counter = 0;
interrupts();
}
void loop() {
lcd.setCursor(3, 0);
lcd.print("Counter:");
lcd.setCursor(7, 1);
lcd.print(getCounter());
lcd.print(" ");
if (digitalRead(ENCODER_SW) == LOW) {
resetCounter();
}
// Aguarda os caracteres no serial monitor
if (Serial.available() > 0)
{
numero = Serial.read();
{
if (numero == '1')
{
Serial.println("Numero 1 recebido - Girando motor sentido horario.");
digitalWrite(pino_enable, LOW);
sentido_horario = 1;
sentido_antihorario = 0;
}
if (numero == '2')
{
Serial.println("Numero 2 recebido - Girando motor sentido anti-horario.");
digitalWrite(pino_enable, LOW);
sentido_horario = 0;
sentido_antihorario = 1;
}
if (numero == '3')
{
Serial.println("Numero 3 recebido - Parando motor...");
sentido_horario = 0;
sentido_antihorario = 0;
motor1.moveTo(0);
digitalWrite(pino_enable, HIGH);
}
}
}
// Move o motor no sentido horario
if (sentido_horario == 1)
{
motor1.moveTo(10000);
}
// Move o motor no sentido anti-horario
if (sentido_antihorario == 1)
{
motor1.moveTo(-10000);
}
// Comando para acionar o motor no sentido especificado
motor1.run();
}