Почему не работает delayMicroseconds(5000)

Тема в разделе "Arduino & Shields", создана пользователем Diviant, 28 июн 2016.

  1. Diviant

    Diviant Нуб

    Вот код:
    #define echoPin 10
    #define trigPin 11
    #define MOTOR_PIN 9


    void setup()
    {
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(MOTOR_PIN, OUTPUT);
    }

    void loop(){
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    int distance = (pulseIn(echoPin, HIGH))/58;
    if (distance < 20 )
    { analogWrite(MOTOR_PIN, 255);
    delayMicroseconds(5000);} // ЭТА ЗАДЕРЖКА НЕ РАБОТАЕТ СОВСЕМ
    // УБИРАЮ РУКУ ОТ ДАТЧИКА И МОТОР СРАЗУ ОСТАНАВЛИВАЕТСЯ
    else
    analogWrite(MOTOR_PIN,0);

    }

    Как задержать работу моторчика на 5 секунд после того как убрал руку от сенсора?
     
  2. AlexU

    AlexU Гуру

    5000 микросекунд == 5 миллисекунд != 5 секунд
    Код (C++):
    delay(5000); // задержка на 5 секунд
    Согласно представленного исходника логика кажется немного странноватой -- что на выходе хотите получить?
     
  3. Diviant

    Diviant Нуб

    Спасибо! Не подскажете еще алгоритм, как сделать одно считывание сенсора (1000 мс) включение, второе выключение
     
  4. Diviant

    Diviant Нуб

    Принцип прост, я работаю за столом - вентилятор работает, вышел - он остановился.
     
  5. Diviant

    Diviant Нуб

    Вопрос, если я перед патчиком замираю и не двигаюсь, он через 10 секунд останавливается, причем когда выводил показания датчика на монитор, у него между верными показаниями проскакивали показания гораздо большего расстояния. В чем может быть причина?
     
  6. AlexU

    AlexU Гуру

    Совсем ни чего не понял...
    А зачем тогда задержка в 5 сек? Дело в том, что с логикой из первого поста задержка будет колебаться от 0 до 5 сек (т.е. вентилятор может отключиться как сразу, так и, например, через 2 сек, и через 5) -- поэтому и высказал своё мнение о странности логики.
    Догадываюсь, что датчик ультразвуковой. Причина может быть в том, что, когда Вы замираете, датчик ловит не только сигнал отражённый от вас, но ещё паразитные сигналы отражённые от других объектов и при этом плохо срабатывает фильтрация паразитных сигналов. Но это только догадки основанные на теоретических предположениях (на практике с такими датчиками не сталкивался).
     
  7. Diviant

    Diviant Нуб

    Пока я двигаюсь все нормально, как только замираю он в 90% встает.
    Вот и хочу, чтобы от одного считывания на 10 мкс 20 см он включался, а от второго выключался. Т.Е. махнул перед ним- включился, махнул второй выключился. Но не знаю с чего начать. Думаю в переменных счетчик поставить на взмахи с чередованием 0 и 1, а в теле программы управление от этих переменных. Так пойдет?
     
  8. fogary

    fogary Гик

    Не обязательно 0 или 1. Сохраняйте значение уровня ШИМ (Вы же используте analogWrite()), т. е. 0 или 255.
     
  9. AlexU

    AlexU Гуру

    Если надо -- "рукой махнул -- мотор включился, махнул -- выключился" -- то ниже пример кода:
    Код (C++):


    #define echoPin 10
    #define trigPin 11
    #define MOTOR_PIN 9

    #define SENSOR_CHANGE   0x80
    #define SENSOR_DELAY   500  // задаёт задержку между реакциями на состояние датчика в миллисекундах

    unsigned int flag = 0;

    void setup()
    {
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(MOTOR_PIN, OUTPUT);
    }

    void loop(){
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    int distance = (pulseIn(echoPin, HIGH))/58;
    if (distance < 20 ) {
      unsigned long current = millis();
      if ((flag & SENSOR_CHANGE) == 0) {
        if ((current - flag) > SENSOR_DELAY) {
          flag = current;
          flag |= SENSOR_CHANGE;
        }
      } else {
        if ((current - (flag & ~SENSOR_CHANGE)) > SENSOR_DELAY) {
          flag = current;
          flag &= ~SENSOR_CHANGE;
        }
      }
    }
    if (flag & SENSOR_CHANGE) {
      analogWrite(MOTOR_PIN, 255);
    } else {
      analogWrite(MOTOR_PIN, 0);
    }
    }
     
     
  10. Diviant

    Diviant Нуб

    Спасибо огромное!!! Сейчас попробую разобраться для себя как это работает. Но работает просто супер!!! Респект!!!
     
  11. Diviant

    Diviant Нуб

    Еще раз спасибо! Приблизительно через 10-15 срабатываний туда сюда начинает датчик подглючивать, чем дальше тем я так думаю ошибки накапливаются, сам не смог разобраться с Вашим кодом, Я новичок.
    Попробовал написать сам попроще, на моем уровне. только не смейтесь. Но по синтексису выдает ошибки. Можете посмотреть?

    Код (C++):



    #define echoPin 10
    #define trigPin 11
    #define MOTOR_PIN 9
    int IO =0;

    void setup()
    {
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(MOTOR_PIN, OUTPUT);
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
    pinMode(12, OUTPUT);
    }

    void loop(){
      for (int IO=0; IO < 2;;)
    {
      digitalWrite(13, HIGH);  
      digitalWrite(trigPin, LOW);
      delayMicroseconds(10000);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      int distance = (pulseIn(echoPin, HIGH))/58;
          if (distance < 20 )
          {
                 IO=++1;
                        if (IO == 1)
                        {
                        analogWrite(MOTOR_PIN, 255);
                        digitalWrite(12, HIGH);
                        }
                        else
                        {
                        analogWrite(MOTOR_PIN, 0);
                        digitalWrite(12, LOW);
                        }
           }
           else
                 continue;  
    }}
         
         
     
  12. AlexU

    AlexU Гуру

    Из моего примера строку:
    Код (C++):
    unsigned long current = millis();
    замените на:
    Код (C++):
    unsigned int current = millis();
    Что касается Вашего кода:
    1. переменная IO объявляется два раза:
    Код (C++):
    int IO =0;
    Код (C++):
    for (int IO=0; IO < 2;;)
    в теле цикла будет использоваться вторая переменная, первая -- ни где не используется.
    2. переменной IO в теле цикла сразу присваивается значение 2:
    Код (C++):
    IO=++1;
    соответственно выполнится только условие:
    Код (C++):
    else
    {
    analogWrite(MOTOR_PIN, 0);
    digitalWrite(12, LOW);
    }
     
  13. Diviant

    Diviant Нуб

    СПАСИБО ОГРОМНОЕ!!!!!!!