Hc sr04 arduino

Тема в разделе "Arduino & Shields", создана пользователем abubakar, 27 июн 2020.

  1. abubakar

    abubakar Нерд

    Здравствуйте!
    Этот код выполняет такую задачу:
    Мотор вкл когда расстояние меньше указанного. НО
    Имеется такая проблема:
    когда расстояние меньше чем здесь
    мотор не должен работать. Но он продолжает работать. То есть проблема такая:
    Если расстояние больше чем 170 он не должен ничего делать и не делает. Макс пороговое значение в норме, но если расстояние меньше чем 170 и до 1см мотор крутится.


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

    Код (C++):


    #define trigPin 8
    #define echoPin 7
    #define motor 5
    void setup() {
          /*analogWrite(motor, 250);
        delay(400);
          analogWrite(motor, 0);*/

      Serial.begin (9600);
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      pinMode(motor, OUTPUT);
    }
    void loop() {
      long duration, distance;
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = (duration / 2) / 29.1;
      /*if (distance <= 170 && distance > 30) {
        digitalWrite(motor, HIGH);
        delay(50);
          analogWrite(motor, LOW);
           delay(50);
           digitalWrite(motor, HIGH);
      }*/


      if (distance < 170) {
        analogWrite(motor, 250);
        delay(150);
          analogWrite(motor, 0);
           delay(100);
         analogWrite(motor, 250);
      }
        if (distance < 120) {
        analogWrite(motor, 180);
        delay(150);
          analogWrite(motor, 0);
           delay(50);
         analogWrite(motor, 180);
      }
       if (distance <= 50 && distance > 30) {
        analogWrite(motor, 250);
        delay(300);
          analogWrite(motor, 0);
           delay(50);
         analogWrite(motor, 250);
      }
     

     //
      else if (distance < 30) {
        digitalWrite(motor, LOW);
      }
        Serial.print("Расстояние до объекта: ");
      Serial.print(distance);
      Serial.println(" см.");
      delay(100);
    }
     
     
  2. Daniil

    Daniil Гуру

    Разберитесь с операторами ветвления.
    Или так и должно быть, что при расстоянии 45 будут выполнятся все операторы под всеми ифами?
    Ведь, если расстояние 25, то опять же выполняются все ифы, только у последнего ветвь else пойдет.
     
    issaom и NikitOS нравится это.
  3. abubakar

    abubakar Нерд

    а как надо исправить это?
     
  4. Daniil

    Daniil Гуру

    вы разобрались с операторами ветвления?
     
    NikitOS и issaom нравится это.
  5. abubakar

    abubakar Нерд

    нет
     
  6. Daniil

    Daniil Гуру

    в этом пункте ошибка.
    Разберётесь и сможете исправить код.