Проблема с кодированием Arduino

Я управляю водяным насосом, основываясь на показаниях ультразвука. Как только ультразвуковой датчик покажет > 10 см, я хочу, чтобы водяной насос запускался до тех пор, пока датчик не покажет < 5 см. Не могли бы вы помочь мне настроить следующий код в соответствии с моими требованиями.

void loop(){
 digitalWrite(trigPin,LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin,HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin,LOW);
 duration=pulseIn(echoPin,HIGH);
 distance=(duration*0.034/2);
 if(distance>5){
   digitalWrite(motor,HIGH);
   delay(30000);
   digitalWrite(motor,LOW);
 } else {
   digitalWrite(motor,LOW);
 } 
}

, 👍0


1 ответ


Лучший ответ:

2

Итак, вы спрашиваете:

  • Если расстояние больше 10:
    • Включить
  • Если расстояние меньше 5:
    • Отключить

Это несложно написать, поскольку у вас уже есть оператор "if" там, что сравнивает расстояние.

 if(distance>5){
   digitalWrite(motor,HIGH);
   delay(30000);
   digitalWrite(motor,LOW);
 } else {
   digitalWrite(motor,LOW);
 } 

становится:

if (distance > 10) {
    digitalWrite(motor, HIGH);
}

if (distance < 5) {
    digitalWrite(motor, LOW);
}

Видите, какая прямая корреляция 1:1 между английским кодом, который я написал вверху, и кодом под ним? Часто это хороший способ понять код: напишите его на простом английском шаг за шагом, что вы хотите и какие решения вам нужно принять, а затем обычно происходит простое преобразование английского языка в код.

Самая сложная часть обучения программированию — это понимание логики. Сделайте это сначала на английском языке, и написание самого кода станет намного проще.

,

Спасибо. Две точки, используя приведенный выше код, если расстояние < 10, двигатель не будет работать. Я попытался добавить digitalWrite(motor, HIGH); перед оператором if, но я еще не проверял его. Во-вторых, двигатель продолжает работать в повторяющихся циклах, я считаю, что каждый раз циклы кода. это здорово?, @motion channel

Если расстояние < 10, то двигатель не должен работать. Вы не указали, что так и должно быть. Вы хотите, чтобы он был включен для расстояния> 10, а не < 10. Если он включается и выключается, значит, расстояние неоднократно меняется от более 10 до менее 5., @Majenko

С кодом Маженко двигатель не включится, пока расстояние не станет > 10. Затем он **останется** включенным, пока расстояние не упадет до < 5. Это то, что вы хотели., @Duncan C

Вы также можете добавить максимальное значение времени, чтобы в случае отказа ультразвукового датчика при включенной помпе у него был верхний предел продолжительности работы помпы. Это потребует записи значения millis() в тот момент, когда вы включаете насос, и выключения его, если двигатель включен, а текущее значение millis() достаточно далеко в прошлом., @Duncan C

@motionchannel: Для справки, поведение, описанное в вашей прозе и реализованное в коде Маженко, называется _гистерезисным управлением_. В пределах полосы гистерезиса (5 – 10 см) насос должен оставаться в том состоянии, которое было установлено ранее. Гистерезис — очень разумный способ избежать быстрого включения и выключения двигателя. См., например, Википедию: [Гистерезис в технике] (https://en.wikipedia.org/wiki/Hysteresis#In_engineering)., @Edgar Bonet