Arduino - запуск условия if в течение определенного времени - PullRequest
0 голосов
/ 22 марта 2020

В настоящее время работаю над проектом, в котором мне нужно включить двигатель всего на 1 секунду, если мой датчик дождя обнаруживает дождь. если не будет дождя, я снова поверну назад на 1 секунду. датчик и устройство, которое я использую Arduino MEGA Rain Sensor L298N Драйвер двигателя

, но проблема в том, что я не могу выполнить условие в течение 1 секунды.

Вот мой текущий эскиз Arduino

const int IN1 = 7;
const int IN2 = 6;
const int ENA = 9;
const int capteur_A = A0;
int val_analogique;


void setup() {
  Serial.begin(9600);
  pinMode(capteur_A, INPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (ENA, OUTPUT);

}

void forward(){
  analogWrite(ENA, 60);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  }


void loop() {

val_analogique=analogRead(capteur_A); 
Serial.println(val_analogique);

 if(val_analogique<=300){
  forward();
  Serial.println("Going Forward");
 }

 else{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
 }

}

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Чтобы двигатель вращался в течение 1 секунды, нужно просто подождать, а затем остановить его. Вы можете использовать функцию delay () для ожидания определенного c количества миллисекунд. Функция пересылки будет выглядеть следующим образом:

void forward() {
    analogWrite(ENA, 60);  // Set power and direction for the motor
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);

    delay(1000);   // Wait for 1000 milliseconds

    digitalWrite(ENA, 0);  // Stop the motor
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
}

И для другого направления она будет точно такой же, только если поменять местами два направления:

void backward() {
    analogWrite(ENA, 60);  // Set power and direction for the motor
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);

    delay(1000);   // Wait for 1000 milliseconds

    digitalWrite(ENA, 0);  // Stop the motor
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
}

О, и, кстати, также было бы неплохо называть порты OUT, а не IN, поскольку они являются выходами, а не входами:)

0 голосов
/ 23 марта 2020

Вы должны реализовать простой псевдокод конечного автомата в качестве стартера:

    long timer = 0;
    bool conditionRain = false;
    bool conditionNoRain = true;

    setup() {}

    loop() {
     ...
         if(val_analogique<=300 && conditionRain == false) { // Condition rain detected
         timer = millis();  // we start the timer
         conditionRain = true;  // set the state
         conditionNoRain = false;   // set the state
    }

    if (conditionRain == true && millis()-timer < 1000) { // Here is the timer check
        ... do motor for rain ...
    }

    // Assumption Since the motor should run for one second when the rain stops
    if(val_analogique>=850 && conditionNoRain == false){ // Condition rain detected
        timer = millis();
        conditionRain = false;  // set the state
        conditionNoRain = true; // set the state
    }

    if (conditionNoRain == true && millis()-timer<1000){ // Here is the timer check
        ... do motor for no rain ...
    }

Простое переключение между состояниями с помощью функции таймера - больше ничего нет, потому что мы всегда проверяем состояния, если они не выполняются, ничего должно произойти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...