не выходит из цикла

Jameson
Offline
Зарегистрирован: 21.03.2014

 Собственно не могу понять почему при не соблюдении условий не выходит  из цикла While, собственно есть значение с компаса  и значение в котором машина дожна быть ( значение с компаса + 40) 

Вот код: может кто знает

#define Trig 2
#define Echo 3
#define Trigg 6
#define Echoo 7      
#define D1 8          
#define M1 9          
#define D2 10          
#define M2 11
int ledPin = 5; 
char incomingByte;
#include "Wire.h"
#include "HMC5883L.h"
HMC5883L compass;
float first_angle;
float second_angle=0;
byte second_angle_accuired = 0;

void setup() 
{ 
  Wire.begin();
  compass = HMC5883L();  
  setupHMC5883L();    
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);  
  pinMode(Trig, OUTPUT); 
  pinMode(Echo, INPUT); 
  pinMode(Trigg, OUTPUT); 
  pinMode(Echoo, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600); 
} 
    
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 
unsigned int impulseTimee=0; 
unsigned int distance_cm=0; 

void loop() 
{ 
//-------------------------------------!!!!! 
  float heading = getHeading();
  Serial.println(heading);
  delay(250);
//-------------------------------------!!!!!  
  digitalWrite(Trig, HIGH); 
  delayMicroseconds(5000);
  digitalWrite(Trig, LOW); 
  impulseTime=pulseIn(Echo, HIGH);  
  distance_sm=impulseTime/58; 
  if ( distance_sm <= 7 )
  {
    distance_sm = 21 ;
  }
  Serial.println(distance_sm);
//-------------------------------------!!!!! 
  
  digitalWrite(Trigg, HIGH); 
  delayMicroseconds(5000); 
  digitalWrite(Trigg, LOW); 
  impulseTimee=pulseIn(Echoo, HIGH); 
  distance_cm=impulseTimee/58; 
  if ( distance_cm <=7)
  {
  distance_cm = 22 ;  
  }
  Serial.println(distance_cm);
//-------------------------------------!!!!! 

if (distance_sm > 20)
{
//-------------------------------------!!!!! 
if(distance_cm <= 25)
{
int timeposition=1;
 Serial.println(timeposition);
    digitalWrite(D1, LOW);  
    digitalWrite(D2, LOW);
    analogWrite(M1, 205	);       
    analogWrite(M2, 205 );
}
//-------------------------------------!!!!! 
else if (distance_cm > 25)
{
delay (250);
    first_angle = 40.00;
        if(!second_angle_accuired)
     {
         second_angle = first_angle + heading;
        second_angle_accuired = 1;
     }
    if ( heading <= second_angle )
{  
  Serial.println( second_angle);
    digitalWrite(D1, LOW);  
    digitalWrite(D2, LOW);
    analogWrite(M1, 150	);       
    analogWrite(M2, 0 );
}
//-------------------------------------!!!!! 
}
}
//-------------------------------------!!!!! 
else if (distance_sm <= 20)
{
 int timeposition=2;
 Serial.println(timeposition);

    delay (250);
    first_angle = 10.00;
        if(!second_angle_accuired)
     { 
         second_angle = heading + first_angle;
        second_angle_accuired = 1;
     }
    while ( heading <= second_angle )
{  
  float heading = getHeading();
  first_angle = 10.00;
        if(!second_angle_accuired)
     { 
         second_angle = heading + first_angle;
        second_angle_accuired = 1;
     }
    Serial.println( heading);
  Serial.println( second_angle);
    digitalWrite(D1, LOW);  
    digitalWrite(D2, LOW);
    analogWrite( M1,  0 );       
    analogWrite(M2, 150 );
}
//-------------------------------------!!!!! 
}
}
void setupHMC5883L(){
  int error;  
  error = compass.SetScale(0.88); 
  if(error != 0) Serial.println(compass.GetErrorText(error)); 
  error = compass.SetMeasurementMode(Measurement_Continuous); 
  if(error != 0) Serial.println(compass.GetErrorText(error)); 
}
//-------------------------------------!!!!! 
 
float getHeading(){
  MagnetometerScaled scaled = compass.ReadScaledAxis(); 
  float heading = atan2(scaled.YAxis, scaled.XAxis);  
  if(heading < 0) heading += 2*PI;
  if(heading > 2*PI) heading -= 2*PI;
  return heading * RAD_TO_DEG; 
}
//-------------------------------------!!!!! 

 

Snubist
Offline
Зарегистрирован: 18.02.2013

Неплохо бы коментарии вставить, и показать какое условие не срабатывает. Думаю что вряд ли кто то будет разбиратся совсем что тут написано.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Рассмотрим этот кусок:

   if(!second_angle_accuired)
     { 
         second_angle = heading + first_angle;
        second_angle_accuired = 1;
     }
  

в результате second_angle_accuired всегда неравен 0. heading < second_angle.

далее

    while ( heading <= second_angle )
{  
  float heading = getHeading();
  first_angle = 10.00;
        if(!second_angle_accuired)
     { 
         second_angle = heading + first_angle;
        second_angle_accuired = 1;
     }
    Serial.println( heading);
  Serial.println( second_angle);
    digitalWrite(D1, LOW);  
    digitalWrite(D2, LOW);
    analogWrite( M1,  0 );       
    analogWrite(M2, 150 );
}

в начале мы присваиваем новое значение heading

далее second_angle присваивается сумма heading и 10.

таким образом в цикле всегда выполняется условие продолжения heading< second_angle

Jameson
Offline
Зарегистрирован: 21.03.2014
if(!second_angle_accuired)
  { 
      second_angle = heading + first_angle;
     second_angle_accuired = 1;
  }

тут я к текущему значению  heading (это значение  с цифрового компаса) прибавляю константу ( 10 ) и получаю угол в котором должна быть машина, если убрать if(!second_angle_accuired) то при изменении heading будет изменятся и окончательный угол second_angle.

 

    while ( heading <= second_angle )
{  
  float heading = getHeading();
  first_angle = 10.00;
        if(!second_angle_accuired)
     { 
         second_angle = heading + first_angle;
        second_angle_accuired = 1;
     }
    Serial.println( heading);
  Serial.println( second_angle);
    digitalWrite(D1, LOW);  
    digitalWrite(D2, LOW);
    analogWrite( M1,  0 );       
    analogWrite(M2, 150 );
}

у тут  допустим у меня heading=80  а first_angle=10 тогда second_angle=90, мне нужно чтобы пока second_angle был больше heading то выполнялась определенная функция, здесь это запуск правого движка.

Jameson
Offline
Зарегистрирован: 21.03.2014

 float heading = getHeading(); тут я не присваиваю новое значение а значение с компаса присваиваю переменной heading

tmr
Offline
Зарегистрирован: 19.05.2014
041    float heading = getHeading();
...
115    while ( heading <= second_angle )
116    {
117        float heading = getHeading();

В строке 115 определение heading из строки 041, в строке 117 вы создаете локальный heading видимый только внутри цикла while.

Т.е. heading из строки 041 и heading из строки 117 это две разных переменных.

Область видимости переменной