Всем привет! Пишу скетчи для "Робоняши", а именно для датчиков линии. Скетч-то я уже написал, а вот добавить его в основной код у меня не получается(если быть точнее, при нажатии кнопки на ИК пульте робот входит в режим езды по линии, а вот выйти из него не может). Подскажите, пожалуйста, в чём заключается ошибка. Вот скетч: Код (C++): #include <Wire.h> #include <Strela.h> #include <IRremote.h> int LEFT_SENSOR_PIN = P1; int RIGHT_SENSOR_PIN = P8; int RECV_PIN = P12; int ff = 1; #define L1 60 #define L2 61 #define L3 62 #define L4 63 IRrecv irrecv(RECV_PIN); decode_results results; const unsigned long Vpered = 16736925; const unsigned long Nazad = 16754775; const unsigned long Vlevo = 16720605; const unsigned long Vpravo = 16761405; const unsigned long Stoppp = 16712445; const unsigned long VKL = 16728765; const unsigned long ViKL = 16730805; const unsigned long Svet = 16738455; const unsigned long SvetOFF = 16750695; const unsigned long LiniaON = 16756815; const unsigned long LiniaOFF = 16724175; int echoPin = P6; int trigPin = P7; long randNumber; void Vperedl() { drive(100, 100); } void Vlevol() { drive(55, -55); } void Vpravol() { drive(-55, 55); } void Nazadl() { drive(-100, -100); } void Stopl() { drive(0, 0); } void Pramo() { drive(100, 100); } void Povorotvpravo() { drive(55, -55); } void Povorotvlevo() { drive(-55, 55); } void Svetl() { uDigitalWrite(P5, HIGH); } void Vperedll() { drive(60, 60); } void Vlevoll() { drive(-50, 50); }void Vpravoll() { drive(50, -50); } void SvetOFFl() { uDigitalWrite(P5, LOW); } void setup() { Serial.begin(9600); irrecv.enableIRIn(); irrecv.resume(); motorConnection(1, 0); uPinMode(trigPin, OUTPUT); uPinMode(echoPin, INPUT); uPinMode(BUZZER, OUTPUT); uPinMode(P5, OUTPUT); } void loop() { uDigitalWrite(L1, HIGH); uDigitalWrite(L2, HIGH); uDigitalWrite(L3, HIGH); uDigitalWrite(L4, HIGH); if (irrecv.decode(&results)) { Serial.println(results.value, DEC); if (results.value == Vpered) { Vperedl(); delay(500); } if (results.value == Vlevo) { Vlevol(); delay(500); } if (results.value == Vpravo) { Vpravol(); delay(500); } if (results.value == Nazad) { Nazadl(); delay(500); } if (results.value == Stoppp) { Stopl(); delay(500); } if (results.value == Svet) { Svetl(); delay(200); } if (results.value == SvetOFF) { SvetOFFl(); delay(200); } irrecv.resume (); } if (results.value == VKL) { while (1<2){ int duration, cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); Serial.println(duration); if (duration>2700) { Pramo(); } else { int rnd = random(1, 10); if (rnd > 5) { Povorotvpravo(); delay(500); } else { Povorotvlevo(); delay(500); } } decode_results results; if (irrecv.decode(&results)) { if (results.value == ViKL) { break; }}} irrecv.resume(); } if (results.value == LiniaON) { while(ff<2){ boolean left = !digitalRead(LEFT_SENSOR_PIN); boolean right = !digitalRead(RIGHT_SENSOR_PIN); Serial.println(digitalRead(RIGHT_SENSOR_PIN)); Serial.println(digitalRead(LEFT_SENSOR_PIN)); if(digitalRead(RIGHT_SENSOR_PIN) == 0 && digitalRead(LEFT_SENSOR_PIN) == 0){ Vperedll(); } if(digitalRead(LEFT_SENSOR_PIN) == 0 && digitalRead(RIGHT_SENSOR_PIN) == 1){ Vlevoll(); } if(digitalRead(LEFT_SENSOR_PIN) == 1 && digitalRead(RIGHT_SENSOR_PIN) == 0){ Vpravoll(); } } decode_results results; if (irrecv.decode(&results)) { if (results.value == LiniaOFF) { ff = 3; } irrecv.resume(); } } }
На это ноль внимания. Вот с каким участком у меня проблемы: В режим езды по линии входит, а выйти - нет.
зачем? есть же while(TRUE) 1) while(TRUE){...} это как delay(...) : использовать в совсем крайнем случае. поэтому из цикла и не выходит. старайся не использовать бесконечные циклы. есть void loop(){...} и все, не нужно больше нагружать контроллер сравнениями и свой мозг тестами.
я даже не столько про автоформатирование, сколько про все фичи впринципе. версии для разных осей может выходят и не всегда в одно и то же время, но всегда с одинаковым функционалом. не понимаю, причем тут линукс как таковой.