My car randomly stops working after some time

i'm making an rc car with bluetooth and a distance sensor, but i don't think the bluetooth is the issue here. it just stops working. like, it'd be in the middle of printing my distance or something and then just stop. Anyone got any idea as to why? maybe it ran out of memory?
code:

//bluetooth
#include <SoftwareSerial.h>
const byte rx = 2;
const byte tx = 3;
int array[9];
int order = 0;
SoftwareSerial mySerial(rx, tx);
//car
int in1 = 4;
int in2 = 5;
int in3 = 6;
int in4 = 7;
int reverse_right = 8;
int reverse_left = 9;
int pinker_right = 10;
int pinker_left = 11;
int head_left = 12;
int head_right = 13;
//distance
int echo = A0;
int trig = A1;
float duration, distance; 
unsigned long clock = 0;
int backingUp = 0;

void LedOff(){
  for(int i = 8; i < 14; i++){
    digitalWrite(i, LOW);
  }
}

void setup(){
  //bluetooth setup
  mySerial.begin(9600);
  Serial.begin(9600);
  pinMode(rx, INPUT);
  pinMode(tx, OUTPUT);
  //car setup
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(reverse_right, OUTPUT);
  pinMode(reverse_left, OUTPUT);
  pinMode(pinker_right, OUTPUT);
  pinMode(pinker_left, OUTPUT);
  pinMode(head_left, OUTPUT);
  pinMode(head_right, OUTPUT);
  //distance setup
  pinMode(trig, OUTPUT);  
	pinMode(echo, INPUT);
}

void loop()
{
  if(millis() - clock >= 200 && mySerial.available() == 0){
    clock = millis();
    digitalWrite(trig, LOW);  
	  delayMicroseconds(2);  
	  digitalWrite(trig, HIGH);  
	  delayMicroseconds(10);  
	  digitalWrite(trig, LOW);
    duration = pulseIn(echo, HIGH, 50000);
    distance = (duration*.0343)/2; 
	  Serial.println(distance);  
	  if(distance <= 12 && backingUp == 0){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      digitalWrite(reverse_right, HIGH);
      digitalWrite(reverse_left, HIGH);
      backingUp = 1;
    }
    if(distance > 12 && backingUp == 1){
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      LedOff();
      backingUp = 0;
    }
  }
  if(mySerial.available() > 0){
    //fill array with messages
    array[order]=mySerial.read();
    order++;
    //print array and execute command based on message
    if(order == 8){
      order = 0;
      for(int i = 0; i <= 8; i++){
        Serial.print(array[i]);
      }
      Serial.println("");

      digitalWrite(trig, LOW);  
	    delayMicroseconds(2);  
	    digitalWrite(trig, HIGH);  
	    delayMicroseconds(10);  
	    digitalWrite(trig, LOW);
      duration = pulseIn(echo, HIGH, 50000);
      distance = (duration*.0343)/2; 
	    Serial.println(distance);  
	    delay(100);

      if(array[6]==1 && distance >=12){
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        digitalWrite(head_left, HIGH);
        digitalWrite(head_right, HIGH);
        Serial.println("forward!");
      } else if(array[6]==2){
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        digitalWrite(reverse_right, HIGH);
        digitalWrite(reverse_left, HIGH);
        Serial.println("backward!");
      } else if(array[6]==8){
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        Serial.println("right!");
        digitalWrite(pinker_right, HIGH);
      } else if(array[6]==4){
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        Serial.println("left!");
        digitalWrite(pinker_left, HIGH);
      } else{
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
        LedOff();
      }
    }
  }
}

Before filling the array, check that enough data is available in mySerial.available() to avoid incomplete or corrupted data. You can modify your code like this:

//bluetooth
#include <SoftwareSerial.h>
const byte rx = 2;
const byte tx = 3;
int array[9];
int order = 0;
SoftwareSerial mySerial(rx, tx);

//car
int in1 = 4;
int in2 = 5;
int in3 = 6;
int in4 = 7;
int reverse_right = 8;
int reverse_left = 9;
int pinker_right = 10;
int pinker_left = 11;
int head_left = 12;
int head_right = 13;

//distance
int echo = A0;
int trig = A1;
float duration, distance; 
unsigned long clock = 0;
int backingUp = 0;

void LedOff(){
  for(int i = 8; i < 14; i++){
    digitalWrite(i, LOW);
  }
}

void setup(){
  //bluetooth setup
  mySerial.begin(9600);
  Serial.begin(9600);
  pinMode(rx, INPUT);
  pinMode(tx, OUTPUT);
  
  //car setup
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(reverse_right, OUTPUT);
  pinMode(reverse_left, OUTPUT);
  pinMode(pinker_right, OUTPUT);
  pinMode(pinker_left, OUTPUT);
  pinMode(head_left, OUTPUT);
  pinMode(head_right, OUTPUT);

  //distance setup
  pinMode(trig, OUTPUT);  
  pinMode(echo, INPUT);
}

void loop()
{
  if(millis() - clock >= 200 && mySerial.available() == 0){
    clock = millis();
    
    // Avoid using delayMicroseconds directly
    digitalWrite(trig, LOW);  
    delayMicroseconds(2);  
    digitalWrite(trig, HIGH);  
    delayMicroseconds(10);  
    digitalWrite(trig, LOW);

    // Add timeout for pulseIn in case of faulty reading
    duration = pulseIn(echo, HIGH, 20000);  // Reduced timeout to 20ms
    distance = (duration * 0.0343) / 2; 
    Serial.println(distance);  

    // Reverse the car if close to an obstacle
    if(distance <= 12 && backingUp == 0){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      digitalWrite(reverse_right, HIGH);
      digitalWrite(reverse_left, HIGH);
      backingUp = 1;
    }
    // Stop backing up if far enough
    if(distance > 12 && backingUp == 1){
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      LedOff();
      backingUp = 0;
    }
  }

  // Process Bluetooth commands
  if(mySerial.available() >= 8){  // Ensure the complete message is available
    for (int i = 0; i < 8; i++) {
      array[i] = mySerial.read();
    }
    order = 0;
    
    // Debug: print received command
    for(int i = 0; i < 8; i++){
      Serial.print(array[i]);
    }
    Serial.println("");

    // Check for valid distance before executing command
    digitalWrite(trig, LOW);  
    delayMicroseconds(2);  
    digitalWrite(trig, HIGH);  
    delayMicroseconds(10);  
    digitalWrite(trig, LOW);

    duration = pulseIn(echo, HIGH, 20000);  // Reduced timeout
    distance = (duration * 0.0343) / 2; 
    Serial.println(distance);  

    if(array[6] == 1 && distance >= 12){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      digitalWrite(head_left, HIGH);
      digitalWrite(head_right, HIGH);
      Serial.println("forward!");
    } else if(array[6] == 2){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      digitalWrite(reverse_right, HIGH);
      digitalWrite(reverse_left, HIGH);
      Serial.println("backward!");
    } else if(array[6] == 8){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      Serial.println("right!");
      digitalWrite(pinker_right, HIGH);
    } else if(array[6] == 4){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      Serial.println("left!");
      digitalWrite(pinker_left, HIGH);
    } else{
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      LedOff();
    }
  }
}

thanks! i won't be able to test right away, i'll tell you on thursday if it worked.

it worked!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.