РЕШЕНО Автоматика для самодельного шлагбаума

Тема в разделе "Arduino & Shields", создана пользователем Reactor3, 2 сен 2021.

  1. Reactor3

    Reactor3 Нуб

    Здравствуйте. Сразу оговорюсь что в написании кода я НУБ. Имеется HC-SR04, подключенный к ардуинке, работает и измеряет расстояние в сантиметрах, нужен он для того что бы:
    1) При случайном открытии шлагбаума (при условии что в поле видимости датчика ничего нет) через 2-3 минуты сам опустился,
    2) При поднятом шлагбауме, через минуту после того как проедет машина (при условии что в поле видимости датчика больше ничего нет) срабатывала функция закрытия.
    Но столкнулся с такой трудностью, когда в поле зрения датчика ничего нет, зацикливается закрытие и открыть уже не получается.

    Код (C++):
    int trigPin = 9; // назначаем имя для Pin8
    int echoPin = 8; // назначаем имя для Pin9
    int Door = 0; //переменная обнаружения проезда автомобиля
    int duration, cm; // назначаем переменную "cm" и "duration" для показаний датчика
    void setup() {
      Serial.begin (9600); // подключаем монитор порта
      pinMode(trigPin, OUTPUT); // назначаем trigPin (Pin8), как выход
      pinMode(echoPin, INPUT); // назначаем echoPin (Pin9), как вход
    }
    void loop() {
     digitalWrite(trigPin, LOW); // изначально датчик не посылает сигнал
      delayMicroseconds(2); // ставим задержку в 2 ммикросекунд
      digitalWrite(trigPin, HIGH); // посылаем сигнал
      delayMicroseconds(10); // ставим задержку в 10 микросекунд
      digitalWrite(trigPin, LOW); // выключаем сигнал
      duration = pulseIn(echoPin, HIGH); // включаем прием сигнала
      cm = duration / 58; // вычисляем расстояние в сантиметрах
      Serial.print(cm); // выводим расстояние в сантиметрах
      Serial.println(" cm");
      Serial.println(Door);

      delay(500);

    if (Door == 0 && cm > 100) { //Если автомобиль ранее не проезжал, а датчик зафиксировал присутствие
      Door = 1;} //устанавливаем пометку что зафиксирован проезд

    if (Door == 1 && cm >200) { //Если ранее был зафиксирован проезд и в данный момент в поле зрения датчика нет машины
      delay(1000);
    Serial.println("закрывается");
    //Опускаем шлагбаум
    Door = 0;} //Сбрасываем метку о проезде до следующего обнаружения автомобиля

    }
    На сколько я понимаю, косяк мой кроется в переменной "Door", я уже все перепробовал, но победить не могу.
     
    Последнее редактирование модератором: 2 сен 2021
  2. b707

    b707 Гуру

    косяк у вас в том, что вы не изучили синтаксиса языка, на котором пишете
    Разницу между операторами Door = 1 и Door == 1 понимаете?
     
  3. Reactor3

    Reactor3 Нуб

    Если честно не совсем. Попробовал поставить два знака равенства, перестал закрывать совсем.
     
  4. b707

    b707 Гуру

    о как все запущено-то... я думал просто опечатка, а вы вообще не бум-бум?
    Может книжку почитать?

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

    Reactor3 Нуб

    Спасибо за помощь!
     
  6. b707

    b707 Гуру

    ну вот я так и знал
    Удачи
     
  7. b707

    b707 Гуру

    да, кстати, условия по расстоянию - тоже вызывают вопросы
    Почему ситуация "duration/58 < 0" - это "нет машины", а "duration/58 > 100" - это "кто-то проехал" ? Не перепутали?
    Да и как вообще расстояние может быть меньше нуля?

    у меня вообще такое впечатление, что вы в этом коде не понимаете ни буквы... списали где-то?
    Так самоделки не делают. Сначала книжки почитайте, разберитесь, диодом помигайте, сделайте пару проектов попроще, а потом уж за реальные вещи принимайтесь
     
    Последнее редактирование: 2 сен 2021
  8. Reactor3

    Reactor3 Нуб

    Не знаю почему, но из найденого мной примера по использованию датчика он показывает -164 если перед ним ничего нет, а 100 потому что шлагбаум стоит не у самой дороги.
     
  9. b707

    b707 Гуру

    это бредятина... то есть откровенно ошибочный результат.
    Сделайте простейший тест. Если поставить датчик перед стенкой на расстоянии 30см - он должен показать примерно это значение. Если не так - значит вы что-то неверно делаете
     
  10. Reactor3

    Reactor3 Нуб

    Расстояние померил, до объекта указывает почти точно, но пустоту уходит за 0
     
  11. b707

    b707 Гуру

    переменную duration опишите как long
     
  12. Airbus

    Airbus Радиохулиган Модератор

    Скетч поправил проверяйте
     
  13. b707

    b707 Гуру

     
  14. Reactor3

    Reactor3 Нуб

    Благодарю. Только что все переделал под чистую и вроде бы все работает как надо, но вот закрадываются подозрения что для выполнения задачи под номером 1 в начале темы (закрытие шлагбаума через определенное время при условии что никто не проезжал и датчик ничего не видит) потребуется многозадачность от ардуины
    Код (C++):
    #include <NewPing.h>
    #define TRIGGER_PIN  9  // Arduino pin tied to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN     8  // Arduino pin tied to echo pin on the ultrasonic sensor.
    #define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

    int Door = 0;

    void setup() {
      Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
    }

    void loop() {
      delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
      Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
      Serial.println("cm");

      if (Door == 0 && sonar.ping_cm() > 100) { //Если автомобиль ранее не проезжал, а датчик зафиксировал присутствие
      Door = 1;} //устанавливаем пометку что зафиксирован проезд
    else{}

    if (Door == 1 && sonar.ping_cm() < 10) { //Если ранее был зафиксирован проезд и в данный момент в поле зрения датчика нет машины
      delay(1000);
    Serial.println("закрывается");
    //Опускаем шлагбаум
    Door = 0;} //Сбрасываем метку о проезде до следующего обнаружения автомобиля
    else{}
    }
    ...
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Зачем? Там и int нормально работает. А вот отрицательных значений не видел ни разу. Чтож за день сегодня такой? Полнолуние чтоли?
     
  16. Reactor3

    Reactor3 Нуб

    Во втором варианте работает от 0
     
  17. b707

    b707 Гуру

    ардуина не умеет "многозадачность" Да и не нужна она тут от слова СОВСЕМ.
    Осваивайте использование миллис
     
  18. Reactor3

    Reactor3 Нуб

    Про миллис я уже прочитал у AlexGyver, вникаю по тихоньку...
     
  19. SergeiL

    SergeiL Оракул Модератор

    А как же FreeRTOS для Ардуино? ;)
    Другое дело, что здесь это не нужно :)
     
  20. Reactor3

    Reactor3 Нуб

    Код (C++):
    #include <NewPing.h>
    #define TRIGGER_PIN  9  // Arduino pin tied to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN     8  // Arduino pin tied to echo pin on the ultrasonic sensor.
    #define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

    int Door = 0; //переменная обнаружения проезда автомобиля
    int OpenDoor = 0; //таймер открытого шлагбаума
    int Close = 0; //переменная состояния шлагбаума 0-открыт, 1-закрыт

    void setup() {
      Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
    }

    void loop() {
      delay(1000);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
      Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
      Serial.println("cm");
      Serial.println(OpenDoor);

    OpenDoor = OpenDoor + 1;

      if (Door == 0 && Close == 0 && sonar.ping_cm() > 100) { //Если автомобиль ранее не проезжал, а датчик зафиксировал присутствие
      Door = 1;} //устанавливаем пометку что зафиксирован проезд
    else{}

    if (Door == 1 && Close == 0 && sonar.ping_cm() < 10) { //Если ранее был зафиксирован проезд и в данный момент в поле зрения датчика нет машины
      delay(1000);
    Serial.println("закрывается");
    //Опускаем шлагбаум
    Close = 1;
    Door = 0;} //Сбрасываем метку о проезде до следующего обнаружения автомобиля
    else{}

    if(OpenDoor > 120 && Close == 0 && Door == 0 && sonar.ping_cm() < 10){ //по достижению таймера установленного порога времени, отсутствию метки о проезде автомобиля, отсутствия автомобиля в поле зрения датчика
    Serial.println("закрывается");
    Close = 1;
    //Опускаем шлагбаум
    }
    }
    Все, разобрался