Line follower didnot running correctly if i combine with ultrasonic

I made a watering robot using a line follower (IR module) combined with ultrasonic to turn on a relay and a water pump. but when combined this robot didnot walk in the black lane but can detect objects, it runs randomly. What should I do?

#define motor1 2//right
#define motor2 3
#define motor3 4//left
#define motor4 5

#define S1 A1 //IR right
#define S2 A2
#define S3 A3 //IR middle
#define S4 A4
#define S5 A5 //IR left

#define relayka 25 //water pump right
#define relayki 27//water pummp left

#define trigkanan 9 //right
#define echokanan 8
#define trigkiri 24 //left
#define echokiri 26

double sensorpotkanan, sensorpotkiri, durasi;
int data1, data2, data3, data4, data5;

void setup() {

// put your setup code here, to run once:
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(motor3, OUTPUT);
pinMode(motor4, OUTPUT);

pinMode(S1, INPUT);
pinMode(S2, INPUT);
pinMode(S3, INPUT);
pinMode(S4, INPUT);
pinMode(S5, INPUT);

pinMode(trigkanan, OUTPUT);
pinMode(echokanan, INPUT);
pinMode(trigkiri, OUTPUT);
pinMode(echokiri, INPUT);

pinMode(relayka,OUTPUT);
pinMode(relayki, OUTPUT);

relayOff(relayki);
relayOff(relayka);
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:

IR();
USkanan();
USkiri();
relayOff(relayka);
relayOff(relayki);

if(data1 == LOW && data2 == LOW && data3 == HIGH && data4 == LOW && data5 == LOW){ //
Serial.println("CASE 1");
maju();

}
if((data1 == HIGH && data2 == HIGH && data3 == HIGH && data4 == LOW && data5 == LOW) ||
(data1 == HIGH && data2 == HIGH && data3 == LOW && data4 == LOW && data5 == LOW) ||
(data1 == LOW && data2 == HIGH && data3 == HIGH && data4 == LOW && data5 == LOW)){
Serial.println("CASE 2");
kananbelok();
}
if((data1 == LOW && data2 == LOW && data3 == HIGH && data4 == HIGH && data5 == HIGH ) ||
(data1 == LOW && data2 == LOW && data3 == LOW && data4 == HIGH && data5 == HIGH) ||
(data1 == LOW && data2 == LOW && data3 == HIGH && data4 == HIGH && data5 == LOW)){
Serial.println("CASE 3");
kiribelok();
}
if(data1 == HIGH && data2 == HIGH && data3 == HIGH && data4 == HIGH && data5 == HIGH){
Serial.println("CASE 4");
berhenti();
}
if(data1 == LOW && data2 == LOW && data3 == LOW && data4 == LOW && data5 == LOW){
Serial.println("CASE 5");
mundur();
}
if(sensorpotkanan <=8 && sensorpotkiri <=8){
Serial.println("CASE 8");
berhenti();
semprotDouble();
delay(2000);
// maju();
// delay(1000);
}
else if(sensorpotkanan <=8){
Serial.println("CASE 6");
berhenti();
semprotKanan();
delay(2000);
// maju();
// delay(1000);
}
else if(sensorpotkiri <=8){
Serial.println("CASE 7");
berhenti();
semprotKiri();
delay(2000);
// maju();
// delay(1000);
}
Serial.println(sensorpotkanan);
Serial.println(sensorpotkiri);
Serial.println("OUT");

}

void IR(){
data1 = digitalRead(S1); //kiri2
Serial.print(data1);
data2 = digitalRead(S2);//kiri
Serial.print(data2);
data3 = digitalRead(S3);//tengah
Serial.print(data3);
data4 = digitalRead(S4);//kanan
Serial.print(data4);
data5 = digitalRead(S5);
Serial.println(data5);
}

void berhenti(){ //stop
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
digitalWrite(motor3, LOW);
digitalWrite(motor4, LOW);
}

void maju(){ //forward
analogWrite(motor1, 55);
digitalWrite(motor2, LOW);
digitalWrite(motor3, LOW);
analogWrite(motor4, 55);
}

void mundur(){ //backward
digitalWrite(motor1, LOW);
analogWrite(motor2, 55);
analogWrite(motor3, 55);
digitalWrite(motor4, LOW);

}

void kiribelok(){ //turn left
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
digitalWrite(motor3, LOW);
analogWrite(motor4, 55);
}

void kananbelok(){ //turnright
analogWrite(motor1, 55);
digitalWrite(motor2, LOW);
digitalWrite(motor3, LOW);
digitalWrite(motor4, LOW);
}

void USkanan(){ //right
delay(100);
digitalWrite(trigkanan,LOW);
delayMicroseconds(2);
digitalWrite(trigkanan,HIGH);
delayMicroseconds(10);
digitalWrite(trigkanan,LOW);
durasi = pulseIn(echokanan,HIGH);
sensorpotkanan = durasi*0.034/2;
}

void USkiri(){ //left
delay(100);
digitalWrite(trigkiri,LOW);
delayMicroseconds(2);
digitalWrite(trigkiri,HIGH);
delayMicroseconds(10);
digitalWrite(trigkiri,LOW);
durasi = pulseIn(echokiri,HIGH);
sensorpotkiri = durasi*0.034/2;
}

int relayOn(int digital){
digitalWrite(digital, LOW);
return 1;
}

int relayOff(int digital){
digitalWrite(digital, HIGH);
return 0;
}

void semprotKiri(){ //water pump left
relayOn(relayki);
delay(5000);
relayOff(relayki);
}

void semprotKanan(){ //water pump right
relayOn(relayka);
delay(5000);
relayOff(relayka);
}

void semprotDouble(){ //water pump both
relayOn(relayka);
relayOn(relayki);
delay(5000);
relayOff(relayka);
relayOff(relayki);
}

sketch_mar18b.ino (4.68 KB)

What should I do?

  1. Read the stickies at the top of the forum. Edit your post, to post your code PROPERLY.
  2. Put EVERY { on a line BY ITSELF. Put EVERY } on a line BY ITSELF. Use Tools + Auto Format to properly indent your code.
  3. Use names that convey meaning, for your variables. dataN does not.
  4. Use the proper type (and size) for variables. The digitalRead() function returns a value in the range 0 to 1. You do not need a signed 16 bit variable to hold all the values in that range.

Your code would be orders of magnitude simpler if you combined all 5 line sensor readings into one variable.

You did not share any serial data, nor does it appear that you have anywhere near enough Serial.print() calls. So, only you can solve your problems.