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)