Мотор с ультразвуковым датчиком
Я новичок в программировании, так что терпите меня. Я пишу простой код для управления двигателем таким образом, чтобы двигатель вращался на полной скорости до тех пор, пока датчик не обнаружит объект в пределах 5 дюймов. датчика. Если он увидит что-то на расстоянии 5 дюймов или меньше, я хочу, чтобы двигатель остановился. У меня такой вопрос: при использовании оператора IF обязательно ли наличие ELSE или можно просто выполнить два оператора IF без ELSE?
Вот мой пример:
int motorpin1 = 10 , motorpin2 = 11;
int trig = 12;
int echo = 9;
float distance;
float time;
void setup()
{
pinMode (motorpin1, OUTPUT);
//желтый провод
pinMode (motorpin2, OUTPUT);
//синий провод
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
Serial.begin (9600);
}
void loop()
{
// настраиваем ультразвуковой датчик для управления
//двигатель
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
time = pulseIn(echo, HIGH);
distance = time/148.1;
Serial.println(distance);
if distance <5,digitalWrite (motorpin1, LOW);
digitalWrite (motorpin2, LOW);
if distance >=5, digitalWrite (motorpin1, HIGH);
digitalWrite (motorpin2, LOW);
delay (1000); // ждем 1 секунду
Есть ли лучший способ сделать это с помощью оператора ELSE? Я хочу зафиксировать параметр, в котором код управляет конкретными параметрами >5, а затем <or=5. Кроме того, в следующий раз я сделаю паузу и реверсирую двигатель, если через 1 секунду датчик все еще видит объект <=5.
Определенно, этому моему старому мозгу нужно учиться!
@Pilot Ken, 👍1
Обсуждение1 ответ
Вы можете сделать что-то вроде
if (distance < 5) {
digitalWrite (motorpin1, LOW);
}
else {
digitalWrite (motorpin1, HIGH);
}
Похоже, вы установили motorpin2
только в LOW
и никогда не установили в HIGH
. Если вы не хотите устанавливать значение HIGH
, переместите эту строку в раздел setup()
. Нет необходимости постоянно устанавливать его LOW
.
вы можете использовать тернарный оператор С++... заменить шесть строк одной строкой... digitalWrite (motorpin1, (distance < 5)? LOW: HIGH);
, @jsotola
@jsotola Что ж, если вы хотите пойти по этому пути, тернарный оператор сам по себе не нужен: digitalWrite (motorpin1, !(distance < 5));
или просто digitalWrite (motorpin1, Distance >= 5));
, @timemage
это зависит от того, равен ли «HIGH» «true» и «LOW» равен «false», @jsotola
Вы можете использовать тернарный оператор, и я делаю это сам, но, поскольку вопрос задает новичок, я предпочел читабельность сокращению количества строк., @jkp
@jsotola, что-то рассмотрел и отбросил. Никто в здравом уме не будет проектировать ядро с НИЗКИМ, как правдивое, и наоборот. Во всяком случае, особенно для новых людей, это нормально, как есть., @timemage
- Обратное вращение шагового двигателя
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Двигатель постоянного тока шумит, но не вращается
- Почему сервопривод вращается на 360 градусов?
- Есть ли лучший выбор, кроме использования delay() для 6-часовой задержки?
- Тахометр на базе Леонардо?
- Как повторить код
- Мой моторный щит сломан?
Вы пытались скомпилировать свой код?, @jsotola
начните думать об утверждениях
если
в вашей повседневной жизни... они случаются все время... например,если (красный свет) {остановить машину};
... затем подумайте, будет ли блокelse
.... не забывайте, что вы можете поместить любую команду в блокelse
...else if
полезно, @jsotola