Подсветка коридора проблема со скетчем

Тема в разделе "Arduino & Shields", создана пользователем stalkerdj, 24 сен 2012.

  1. stalkerdj

    stalkerdj Нуб

    Всем привет с толкнулся с проблемой в написании скетча.
    Есть коридор, светодиодная лента, Arduino, 3 Ультразвуковой дальномера (HC-SR04) и 1 Реле 5V 2-Channel Relay Shield.
    вот изоброжение примерной схемы коридора и расположение датчиков
    [​IMG]
    также есть не доделанный скетч
    Код (Text):
    #define ON 0
    #define OFF 1
    int echoPin = 31;
    int initPin = 30;
    int relePin = 22;
    int distance = 0;
    unsigned long pulseTime = 0;
     
    int echoPin2 = 41;
    int initPin2 = 40;
    int relePin2 = 23;
    int distance2 = 0;
    unsigned long pulseTime2 = 0;
     
    int echoPin3 = 51;
    int initPin3 = 50;
    int distance3 = 0;
    unsigned long pulseTime3 = 0;
    const long lightHold = 5000;
     
    void setup()
    {
    pinMode(initPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(relePin, OUTPUT);
    pinMode(initPin2, OUTPUT);
    pinMode(echoPin2, INPUT);
    pinMode(relePin2, OUTPUT);
    pinMode(initPin3, OUTPUT);
    pinMode(echoPin3, INPUT);
    digitalWrite(relePin, OFF);
    digitalWrite(relePin2, OFF);
    Serial.begin(9600);
    }
     
    void loop()
    {
    digitalWrite(initPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(initPin, LOW);
    pulseTime = pulseIn(echoPin, HIGH);
    distance = pulseTime/58;
     
    digitalWrite(initPin2, HIGH);
    delayMicroseconds(10);
    digitalWrite(initPin2, LOW);
    pulseTime2 = pulseIn(echoPin2, HIGH);
    distance2 = pulseTime2/58;
     
    Serial.print("SRF05_1: ");
    Serial.print(distance, DEC);
    Serial.print("cm  ");
    Serial.print("SRF05_2: ");
    Serial.print(distance2, DEC);
    Serial.println("cm  ");
     
    if (distance <= 10)
    {
      digitalWrite(relePin, LOW);
      delay(lightHold);
    }
      else
    {
      digitalWrite(relePin, HIGH);
    }
    if (distance2 <= 20)
      {
        digitalWrite(relePin2, LOW);
        delay(lightHold);
      }
      else
      {
        digitalWrite(relePin2, HIGH);
      }
    if (distance3 <= 10)
    {
      digitalWrite(relePin, LOW);
      digitalWrite(relePin2, LOW);
      delay(lightHold);
    }
      else
    {
      digitalWrite(relePin, HIGH);
      digitalWrite(relePin2, HIGH);
    }
    }
    проблема в этом скетче при проходе 1 датчика лента (relePin) загораеться а когда проходишь 2 датчик (relePin2) не загораеться до тех пор пока не перестанет гореть 1 лента! как это исправить?
    Разъясняю если кто то не понял действия должны быть такими:
    1) если заходишь в коридор и задеваешь сенсор 1 то включается первая половина коридора подсветки и при прохождение сенсора 2 вдобавок к 1 половине коридора включается 2 половина коридора
    2) если заходишь в коридор и задеваешь сенсор 2 то включается вторая половина коридора подсветки
    3) если выходишь из задней комнаты и задеваешь сенсор 3 то включается весь коридор и в этом случае 1 и 2 сенсор не должны срабатывать!
    4) при прохождение каждого датчика отправляется команда на загорание ленты на 5 секунд но если кто то проходит этот датчик повторно то должно добавляться по 5 секунд!
     
  2. Unixon

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

    (3) условия для сенсоров 1 и 2 должны проверяться только если не сработал сенсор 3
    (4) измеряете время между срабатываниями сенсоров, если меньше 10 сек, увеличиваете lightHold, если сенсор не срабатывал дольше какого то времени, сбрасываете lightHold на начальное значение.

    Ну и по оформлению кода:
    1. для пинов int -> const int чтобы не кушать память за зря
    2. rele -> relay
    3. оформляйте константы и переменные в определенном стиле и всегда его придерживайтесь, например, так:

    CONSTANT
    GlobalVariable
    local_variable
    functionName()

    чтобы сразу при взгляде на идентификатор было понятно что это такое.
     
  3. stalkerdj

    stalkerdj Нуб

    Можешь помощь дописать скетч?
     
  4. Unixon

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

    Теоретически - да, практически - если вечером свободное время найдется. :)
     
  5. stalkerdj

    stalkerdj Нуб

    ок спасибо буду ждать!
     
  6. Unixon

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

    Код (Text):

    const int SENSOR_COUNT = 3;
    // sensor control pins
    const int PIN_RESET[SENSOR_COUNT] = {30, 40, 50};
    // sensor data pins
    const int PIN_SENSE[SENSOR_COUNT] = {31, 41, 51};
    //
    const int SENSOR_THRESHOLD[SENSOR_COUNT] = {10, 20, 10};
    // relay control pins
    const int PIN_RELAY_1 = 22;
    const int PIN_RELAY_2 = 23;

    const long DEFAULT_ON_PERIOD = 5000;
    const float SENSOR_SCALE = 58.0;

    unsigned long sense_time[SENSOR_COUNT];
    unsigned long relay_on_period = DEFAULT_ON_PERIOD;

    int readDistance(const int sensor)
    {
     digitalWrite(PIN_RESET[sensor], HIGH);
     delayMicroseconds(10);
     digitalWrite(PIN_RESET[sensor], LOW);
     unsigned long value = pulseIn(PIN_SENSE[sensor], HIGH);
     int result = (int)floor(value/SENSOR_SCALE);
     return result;
    }
     
    void setup()
    {
     for (int i = 0; i < SENSOR_COUNT; i++)
     {
      pinMode(PIN_RESET[i], OUTPUT);
      pinMode(PIN_SENSE[i], INPUT);
      sense_time[i] = millis();
     }
     pinMode(PIN_RELAY_1, OUTPUT);
     pinMode(PIN_RELAY_2, OUTPUT);
     digitalWrite(PIN_RELAY_1, LOW);
     digitalWrite(PIN_RELAY_2, LOW);
     Serial.begin(9600);
    }
     
    void loop()
    {
     int distance[SENSOR_COUNT];
     boolean flag_on[SENSOR_COUNT];
     boolean flag_off[SENSOR_COUNT];
     unsigned long time = millis();
     for (int i = 0; i < SENSOR_COUNT; i++)
     {
      distance[i] = readDistance(i);
      Serial.print("SRF05_ "); Serial.print(i+1); Serial.print(": ");
      Serial.print(distance[0], DEC);
      Serial.print("cm  ");
      flag_on[i] = distance[i]<SENSOR_THRESHOLD[i];
      unsigned long idle_period = time-sense_time[i];
      if (flag_on[i])
      {
       if ((idle_period>DEFAULT_ON_PERIOD) && (idle_period<2*DEFAULT_ON_PERIOD))
       {
        relay_on_period += DEFAULT_ON_PERIOD;
       }
       sense_time[i] = time;
       flag_off[i] = false;
      }
      else
      {
       if (idle_period>=2*DEFAULT_ON_PERIOD)
       {
        relay_on_period = DEFAULT_ON_PERIOD;
       }
       flag_off[i] = (idle_period>relay_on_period);
      }
     }
     //
     if (flag_on[2])
     {
      digitalWrite(PIN_RELAY_1, LOW);
      digitalWrite(PIN_RELAY_2, LOW);
     }
     else
     {
      if (flag_on[0])
      {
       digitalWrite(PIN_RELAY_1, LOW);
      }
      else if (flag_off[0] && flag_off[2])
      {
       digitalWrite(PIN_RELAY_1, HIGH);
      }
      if (flag_on[1])
      {
       digitalWrite(PIN_RELAY_2, LOW);
      }
      else if (flag_off[1] && flag_off[2])
      {
       digitalWrite(PIN_RELAY_2, HIGH);
      }
     }
     // pause between sensor polls
     delay(100);
    }
     
    Вот примерно так получается... в работе не проверял.
     
  7. stalkerdj

    stalkerdj Нуб

    Большое спасибо завтра днем проверю и отпишусь!!!!
     
  8. stalkerdj

    stalkerdj Нуб

    Все отлично работает! огромное спасибо за помощь!
    как сделаю коридор сниму видео с примером работы!