Управление сведодиодом

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

  1. Nibs

    Nibs Нуб

    Всем доброго времени суток!
    Помогите в написании скетча. Имеется датчик движения, ардуино уно. Нашел скетч для зажигания светодиода от значения датчика, немного переделал и собрал, всё работает отлично. Но мне нужно чтобы при обнаружении движения светодиод загорался плавно (до значения к примеру в 255) и горел пока есть движение. И чтобы он так же плавно затухал при прекращении движения.
    Вот что я намудрил, но тут светодиод очень быстро моргает. Есть некоторые условия, датчик настроен так что у него есть минимальное время включения (например он выдает сигнал HIGH минимум 2 секунды) а светодиод при этом не успевает по условиям скетча разгореться до максимального значения, так вот хотелось бы чтобы светодиод не затухал пока не наберет максимального значения даже при прекращении движения. И еще, пока есть движение на датчике чтобы он держал максимальное значение светодиода. В конечном итоге я хочу данный скет залить на Atttiny 2313a
    int pir = 7;
    int led = 9;

    void setup()
    {
    Serial.begin(9600);
    pinMode(pir, INPUT);
    pinMode(led, OUTPUT);
    }

    void loop()
    {
    int pirVal = digitalRead(pir);

    if(pirVal == HIGH);
    {
    for (int up=0; up <= 255; up++)
    analogWrite(led, up);
    Serial.print("Motion detected");
    delay(30);
    }
    if(pirVal == LOW);
    {
    for (int dwn=255; dwn >= 0; dwn--)
    analogWrite(led, dwn);
    Serial.print("Motion detected");
    delay(30);
    }
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (Text):
    #define PIR 7    // пин для ДД
    #define LED 9    // пин для LED
    #define PAUSE 30 // задержка изменения яркости LED
    #define MOTION_DETECTED (digitalRead(PIR))  // макрос для более наглядного кода
    boolean prevMotion = false;


    void setup()
    {
      Serial.begin(9600);
      pinMode(PIR, INPUT);
      pinMode(LED, OUTPUT);
    }


    void loop()
    {
      if(MOTION_DETECTED)    // если обнаружено движение (ДД выдает HIGH)
      {
        if (!prevMotion)      // если до этого LED был выключен, то включаем
        {
          Serial.println("Motion detected");
          prevMotion = true;  // флаг, для следующего цикла о том, что ДД уже был активен
          ledBright();
        }
      }
      else                  // если ДД выдает LOW
      {
        if (prevMotion)      // если до этого LED был включен, то гасим, иначе игнорируем
        {
          Serial.println("Timeout");
          prevMotion = false;
          ledBright();
        }
      }
    }

    void ledBright()
    {
      for (byte count = 0; count < 255; count++) // 255 шагов яркости
      {
        byte value = 255 * (1 - prevMotion) + (2 * prevMotion - 1); // 0...255 при prevMotion:true и 255...0 при prevMotion:false
        //Serial.println(value);
        analogWrite(LED, value);
        delay(PAUSE);
      }
    }