Автоматическое включение света

Тема в разделе "Arduino & Shields", создана пользователем Евгений_KRD, 14 ноя 2015.

  1. я немного подправил код со всем разобрался добавил вывод строками информации, Не разобрался еще только вот с этой частью for (int i=0; i<100; i++) не пойму как это работает
    Код (C++):
    #include <Ultrasonic.h>
    #define distance 75  // порог срабатывания для УЗ-датчиков
    Ultrasonic ultrasonic1(8,9);
    Ultrasonic ultrasonic2(10,11);
    float distanceUS1; // расстояние US1
    float distanceUS2; // расстояние US2
    int peopleCounter=0;

    void setup()
    {
      Serial.begin(9600);
    }

    void loop()
    {
      if (ultrasonic1.Ranging(CM) < distance)
      {
        for (int i=0; i<100; i++)    // Ждем прохождения через второй датчик
        {
         if (ultrasonic2.Ranging(CM) < distance)
          {
           // Включаем свет
           peopleCounter++;
           break;
          }
         delay (10);    // Подобрать скорость прохождения между датчиками
      }
    }

    if (ultrasonic2.Ranging(CM) < distance)
    {
      for (int i=0; i<100; i++)    // Ждем прохождения через второй датчик
      {
       if (ultrasonic1.Ranging(CM) < distance)
         {
         peopleCounter--;
     
    //    if (PIR active)   // Читаем покозания pir-датчика. Ситуация когда счетчик обнулился, но в комнате кто то ходит
    //         {
    //         people = 1;  // Минимум один человк
    //         }
         if (!peopleCounter)
           {
           // Выключаем свет
           break;
           }
           delay (10);        // Подобрать скорость прохождения между датчиками
         }
      }
    }
      Serial.print("\npeopleCounter: ");
      Serial.print(peopleCounter);
    }
     
     
  2. Karabas

    Karabas Гик

    Лутчше вот так
    Код (C++):
      Serial.print("peopleCounter: ");
      Serial.println(peopleCounter);
    Это просто цикл на сто итераций, i присваяется значение 0 и увеличивается на единицу за каждый проход,и так пока i меньше 100. Собственно в данном случае программа сто раз опрашивает второй сенсор, и если никто не прошел, счетчик не меняется и свет не зажется, если второй датчик сработал, через условие if и команду break цикл прервется.
     
  3. upload_2015-11-22_12-3-59.png
    Счетчик фигарит непонятные значения, не подскажите ли в чем дело может быть?
     
  4. Karabas

    Karabas Гик

    Ну так это самая интересная часть в программировании- дебагинг :)

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

    Значит нужно изменить условия IF чтоб он определял именно движение, важно чтоб расстояние между датчиками было такое, чтоб при проождении до второго проходило какое то время, скажем 20-30 мсек (чтоб четко ловить затемнение одного и только затем второго).
    Код (C++):
    void loop()
    {
      if (ultrasonic1.Ranging(CM) < distance &&  ultrasonic2.Ranging(CM) > distance)      // Проверяем что сработал первый, но не второй, на случай если что то крупное просто стоит перед обоими сенсорами
      {
        for (int i=0; i<100; i++)    // Ждем прохождения через второй датчик
        {
         if (ultrasonic2.Ranging(CM) < distance)
          {
           // Включаем свет
           peopleCounter++;
           break;
          }
         delay (10);    // Подобрать скорость прохождения между датчиками
      }
    }

    if (ultrasonic2.Ranging(CM) < distance && ultrasonic1.Ranging(CM) > distance)
    {
      for (int i=0; i<100; i++)    // Ждем прохождения через второй датчик
      {
       if (ultrasonic1.Ranging(CM) < distance)
         {
         peopleCounter--;

    //    if (PIR active)   // Читаем покозания pir-датчика. Ситуация когда счетчик обнулился, но в комнате кто то ходит
    //         {
    //         people = 1;  // Минимум один человк
    //         }
         if (!peopleCounter)
           {
           // Выключаем свет
           break;
           }
           delay (10);        // Подобрать скорость прохождения между датчиками
         }
      }
    }
      Serial.print("\npeopleCounter: ");
      Serial.print(peopleCounter);
    }
     
     
    Tomasina нравится это.