Hello. So I am currently making a line follower robot with 3 sensors and the maze we have to finish has several areas where the IR sensors used for detecting the line will all be detecting the line at the same time. I want to use these as sort of checkpoints and want to break the loop present and move onto another new and different loop where certain things will be different such as movement speeds according to the area of the maze. Ive tried taking help from chatgpt and other forums but cant find my exact answer as everyone seems to simply use the same void loop but using a while function in the middle . Please can someone help me as i need a fully new loop in which i can once again paste the line follower code and change it according to my preferance. Once again i want the criterea for a new loop to start to be that all IR sensors (3 sensors) detect the black line
Here is my current code for the line follower using 3 ir sensors 2 motors and a L298N motor driver:
#define IR_SENSOR_RIGHT 11
#define IR_SENSOR_LEFT 12
#define MOTOR_SPEED 200
#define IR_SENSOR_MIDDLE 13
//Right motor
int enableRightMotor=6;
int rightMotorPin1=7;
int rightMotorPin2=8;
//Left motor
int enableLeftMotor=5;
int leftMotorPin1=9;
int leftMotorPin2=10;
void setup()
{
//The problem with TT gear motors is that, at very low pwm value it does not even rotate.
//If we increase the PWM value then it rotates faster and our robot is not controlled in that speed and goes out of line.
//For that we need to increase the frequency of analogWrite.
//Below line is important to change the frequency of PWM signal on pin D5 and D6
//Because of this, motor runs in controlled manner (lower speed) at high PWM value.
//This sets frequecny as 7812.5 hz.
TCCR0B = TCCR0B & B11111000 | B00000010 ;
// put your setup code here, to run once:
pinMode(enableRightMotor, OUTPUT);
pinMode(rightMotorPin1, OUTPUT);
pinMode(rightMotorPin2, OUTPUT);
pinMode(enableLeftMotor, OUTPUT);
pinMode(leftMotorPin1, OUTPUT);
pinMode(leftMotorPin2, OUTPUT);
pinMode(IR_SENSOR_RIGHT, INPUT);
pinMode(IR_SENSOR_LEFT, INPUT);
pinMode(IR_SENSOR_MIDDLE, INPUT);
rotateMotor(0,0);
}
void loop()
{
int rightIRSensorValue = digitalRead(IR_SENSOR_RIGHT);
int leftIRSensorValue = digitalRead(IR_SENSOR_LEFT);
int midIRsensorvalue = digitalRead(IR_SENSOR_MIDDLE);
//If none of the sensors detects black line, then go straight
if (rightIRSensorValue == LOW && leftIRSensorValue == LOW && midIRsensorvalue == HIGH)
{
rotateMotor(255, 255);
}
//If right sensor detects black line, then turn right
else if (rightIRSensorValue == HIGH && leftIRSensorValue == LOW && midIRsensorvalue == LOW)
{
while (midIRsensorvalue == LOW) {
rotateMotor(160, 230);
midIRsensorvalue = digitalRead(IR_SENSOR_MIDDLE);
}
}
//If left sensor detects black line, then turn left
else if (rightIRSensorValue == LOW && leftIRSensorValue == HIGH && midIRsensorvalue == LOW)
{
while (midIRsensorvalue == LOW) {
rotateMotor(230, 160);
midIRsensorvalue = digitalRead(IR_SENSOR_MIDDLE);
}
}
else if (rightIRSensorValue == HIGH && leftIRSensorValue == LOW && midIRsensorvalue == HIGH)
{
while (rightIRSensorValue == HIGH) {
rotateMotor(160, 215);
rightIRSensorValue = digitalRead(IR_SENSOR_RIGHT);
}
}
else if (rightIRSensorValue == LOW && leftIRSensorValue == HIGH && midIRsensorvalue == HIGH)
{
while (leftIRSensorValue == HIGH) {
rotateMotor(215, 160);
leftIRSensorValue = digitalRead(IR_SENSOR_LEFT);
}
}
//If both the sensors detect black line, then stop
else
{
rotateMotor(0, 0);
}
}
void rotateMotor(int rightMotorSpeed, int leftMotorSpeed)
{
if (rightMotorSpeed < 0)
{
digitalWrite(rightMotorPin1,LOW);
digitalWrite(rightMotorPin2,HIGH);
}
else if (rightMotorSpeed > 0)
{
digitalWrite(rightMotorPin1,HIGH);
digitalWrite(rightMotorPin2,LOW);
}
else
{
digitalWrite(rightMotorPin1,LOW);
digitalWrite(rightMotorPin2,LOW);
}
if (leftMotorSpeed < 0)
{
digitalWrite(leftMotorPin1,LOW);
digitalWrite(leftMotorPin2,HIGH);
}
else if (leftMotorSpeed > 0)
{
digitalWrite(leftMotorPin1,HIGH);
digitalWrite(leftMotorPin2,LOW);
}
else
{
digitalWrite(leftMotorPin1,LOW);
digitalWrite(leftMotorPin2,LOW);
}
analogWrite(enableRightMotor, abs(rightMotorSpeed));
analogWrite(enableLeftMotor, abs(leftMotorSpeed));
}