/* 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, 16, 2);
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
#define led1 5
#define led2 6
int pauzamica = 250;
long oldPosition = -999;
byte piviem1 = 0;
byte piviem2 = 0;
byte piviem = 0;
byte pwmmax = 255;
int spid =0;
float k = 25.5;
long posmax = (long)(pwmmax/k);
byte semn = 0;
int counter = 0;
void setup() {
Serial.begin(9600);
Serial.println(" ");
Serial.println("PWM control 2 outputs using Encoder !");
// 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);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
analogWrite(led1, 0);
analogWrite(led2, 0);
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
counter++; // Clockwise
if (counter > posmax)
{
counter = posmax;
}
}
if (dtValue == LOW) {
counter--; // Counterclockwise
if (counter < -posmax)
{
counter = -posmax;
}
}
if (counter > 0)
{
piviem1 = k*counter;
piviem2 = 0;
piviem = piviem1;
Serial.print(piviem1);
Serial.print("/255 --> ");
spid = map(piviem,0,255,0,100);
Serial.print(spid);
Serial.println("%");
semn =1;
}
if (counter < 0)
{
piviem1 = 0;
piviem2 = -k*counter;
piviem = piviem2;
Serial.print(piviem2);
Serial.print("/255 --> ");
spid = map(piviem,0,255,0,100);
Serial.print(-spid);
Serial.println("%");
semn =2;
}
if (counter == 0)
{
piviem1 = 0;
piviem2 = 0;
piviem = 0;
semn = 0;
Serial.print(piviem1);
Serial.print("/255 --> ");
spid = map(piviem,0,255,0,100);
Serial.print(spid);
Serial.println("%");
}
analogWrite(led1, piviem1);
analogWrite(led2, piviem2);
} // end main loop
// Get the counter value, disabling interrupts.
// This make sure readEncoder() doesn't change the value
// while we're reading it.
int getCounter() {
int result;
noInterrupts();
result = counter;
interrupts();
return result;
}
void resetCounter() {
noInterrupts();
counter = 0;
piviem1 = 0;
piviem2 = 0;
piviem = 0;
spid =0;
semn = 0;
Serial.println("STOP!");
interrupts();
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Speed:");
lcd.setCursor(7,0);
if (spid < 100) lcd.print(" ");
if (spid < 10) lcd.print(" ");
if (semn == 0) lcd.print(" ");
if (semn == 1) lcd.print("+");
if (semn == 2) lcd.print("-");
lcd.print(spid);
lcd.print("% ");
lcd.setCursor(0, 1);
lcd.print("PWM");
if (semn == 0) lcd.print(" :");
if (semn == 1) lcd.print("1:");
if (semn == 2) lcd.print("2:");
lcd.setCursor(5,1);
if (piviem < 100) lcd.print(" ");
if (piviem < 10) lcd.print(" ");
lcd.print(piviem);
lcd.print("/255 ");
if (digitalRead(ENCODER_SW) == LOW) {
resetCounter();
delay(pauzamica);
}
}