#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int receiver_pin=7;
int step_pin = 4;
int dir_pin = 5;
bool rotate = false; //flag
bool direction = HIGH;
int stepDelay=10000;
void setup() {
lcd.begin(16,2);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("IR remote");
pinMode(step_pin, OUTPUT);
pinMode(dir_pin, OUTPUT);
IrReceiver.begin(receiver_pin,ENABLE_LED_FEEDBACK);
Serial.begin(9600);
}
void loop() {
if(IrReceiver.decode())
{
int value = IrReceiver.decodedIRData.command;
handle(value);
IrReceiver.resume();
}
if(rotate){
rotateMotor();
}
}
void handle(int value){
switch (value) {
case 162:
Serial.print(162); // Power
break;
case 226:
Serial.print(226); // Menu
break;
case 34:
Serial.print(34); // Test
break;
case 2:
stepDelay = max(stepDelay-1000, 1000);// Plus
displaySpeed();
break;
case 194:
Serial.print(194); // Back
break;
case 224:
direction= LOW; // Previous
break;
case 168:
rotate=true; // Play
break;
case 144:
direction=HIGH; // Next
break;
case 104:
rotate=false; // 0
break;
case 152:
stepDelay = min(stepDelay+1000, 10000); // Minus
displaySpeed();
break;
case 176:
Serial.print(176); // C
break;
case 48:
Serial.print(48); // 1
break;
case 24:
Serial.print(24); // 2
break;
case 122:
Serial.print(122); // 3
break;
case 16:
Serial.print(16); // 4
break;
case 56:
Serial.print(56); // 5
break;
case 90:
Serial.print(90); // 6
break;
case 66:
Serial.print(66); // 7
break;
case 74:
Serial.print(74); // 8
break;
case 82:
Serial.print(82); // 9
break;
default:
Serial.println("Unknown command"); // For unknown commands
break;
}
}
void rotateMotor(){
digitalWrite(dir_pin, direction);
digitalWrite(step_pin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(step_pin, LOW);
delayMicroseconds(stepDelay);
}
void displaySpeed()
{
float stepsPerSeconds = 1000000/stepDelay;
float rpm = (stepsPerSeconds/200)*60;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("rpm: ");
lcd.print(rpm, 2);
}