не выходит из цикла
- Войдите на сайт для отправки комментариев
Сб, 31/05/2014 - 22:22
Собственно не могу понять почему при не соблюдении условий не выходит из цикла 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; } //-------------------------------------!!!!!
Неплохо бы коментарии вставить, и показать какое условие не срабатывает. Думаю что вряд ли кто то будет разбиратся совсем что тут написано.
Рассмотрим этот кусок:
в результате second_angle_accuired всегда неравен 0. heading < second_angle.
далее
в начале мы присваиваем новое значение heading
далее second_angle присваивается сумма heading и 10.
таким образом в цикле всегда выполняется условие продолжения heading< second_angle
тут я к текущему значению heading (это значение с цифрового компаса) прибавляю константу ( 10 ) и получаю угол в котором должна быть машина, если убрать if(!second_angle_accuired) то при изменении heading будет изменятся и окончательный угол second_angle.
у тут допустим у меня heading=80 а first_angle=10 тогда second_angle=90, мне нужно чтобы пока second_angle был больше heading то выполнялась определенная функция, здесь это запуск правого движка.
float
heading = getHeading(); тут я не присваиваю новое значение а значение с компаса присваиваю переменной
headingВ строке 115 определение heading из строки 041, в строке 117 вы создаете локальный heading видимый только внутри цикла while.
Т.е. heading из строки 041 и heading из строки 117 это две разных переменных.
Область видимости переменной