// Stepper motor on Wokwi!
#include <Stepper.h>
#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
byte stepperStatus = 0;
byte stepperDir = 0; //CCW
byte rpm = 60;
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
#define PIN_RECEIVER 2 // Signal Pin of IR receiver
IRrecv receiver(PIN_RECEIVER);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void setup() {
// Init
lcd.init();
lcd.backlight();
// Print something
lcd.setCursor(3, 1);
lcd.print("Key:");
lcd.setCursor(2, 2);
lcd.print("Code:");
lcd.setCursor(3, 3);
lcd.print("RPM:");
// set the speed at 60 rpm:
myStepper.setSpeed(rpm);
// initialize the serial port:
Serial.begin(9600);
receiver.enableIRIn(); // Start the receiver
}
void loop() {
myStepper.setSpeed(rpm);
// Checks received an IR signal
if (receiver.decode()) {
translateIR();
receiver.resume(); // Receive the next value
}
if (stepperDir == 0){
// step one revolution in one direction:
if (stepperStatus == 1){
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);
}
}
if (stepperDir ==1){
if (stepperStatus == 1){
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
}
}
}
void translateIR()
{
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
case 162:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("Power");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 226:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("MENU");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 34:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("TEST");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 2:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("PLUS");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
rpm = rpm + 20;
lcd.setCursor(7, 3);
lcd.print(" ");
lcd.setCursor(8, 3);
lcd.print(rpm);
break;
case 194:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("BACK");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 224:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("PREV.");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
stepperDir = 1;
break;
case 168:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("PLAY");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
stepperStatus = !stepperStatus;
break;
case 144:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("NEXT");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
stepperDir = 0;
break;
case 104:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 0");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 152:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("MINUS");
lcd.setCursor(8, 2);
rpm = rpm - 20;
lcd.print(receiver.decodedIRData.command);
lcd.setCursor(7, 3);
lcd.print(" ");
lcd.setCursor(8,3);
lcd.print(rpm);
break;
case 176:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("key: C");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 48:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 1");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 24:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 2");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 122:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 3");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 16:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 4");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 56:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 5");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 90:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 6");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 66:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 7");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 74:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 8");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
case 82:
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("num: 9");
lcd.setCursor(8, 2);
lcd.print(receiver.decodedIRData.command);
break;
default:
lcd.clear();
lcd.print(receiver.decodedIRData.command);
lcd.print(" other button");
}
}