Help for Last Year Project

Hi!

I’m last year engineering student and i have to do last year project. But im not good at coding.

My project will be this(given above link)
But i have a problem with codes. The algorithm must be (i think) like this;
Stop > Calculate the nearest distance > Move at low speed (calculated distance - 3cm) > Stop > When there is no obstacle > Move at max. speed (Car lenght + 5 cm ) > Stop and loop
Did someone make a project like this? Can you help me please ?
My codes;
#define echoPin 13
#define trigPin 12

int enA = 10;
int in1 = 9;
int in2 = 8;

int enB = 5;
int in3 = 7;
int in4 = 6;

int save, save1, save2, save3;
int savemain;
int savelast;
long sure, mesafe;
int x = 1000;
int s = 0;
int z = 0;
void sensor() {

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
sure = pulseIn(echoPin, HIGH);
mesafe = (sure / 2) / 29.1;
}
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);

sensor();
save = mesafe;
delay(x);
Serial.print(“Kayıt 1 :”);
Serial.println(save);

sensor();
save1 = mesafe;
delay(x);
Serial.print(“Kayıt 2 :”);
Serial.println(save1);

sensor();
save2 = mesafe;
delay(x);
Serial.print(“Kayıt 3 :”);
Serial.println(save2);
delay(x);

Serial.print(“Kayıtlar : (”);
Serial.print(save);
Serial.print(",");
Serial.print(save1);
Serial.print(",");
Serial.print(save2);
Serial.println(")");

if (save > save1 && save > save2 ) {
savemain = save;
}
else if (save1 > save && save1 > save2 ) {
savemain = save1;
}
else {
savemain = save2;
}
}

void loop() {
Serial.print(“Main Save”);
Serial.println(savemain);

sensor();
save3 = mesafe;
savelast = savemain - save3;

Serial.print(“Last Save”);
Serial.println(savelast);

Serial.print(“Mesafe”);
Serial.println((savemain - savelast));

if ((savemain - savelast) <= 5) {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(enA, 0);
analogWrite(enB, 0);
z = 1;
Serial.print("Mesafe 5 den az ");
Serial.println(z);
}
else if (((savemain - savelast) >= 5) && z == 1) {

digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, 250);
analogWrite(enB, 250);
delay(250);
z = 0;

}
else {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, 100);
analogWrite(enB, 100);

}
delay(250);

}

I can’t really help, but you should comment your code so it’s easier for you and other people to read!

What I can tell you, tho, is to try to isolate the problem step by step. Here’s a good ressource for Arduino debugging: https://www.circuito.io/blog/arduino-debugging/

2 Likes

Thanks for reply my topic.
I commented my codes, didnt it? If it does not appear, here is my codes;
#define echoPin 13
#define trigPin 12

int enA = 10;
int in1 = 9;
int in2 = 8;

int enB = 5;
int in3 = 7;
int in4 = 6;

int save, save1, save2, save3;
int savemain;
int savelast;
long sure, mesafe;
int x = 1000;
int s = 0;
int z = 0;
void sensor() {

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
sure = pulseIn(echoPin, HIGH);
mesafe = (sure / 2) / 29.1;
}
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);

sensor();
save = mesafe;
delay(x);
Serial.print(“Kayıt 1 :”);
Serial.println(save);

sensor();
save1 = mesafe;
delay(x);
Serial.print(“Kayıt 2 :”);
Serial.println(save1);

sensor();
save2 = mesafe;
delay(x);
Serial.print(“Kayıt 3 :”);
Serial.println(save2);
delay(x);

Serial.print(“Kayıtlar : (”);
Serial.print(save);
Serial.print(",");
Serial.print(save1);
Serial.print(",");
Serial.print(save2);
Serial.println(")");

if (save < save1 && save < save2 ) {
savemain = save;
}
else if (save1 < save && save1 < save2 ) {
savemain = save1;
}
else {
savemain = save2;
}
}

void loop() {
Serial.print(“Main Save”);
Serial.println(savemain);

sensor();
save3 = mesafe;
savelast = savemain - save3;

Serial.print(“Last Save”);
Serial.println(savelast);

Serial.print(“Mesafe”);
Serial.println((savemain - savelast));

if ((savemain - savelast) <= 5) {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(enA, 0);
analogWrite(enB, 0);
z = 1;
Serial.print("Mesafe 5 den az ");
Serial.println(z);
}
else if (((savemain - savelast) >= 5) && z == 1) {

digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, 250);
analogWrite(enB, 250);
delay(250);
z = 0;

}
else {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, 100);
analogWrite(enB, 100);

}
delay(250);

}

By the way, i talked with Gilles Vandelle and he gave my some advices.

  1. some generic comments:
    sensor() should return the distance instead of setting a global variable:
    long sensor() {
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    sure = pulseIn(echoPin, HIGH);
    return (sure / 2) / 29.1;
    }

then you can do:
save = sensor();

  1. 2nd comment you should name your variables with something more explicit than save1 save2… because the code as written is hard to understand

  2. 3rd encapsulate the motor commands in funtions like:

void stop() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(enA, 0);
analogWrite(enB, 0);
}

void turn(int turnspeed) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, turnspeed);
analogWrite(enB, turnspeed);
}

  1. Then the logic… there is something I don’t understand. Why you do: savelast = savemain - save3; and then: if ((savemain - savelast) <= 5) it will be easier and equivalent to write: if ((save3) <= 5) no, did I miss something?

  2. and last the variable “z” is a terrible name you should use a boolean and call it something like wait_for_opening_gate

Those are some very good advices, your code needs to be as clear as possible.

By commenting, I meant that you explain what each parts of the code do, like:

//This functions returns “true” if the temperature is higher than 15 degrees.