Probleme with a door sensor

I am currently making silvering of a door sensor for heavy truck garage. two ultrasonic sensors MaxSonar XL-WR1-points in the direction opposite to monitor two doors 20 feet wide. when a truck (or trailer) passes a sensor, the ATmega328 activates a buzzer for two seconds and then wait a minute before “reactivate” this door.

But I have problem. I installed three light and sometimes it does not work. I also have one problem with double warning, from the end of the period, the buzzer wakes of himself, without hindrance.

Here is the code

[code]int sensor1 = 0; //input from sensor 1
int sensor2 = 1; //input from sensor 2
int sensor1range = 10; //ranging signal for sensor 1
int sensor2range = 11; //ranging signal for sensor 2
int leftled = 12; //high if sensor1 have activate the buzzer
int rightled = 13; //high if sensor2 have activate the buzzer
int buzzer = 2; //output for buzzer
int debugled = 8; //high if in debug mode
int average1 = 0; //result of 5 ranging from sensor 1
int average2 = 0; //result of 5 rnaging form sensor 2
int range1[5]; //memorie for the range of sensor 1
int range2[5]; //memorie for the range of sensor 1
int paverage1 = 0; //memorie for the previous average form sensor 1
int paverage2 = 0; //memorie for the previous average form sensor 2
int counter1 = 0; //memorie for the counter of sensor 1
int counter2 = 0; //memorie for the counter of sensor 2
int serialreceive = 0; //value of the serial receiver
byte countervalue = 90; //value of the counter
byte objectclearvalue = 100; //value of the objectclear premition
volatile int bouton = LOW;
boolean range1ok = false; //indicate if the object is in the range of sensor1
boolean range2ok = false; //indicate if the object is in the range of sensor2
boolean objectclear1 = true; //indicate if the object are gone
boolean objectclear2 = true; //indicate if the object are gone
boolean active1ok = false; //indicate if all the permition are ok
boolean active2ok = false; //indicate if all the permition are ok
boolean counter1done = false; //indicate if the counter1 are done
boolean counter2done = false; //indicate if the counter2 are done

void setup()
{
Serial.begin(9600);
pinMode(sensor1,INPUT);
pinMode(sensor2,INPUT);
pinMode(sensor1range,OUTPUT);
pinMode(sensor2range,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(leftled,OUTPUT);
pinMode(rightled,OUTPUT);
pinMode(debugled,OUTPUT);
digitalWrite(sensor1range,LOW);
digitalWrite(sensor2range,LOW);
digitalWrite(buzzer,LOW);
digitalWrite(leftled,LOW);
digitalWrite(rightled,LOW);
digitalWrite(debugled,LOW);
attachInterrupt(1, debug, RISING);

}

void loop()
{
check_sensor();
math();
counter();
permition();
result();
Serial.print("average1 " );
Serial.println(average1);
Serial.print("average2 ");
Serial.println(average2);
Serial.print("counter1 ");
Serial.println(counter1);
Serial.print("counter2 ");
Serial.println(counter2);
}

void check_sensor()
{
for (int ii = 0; ii <= 4; ii++)
{
digitalWrite(sensor1range,HIGH);
delayMicroseconds(50);
digitalWrite(sensor1range,LOW);
digitalWrite(sensor2range,HIGH);
delayMicroseconds(50);
digitalWrite(sensor2range,LOW);
delay(100);
range1[ii] = analogRead(sensor1);
range2[ii] = analogRead(sensor2);
Serial.print("range1 “);
Serial.print(ii);
Serial.print(” ");
Serial.println(range1[ii]);
Serial.print("range2 “);
Serial.print(ii);
Serial.print(” ");
Serial.println(range2[ii]);
}
if(bouton == HIGH)
{
digitalWrite(debugled,HIGH);
}
}

void math()
{
average1 = (range1[0]+range1[1]+range1[2]+range1[3]+range1[4])/5;
average2 = (range2[0]+range2[1]+range2[2]+range2[3]+range2[4])/5;
if (average1 <= 119 && average1 >= 10) range1ok = true;
if (average2 <= 119 && average2 >= 10) range2ok = true;
paverage1 = average1+objectclearvalue;
paverage2 = average2+objectclearvalue;
}

void counter()
{
if(counter1 != 0)
{
counter1++;
}
if(counter2 != 0)
{
counter2++;
}
if(counter1 == countervalue)
{
counter1done = true;
counter1 = 0;
digitalWrite(leftled,LOW);
}
if(counter2 == countervalue)
{
counter2done = true;
counter2 = 0;
digitalWrite(rightled,LOW);
}
}

void permition()
{
if(average1 >= paverage1 && counter1done == true)
{
objectclear1 = true;
counter1done = false;
}
if(average2 >= paverage2 && counter2done == true)
{
objectclear2 = true;
counter2done = false;
}
if(range1ok == true && counter1 == 0 && objectclear1 == true) active1ok = true;
if(range2ok == true && counter2 == 0 && objectclear2 == true) active2ok = true;
}

void result()
{
if (active1ok == true && bouton != true)
{
digitalWrite(buzzer,HIGH);
delay(1000);
digitalWrite(buzzer,LOW);
range1ok = false;
counter1 = 1;
active1ok = false;
}
else if (active1ok == true && bouton == true)
{
digitalWrite(buzzer,HIGH);
digitalWrite(leftled,HIGH);
delay(1000);
digitalWrite(buzzer,LOW);
range1ok = false;
counter1 = 1;
active1ok = false;
}
if (active2ok == true && bouton != true)
{
digitalWrite(buzzer,HIGH);
delay(1000);
digitalWrite(buzzer,LOW);
range2ok = false;
counter2 = 1;
active2ok = false;
}
else if (active2ok == true && bouton == true)
{
digitalWrite(buzzer,HIGH);
digitalWrite(rightled,HIGH);
delay(1000);
digitalWrite(buzzer,LOW);
range2ok = false;
counter2 = 1;
active2ok = false;
}
}

void debug()
{
bouton = !bouton;
}

[/code]

Hi rockclodbuster,

Welcome to the RobotShop Forum. Given the time necessary to debug a program, we are not in a position to troubleshoot / test specific code. However, you may want to consult the Arduino -> Software forum. We hope that other people within this community may also eb able to provide some insight.

Best of luck,