Добрый вечер имею проблему следующего характера. код не хочет проводить проверку на расстояние. вот сам гомнокод. не серчайте накидал без форматирования. Код (C++): #include <Servo.h> const int LeftMotorForward = 12; const int LeftMotorBackward = 11; const int RightMotorForward = 7; const int RightMotorBackward = 6; const int enA = 13; const int enB = 5; const int buzzerPin = 3; const int DISTANCE_MAX = 450; const int DISTANCE_MIN = 2; const int DST_STOP = 30; #define trig_pin A0 #define echo_pin A1 boolean SAFE_DISTANCE = true; int distance = 0; Servo servo_motor; // char btCommand = 'S'; unsigned long btTimer0 = 2000; unsigned long btTimer1 = 0; class Motor { int enablePin; int directionPin1; int directionPin2; public: Motor(int ENPin,int dPin1,int dPin2) { enablePin = ENPin; directionPin1 = dPin1; directionPin2 = dPin2; }; void Drive(int speed) { if(speed>=0) { digitalWrite(directionPin1, LOW); digitalWrite(directionPin2, HIGH); } else { digitalWrite(directionPin1, HIGH); digitalWrite(directionPin2, LOW); speed = - speed; } analogWrite(enablePin, speed); } }; Motor leftMotor = Motor(enA, LeftMotorForward, LeftMotorBackward); Motor rightMotor = Motor(enB, RightMotorForward, RightMotorBackward); void motorInitiation() { pinMode(enA, OUTPUT); pinMode(LeftMotorForward, OUTPUT); pinMode(LeftMotorBackward, OUTPUT); pinMode(enB, OUTPUT); pinMode(RightMotorForward, OUTPUT); pinMode(RightMotorBackward, OUTPUT); digitalWrite(enA, LOW); digitalWrite(enB, LOW); digitalWrite(LeftMotorForward, LOW); digitalWrite(LeftMotorBackward, HIGH); digitalWrite(RightMotorForward, LOW); digitalWrite(RightMotorBackward, HIGH); } int measureDistance() { long duration; int distance; digitalWrite(trig_pin, LOW); delayMicroseconds(3); // 3 digitalWrite(trig_pin, HIGH); delayMicroseconds(10); // 10 digitalWrite(trig_pin, LOW); duration = pulseIn(echo_pin, HIGH); Serial.print(4); distance = duration / 58; if (distance < DISTANCE_MIN ) {Serial.print (DISTANCE_MIN); return DISTANCE_MIN;} if (distance > DISTANCE_MAX ) {Serial.print (DISTANCE_MAX); return DISTANCE_MAX;} Serial.print (distance);return distance; } boolean isSAFE() { if (1) { distance = measureDistance(); if ( distance < DST_STOP ) //20см { Serial.print (6); return false; } } else { Serial.print (5); return true; } } void beep(unsigned char delayms) { analogWrite(buzzerPin, 20); delay(delayms); analogWrite(buzzerPin ,0); delay(delayms); } void moveStop() { leftMotor.Drive(0); rightMotor.Drive(0); } boolean moveForward() { servo_motor.write(100); if(isSAFE) { moveStop(); beep(50); beep(50); Serial.print (1); return false; SAFE_DISTANCE=true; } leftMotor.Drive(255); rightMotor.Drive(255); return true; Serial.print (9); } void moveBackward() { leftMotor.Drive(-255); rightMotor.Drive(-255); } boolean turnRight() { servo_motor.write(50); if(isSAFE) { moveStop(); beep(50); beep(50); Serial.print (2); return false; SAFE_DISTANCE=true; } leftMotor.Drive(128); rightMotor.Drive(255); Serial.print (8); } boolean turnLeft() { servo_motor.write(170); if(isSAFE) { moveStop(); beep(50); beep(50); Serial.print (3); return false; SAFE_DISTANCE=true; } leftMotor.Drive(255); rightMotor.Drive(128); Serial.print (7); } void moveBackRight() { leftMotor.Drive(-255); rightMotor.Drive(128); } void moveBackLeft() { leftMotor.Drive(128); rightMotor.Drive(-255); } void setup() { Serial.begin(9600); pinMode(trig_pin, OUTPUT); pinMode(echo_pin, INPUT); pinMode(buzzerPin, OUTPUT); beep(25); beep(25); beep(25); servo_motor.attach(8); //Пин подключения сервомотора } void loop() { if (Serial.available()>0) { btTimer1 = millis(); btCommand = Serial.read(); switch (btCommand) { case 'F': moveForward(); break; case 'B': moveBackward(); break; case 'L': turnLeft(); break; case 'R': turnRight(); break; case 'S': moveStop(); break; case 'I': //FR turnRight(); break; case 'G': //FL turnLeft(); break; case 'J': //BR moveBackRight(); break; case 'H': //BL moveBackLeft(); break; } } } В участок с проверкой по монитору вообще не заходит(( Код (C++): int measureDistance() { long duration; int distance; digitalWrite(trig_pin, LOW); delayMicroseconds(3); // 3 digitalWrite(trig_pin, HIGH); delayMicroseconds(10); // 10 digitalWrite(trig_pin, LOW); duration = pulseIn(echo_pin, HIGH); Serial.print(4); distance = duration / 58; if (distance < DISTANCE_MIN ) {Serial.print (DISTANCE_MIN); return DISTANCE_MIN;} if (distance > DISTANCE_MAX ) {Serial.print (DISTANCE_MAX); return DISTANCE_MAX;} Serial.print (distance);return distance; } boolean isSAFE() { if (1) { distance = measureDistance(); if ( distance < DST_STOP ) //20см { Serial.print (6); return false; } } else { Serial.print (5); return true; } } В чем ошибка.
Я правильно разглядел, что измерение дистанции вызывается только процедуре isSave? А где вызывается прoцедура isSave? Для Си есть разница в написании: isSave; или isSave();?
Я бы в функцию pulseIn() добавил третий параметр timeout. Код (C++): duration = pulseIn(echo_pin, HIGH, 30000);
В Си++ есть разница. Первый - это вызов объекта. Дальше должен идти метод объекта. Си компилятор должен ругаться. Но абдурино - это Си++.