IR Receiver Continously running

I have made a code that takes in inputs from the IR remote then turns the motors a certain way. All of my buttons work properly but once I press a button once. It runs that over and over again and I can't input another signal. All of the lights on my board flicker like its getting the IR signal a bunch of times. I'll post the code below. I suspect its not breaking the loop but I have no idea how to fix it. Thanks!

#include <IRremote.hpp>

#define IR_RECEIVE_PIN 11

const int PWM_M1 = 5;
const int IN1_M1 = 2;
const int IN2_M1 = 3;

const int PWM_M2 = 6;
const int IN1_M2 = 8;
const int IN2_M2 = 9;

int speed = 100;

// Function prototype
void stop();  

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Initialize IR receiver
  pinMode(PWM_M1, OUTPUT);
  pinMode(PWM_M2, OUTPUT);
  pinMode(IN1_M1, OUTPUT);
  pinMode(IN2_M1, OUTPUT);
  pinMode(IN1_M2, OUTPUT);
  pinMode(IN2_M2, OUTPUT);
}

void loop() {
  // Check if IR data is available
  if (IrReceiver.decode()) {
    // Handle the decoded IR signal
    unsigned long irData = IrReceiver.decodedIRData.decodedRawData;
    Serial.print("Received IR code: ");
    Serial.println(irData, HEX);

    // Switch based on received IR code
    switch (irData) {
      case 0x1BA45FF00:  // power
        break;  // No action for this IR code
      case 0x2B946FF00:  // VOL+
        forward();
        break;
      case 0x3B847FF00:  // FUNC/STOP
        stop();
        break;
      case 0x4BB44FF00:  // |<<
        turnLeft();
        break;
      case 0x5BF40FF00:  // >||
        stop();
        break;
      case 0x6BC43FF00:  // >>|
        turnRight();
        break;
      case 0x8EA15FF00:  // VOL-
        backward();
        break;
      default:
        Serial.println("Unknown IR code");
        break;
    }

    // Ready to receive the next signal
   IrReceiver.resume();  
  }
}

void forward() {
  Serial.println("Moving forward");
  analogWrite(PWM_M1, 255);
  analogWrite(PWM_M2, 225);

  digitalWrite(IN1_M1, HIGH);
  digitalWrite(IN2_M1, LOW);

  digitalWrite(IN1_M2, HIGH);
  digitalWrite(IN2_M2, LOW);
}

void backward() {
  Serial.println("Moving backward");
  analogWrite(PWM_M1, 225);
  analogWrite(PWM_M2, 225);

  digitalWrite(IN1_M1, LOW);
  digitalWrite(IN2_M1, HIGH);

  digitalWrite(IN1_M2, LOW);
  digitalWrite(IN2_M2, HIGH);
}

void turnLeft() {
  Serial.println("Turning left");
  analogWrite(PWM_M1, 0);
  analogWrite(PWM_M2, 225);

  digitalWrite(IN1_M1, HIGH);
  digitalWrite(IN2_M1, LOW);

  digitalWrite(IN1_M2, HIGH);
  digitalWrite(IN2_M2, LOW);
}

void turnRight() {
  Serial.println("Turning right");
  analogWrite(PWM_M1, 225);
  analogWrite(PWM_M2, 0);

  digitalWrite(IN1_M1, HIGH);
  digitalWrite(IN2_M1, LOW);

  digitalWrite(IN1_M2, HIGH);
  digitalWrite(IN2_M2, LOW);
}

void stop() {
  Serial.println("Stopping motors");
  digitalWrite(IN1_M1, LOW);
  digitalWrite(IN2_M1, LOW);

  digitalWrite(IN1_M2, LOW);
  digitalWrite(IN2_M2, LOW);
}

Here is a screenshot of my wiring diagram

A post was split to a new topic: IR Receiver running continuously

If you are using classic arduino board, you can't use pin3 for analogwrite.
Or you have to turn receiver off before you use pin3.

1 Like

Ok, switched the pins but its still running continuously. In my serial monitor, it is constantly running and giving me random hex codes. So I still cant stop the motors.

The posted sketch does not use pin 3 with analogWrite() but in any case it is perfectly valid to do so

  • Do not power motors with your Arduino. :grimacing:

You are right. Op was using digitalwrite. My mistake.

What else should I use then?