Код Arduino дает ошибку при компиляции
Я новичок и пытаюсь написать код для управления сервоприводом с помощью двух ультразвуковых датчиков. Я пытался сделать код, но когда я попытался скомпилировать его с помощью моего приложения для моделирования, он выдает эту ошибку:
sketch.ino: In function 'void value2()':
sketch.ino:123:19: error: expected ')' before '!' token
if((L < R)>=6 & L !> normal){
^
sketch.ino: In function 'void value3()':
sketch.ino:131:19: error: expected ')' before '!' token
if ((R< L)>=6 & R !> normal){
^
Error during build: exit status 1
Как это исправить? Я использую веб-сайт симулятора Wokwi, и вот ссылка на симулятор.
Вот где проблема в моем коде:
void value2() {
/* Я использую L !> normal, чтобы убедиться, что он не запускается, когда L больше 750, и здесь возникает проблема */
if ((L < R) >= 6 & L !> normal) {
servo.write(120);
//идти к
loop();
}
}
void value3() {
/* Я использую R !> normal, чтобы убедиться, что он не запускается, когда R больше 750, здесь также возникает проблема */
if ((R < L) >= 6 & R !> normal) {
servo.write(60);
//идти к
loop();
}
}
А вот мой полный код:
#include <Servo.h>
#include <Stepper.h>
#define STEPS 100 // шаговые шаги
#define speed 30 // скорость шагового двигателя
#define Lechopin 10 // ультразвуковой датчик слева
#define Ltrigpin 11 // ультразвуковой датчик слева
#define Rechopin 12 // ультразвуковой датчик справа
#define Rtrigpin 13 // правый ультразвуковой датчик
long Lduration;
long Ldistance;
long Rduration;
long Rdistance;
int L;
int R;
int dt1 = 100; //задерживать
int dt2 = 1; //задерживать
int dt3 = 2; //задерживать
int dt4 = 10; //задерживать
int serv = 9; // сервопривод
Servo servo;
Stepper stepper(STEPS, 5, 6, 7, 8);
/* Assuming distance of 4 feet measured by sensor is between 100 to 1000, let's set 750 as the normal distance between
sensor and object in which will be anything in 4feet upward far
away from sensor won't be detected by the code. you can edit it with real time measurement, I just assume this */
int normal=750;
int minn=250;
void setup() {
Serial.begin(9600);
stepper.setSpeed(speed);
servo.attach(serv);
pinMode(Lechopin,INPUT);
pinMode(Ltrigpin,OUTPUT);
pinMode(Rechopin,INPUT);
pinMode(Rtrigpin,OUTPUT);
}
void loop() {
get_L_dist();
L = get_L_dist();
get_R_dist();
R = get_R_dist();
normalp();
value1();
value2();
value3();
// спасение;
}
// датчики печати
/*
Serial.print("L is:");
Serial.println(L);
Serial.print("R is:");
Serial.println(R);
*/
/* read left sensor and calculate the distance */
long get_L_dist() {
digitalWrite(Ltrigpin, LOW);
delayMicroseconds(dt3);
digitalWrite(Ltrigpin, HIGH);
delayMicroseconds(dt4);
digitalWrite(Ltrigpin, LOW);
Lduration=pulseIn(Lechopin, HIGH);
Ldistance=Lduration / 58.2;
return Ldistance;
}
/* read right sensor and calculate the distance */
long get_R_dist() {
digitalWrite(Rtrigpin, LOW);
delayMicroseconds(dt3);
digitalWrite(Rtrigpin, HIGH);
delayMicroseconds(dt4);
digitalWrite(Rtrigpin, LOW);
Rduration=pulseIn(Rechopin, HIGH);
Rdistance=Rduration / 58.2;
return Rdistance;
}
//нормальное положение сервопривода
void normalp() {
if (L >= normal & R >= normal) {
servo.write(90);
//идти к
loop();
}
}
void value1() {
if ((L < minn) >= 2 & (R < minn) >= 2) {
int ran = random(2);
if (ran == 0) {
servo.write(30);
//идти к
loop();
}
if (ran == 1) {
servo.write(150);
//идти к
loop();
}
}
}
void value2() {
/* I'm using L !> normal to make sure it doesn't run when L is greater than 750, and this is where the problem comes */
if ((L < R) >= 6 & L !> normal) {
servo.write(120);
//идти к
loop();
}
}
void value3() {
/* I'm using R !> normal to make sure it doesn't run when R is greater than 750, this is also where the problem comes */
if ((R < L) >= 6 & R !> normal) {
servo.write(60);
//идти к
loop();
}
}
@Joseph Afodu, 👍-2
Обсуждение1 ответ
Лучший ответ:
Используйте <=
вместо !>
; последний не является правильным синтаксисом C++.
Кроме того, if (L < R) >= 6
не делает того, что вы могли подумать: (L < R)
оценивается как true
или false
, поэтому все выражение всегда будет оцениваться как false
. Возможно, вы имели в виду if (L - R) >= 6
?
Кроме того, вы используете &
как "и" в операторах if
, которые должны быть &&
.
Большое спасибо @ocrdu, я изменил его, я использую <= вместо !>, и я также изменил ((L < minn)>= 2) на ((minn - L)>=2), и он работает над моим моделирование именно так, как мне нужно. Спасибо вам всем за помощь., @Joseph Afodu
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Ошибка переменной does not name a type!
- Использование YS-IRTM с Arduino Uno
- IRRemote отправлять и получать тем же Arduino
- Объявленная переменная внутри void setup не видится в void loop
- 7-сегментный дисплей с потенциометром
- Акцептант векселей ИКТ
- Как преобразовать значения RGB в интенсивность
Используйте
<=
вместо!>
. Последнее не является правильным синтаксисом C++. Кроме того,if (L < R) >= 6
, вероятно, не делает то, что вы хотите. Возможно, вы имели в видуif (L - R) >= 6
?, @ocrduЭто действительно _cant_ делать то, что они хотят. Потому что
L < R
в C++ будет либоtrue
, либоfalse
, что будет считаться 1 или 0 при оценке против>= 6
. В целом «(L < R) >= 6» всегда «ложно». Они также, вероятно, хотели&&
, а не&
, хотя в данном случае это может не иметь особого значения. Древний C на самом деле не имел&&
и использовал&
таким образом. Все же, вероятно, не очень хорошая идея., @timemageПожалуйста, поместите эти полезные ответы как фактические ответы, а не комментарии к вопросу. Спасибо,, @Nick Gammon
Если вы ответите в комментариях, то этот вопрос появится через год с «нет ответов», потому что вы ответили в комментариях. И это только раздражает всех., @Nick Gammon
@timemage См. выше., @Nick Gammon
@NickGammon, бот отвечает только на вопросы (на которые есть ответ без голосования). Обычно мы не отвечаем на вопросы об ошибках синтаксиса, так что давайте посмотрим, закроют ли этот вопрос., @Juraj
@NickGammon это может быть полезно. Я не уверен, что это ответ. Если бы я так думал, это был бы ответ., @timemage
@NickGammon позвольте мне сказать так. Если вы возьмете то, что я написал, и опубликуете это как «ответ», я проголосую против. Потому что это не ответ на вопрос. Например, это описание кода, который компилируется. Это также не имеет отношения к тому, что они _должны_ делать; он не представляет собой часть решения. Мы надеемся, что это рассеет некоторые представления о том, что, по их мнению, будет делать код. В любом случае, вам, ребята, нужно понять, чего вы на самом деле хотите от людей. Как минимум, было бы полезно, если бы вы не ругали людей за то, чего они не делают. Спасибо., @timemage
@Juraj Сейчас вряд ли закроют. Я не собираюсь винить отвечающего за то, что мод просил его сделать. Особенно теперь, когда это принятый ответ. По крайней мере, он пытается решить проблему компиляции. Я не думаю, что обращаться к ним — это так уж плохо, особенно если есть что-то, связанное с Arduino, либо в вопросе, либо в ответе, и основано на чем-то, что не является просто опечаткой. В любом случае полезно знать, что нужно делать. Или опять же, как минимум, чтобы не получить за это дерьмо., @timemage
@timemage *было бы полезно, если бы вы не ругали людей за то, чего они не делают* - это сайт вопросов и ответов. Люди задают вопросы. Вы должны ответить на них в поле для ответов. Комментарии под вопросами предназначены для уточнения вопроса (например, «какой тип Arduino у вас есть»). Не помещать свой ответ в ящик для ответов — довольно большая проблема. Я думаю, что иногда могу «вызвать это». Лично я считаю, что то, что вы написали, очень хорошо и заслуживает того, чтобы быть в ящике для ответов. Затем люди могут проголосовать за или против. И вы получаете кредит за ответ., @Nick Gammon
Я был бы очень удивлен, если бы Джурай счел то, что я сказал, ответом на вопрос. В любом случае, мне все равно, что вы решите, но вам, и ему, и кому-то еще нужно выяснить, что является ответом, а что нет, а что не по теме. Если каждый хочет определить «ответ» как _что-нибудь_, что является «хорошим» (или «полезным», как я сказал) _независимо_ от того, действительно ли он отвечает на заданный вопрос, то я согласен с этим., @timemage