Помогите подключить фото сенсор

Тема в разделе "Arduino & Shields", создана пользователем nikiv3, 4 сен 2015.

  1. nikiv3

    nikiv3 Нуб

    есть скетч для дальномера -нужно включать только в темноте -на датчике выход-0 или 1 как вставить в скетч помогите пожалуйста Написал скетч -но реле включается на пол секунды и все! Что не так? btnPin-вход датчика света

    const int Trig = 8;
    const int Echo = 9;
    const int Relay = 11;
    const int btnPin = 12;

    void setup()
    {
    pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
    pinMode(Relay, OUTPUT);
    pinMode(btnPin, INPUT);
    Serial.begin(9600);
    }

    unsigned int time_us=0;

    unsigned int distance_sm=0;

    void loop()
    { if (btnPin,HIGH)
    delay(100);
    else
    digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
    delayMicroseconds(10); // Удерживаем 10 микросекунд
    digitalWrite(Trig, LOW); // Затем убираем
    time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
    distance_sm=time_us/58; // Пересчитываем в сантиметры
    Serial.println(distance_sm); // Выводим на порт

    if (distance_sm<50) // Если расстояние менее 50 сантиметром
    {
    digitalWrite(Relay, 1); // включаем
    delay(7000);}
    else
    {
    digitalWrite(Relay, 0); // иначе выключаем
    }
    delay(100);
    }
     
    Последнее редактирование: 5 сен 2015
  2. Unixon

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

    Код (Text):

    const int Trig = 8;
    const int Echo = 9;
    const int Relay = 11;
    const int btnPin = 12;

    void setup()
    {
      pinMode(Trig, OUTPUT);
      pinMode(Echo, INPUT);
      pinMode(Relay, OUTPUT);
      pinMode(btnPin, INPUT);
      Serial.begin(9600);
    }

    unsigned int time_us=0;
    unsigned int distance_sm=0;

    void loop()
    {
      if (!digitalRead(btnPin))
      {
       digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
       delayMicroseconds(10); // Удерживаем 10 микросекунд
       digitalWrite(Trig, LOW); // Затем убираем
       time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
       distance_sm=(unsigned int)floor(0.5+((float)time_us/(float)58.0)); // Пересчитываем в сантиметры
       Serial.println(distance_sm); // Выводим на порт
       if (distance_sm<50) // Если расстояние менее 50 сантиметром
       {
        digitalWrite(Relay, 1); // включаем
        delay(7000);
       }
       else
       {
        digitalWrite(Relay, 0); // иначе выключаем
       }
      }
      delay(100);
    }
     
     
  3. nikiv3

    nikiv3 Нуб

    Спасибо большое! Но теперь включается когда светло-что то не так!
     
  4. Unixon

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

    А что у вас отвечает за измерение освещенности?
     
  5. nikiv3

    nikiv3 Нуб

    Шилд с lmкой когда темно на выходе 1 и еще реле работает наоборот всегда включено а кода подносишь руку -выключается -но работает правильно!
     
  6. Unixon

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

    Он на btnPin заведен? Тогда if (digitalRead(btnPin)).
     
  7. nikiv3

    nikiv3 Нуб

    С реле разобрался-оно по минусу срабатывает!
     
  8. Unixon

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

    Вообще код должен выглядеть как-то так:
    Код (Text):

    #define PIN_SENSOR_DISTANCE_TRIGGER 8
    #define PIN_SENSOR_DISTANCE_OUTPUT  9
    #define PIN_SENSOR_LIGHT_OUTPUT     12
    #define PIN_RELAY                   11

    #define LIGHT_ON HIGH
    #define LIGHT_OFF LOW
    #define RELAY_ON HIGH
    #define RELAY_OFF LOW

    #define DELAY_DISTANCE_SENSE_US  10
    #define FACTOR_DISTANCE_US_TO_SM 58.0
    #define THRESHOLD_DISTANCE_SM    50
    #define DELAY_RELAY_ON_MS        7000
    #define DELAY_MAIN_LOOP_MS       100

    #define SERIAL0_BAUDRATE 9600

    void setup()
    {
      pinMode(PIN_SENSOR_DISTANCE_TRIGGER, OUTPUT);
      pinMode(PIN_SENSOR_DISTANCE_OUTPUT, INPUT);
      pinMode(PIN_SENSOR_LIGHT_OUTPUT, INPUT);
      pinMode(PIN_RELAY, OUTPUT);
      Serial.begin(SERIAL0_BAUDRATE);
    }

    unsigned int time_us=0;
    unsigned int distance_sm=0;

    void loop()
    {
      if (LIGHT_ON==digitalRead(PIN_SENSOR_LIGHT_OUTPUT))
      {
       digitalWrite(PIN_SENSOR_DISTANCE_TRIGGER, HIGH); // Подаем сигнал на выход микроконтроллера
       delayMicroseconds(DELAY_DISTANCE_SENSE_US); // Удерживаем 10 микросекунд
       digitalWrite(PIN_SENSOR_DISTANCE_TRIGGER, LOW); // Затем убираем
       time_us=pulseIn(PIN_SENSOR_DISTANCE_OUTPUT, HIGH); // Замеряем длину импульса
       distance_sm=(unsigned int)floor(0.5+((float)time_us/FACTOR_DISTANCE_US_TO_SM)); // Пересчитываем в сантиметры
       Serial.println(distance_sm); // Выводим на порт
       if (distance_sm<THRESHOLD_DISTANCE_SM) // Если расстояние менее 50 сантиметром
       {
        digitalWrite(PIN_RELAY, RELAY_ON); // включаем
        delay(DELAY_RELAY_ON_MS);
       }
       else
       {
        digitalWrite(PIN_RELAY, RELAY_OFF); // иначе выключаем
       }
      }
      delay(DELAY_MAIN_LOOP_MS);
    }
     
     
  9. nikiv3

    nikiv3 Нуб

    Спасибо! работает по старому коду с небольшой ошибкой- если реле включено и в это время стало светло,
    т.е появился высокий уровень на выходе ф.сенсора то реле не выключается пока не затемнишь сенсор.
    Попробую ваш новый код -отптшусь.