Помогите закончить код.

Тема в разделе "Arduino & Shields", создана пользователем Wiper, 11 янв 2016.

  1. Wiper

    Wiper Нуб

    Всем доброго времени суток! Я не сильно силен в написании кодов и не как не могу закончить. Код работает как нужно за исключением одного нюанса, который надо исправить и я не как не могу понять, как это сделать. Нужно чтобы работало так: есть три светодиода и датчик движения, когда датчик обнаруживает движение, то плавно включает светодиоды один за другим (это работает), если в течение 15 секунд повторяется движение, то светодиоды не выключаются (это тоже работает), если в течение 15 секунд, движения не обнаружено, то все три светодиода плавно гаснут вместе (и это работает). Проблема в следующем: в тот момент, когда светодиоде начинают затухать, датчик не откликается пока они полностью не потухнут, а необходимо если светодиоды начали затухать и в этот момент обнаружено движение, то они обратно, плавно зажглись, не дожидаясь полного выключения.
     
  2. Wiper

    Wiper Нуб

    Код (C++):
    #define LED1 3
    #define LED2 5
    #define LED3 6
    #define timeON 2
    #define timeOFF 30
    #define delayON 15000
    int Sharp=2;
    int i = 0;
    int on=0;
    int off=1;
    unsigned long timeroff;

    void setup() {
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(Sharp, INPUT);

    }

    void loop() {
      int val1=digitalRead(Sharp);
      delay(10);
      int val2=digitalRead(Sharp);

      if (val1==1&&val2==1&&on==0) {
        for (i = 0; i < 256; i++) {
          analogWrite(LED1, i);
          delay(timeON);
          if (i==255) {
            for (i = 0; i < 256; i++) {
              analogWrite(LED2, i);
              delay(timeON);
              if (i==255) {
                for (i = 0; i < 256; i++) {
                  analogWrite(LED3, i);
                  delay(timeON);}
              }
            }
          }
        }
        on=1;off=0;}

    else if (val1==1&&val2==1&&on==1) {
      off=0;timeroff=0;
    }

    else if (val1==0&&val2==0&&timeroff==0) {
      timeroff=millis();
    }

    else if (val1==0&&val2==0&&off==0&&millis()-timeroff>delayON) {
      for (i = 255; i >= 0; i--) {
        analogWrite(LED1, i);
        analogWrite(LED2, i);
        analogWrite(LED3, i);
        delay(timeOFF);
      }
      off=1;on=0;timeroff=0;
    }
    }
     
    Последнее редактирование: 11 янв 2016
  3. Wiper

    Wiper Нуб

    Буду очень признателен за любую помощь!
    Заранее СПАСИБО!
     
  4. Ignis

    Ignis Нуб

    Не успел до конца разобраться в коде, но, с точки зрения логики С, нужно сделать следующее: внутрь цикла, выключающего светодиоды, вставить проверку датчика движения. Если проходит, то break'ом или goto'м выйти и включить. Грубо, но должно сработать. Вечером могу попробовать и код набросать
     
  5. Wiper

    Wiper Нуб

    Спасибо за ответ! С break'ом пытался, но скорее всего я не правильно понимаю выполнение программой порядок условий в коде, поэтому получалось все время не то что нужно! Коды попроще мне дались легче, а вот там где нужно глубже понять происходящее, я сразу путаюсь.
    Вообщем мне еще учиться, учиться, учиться! Если кому-то не трудно поэтапно.
    Всем СПАСИБО за помощь!
     
  6. Wiper

    Wiper Нуб

    Суть мне понятна, но как это правильно написать не совсем!
     
  7. Wiper

    Wiper Нуб

    Всем спасибо код закончен и работает так как нужно!
    Отдельно СПАСИБО Ignis работа продолжилась по его предложению
    и добавив еще немного получилось то, что нужно!
     
  8. Wiper

    Wiper Нуб

    Вот что получилось, может кому-то пригодится!
    Код (C++):
    #define LED1 3
    #define LED2 5
    #define LED3 6
    #define timeON 2
    #define timeOFF 50
    #define delayON 5000
    int Sharp=2;
    int i = 0;
    int on=0;
    int off=1;
    unsigned long timeroff;
    int L = 0;

    void setup() {
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(Sharp, INPUT);

    }

    void loop() {
      int val1=digitalRead(Sharp);
      delay(10);
      int val2=digitalRead(Sharp);

      if (val1==1&&val2==1&&on==0&&L==1) {
        for (i = i; i < 256; i++) {
          analogWrite(LED1, i);
          analogWrite(LED2, i);
          analogWrite(LED3, i);
          delay(timeON);
        }
        on=1;off=0;
        L=0;
      }

      if (val1==1&&val2==1&&on==0&&L==0) {
        for (i = 0; i < 256; i++) {
          analogWrite(LED1, i);
          delay(timeON);
          if (i==255) {
            for (i = 0; i < 256; i++) {
              analogWrite(LED2, i);
              delay(timeON);
              if (i==255) {
                for (i = 0; i < 256; i++) {
                  analogWrite(LED3, i);
                  delay(timeON);}
              }
            }
          }
        }
        on=1;off=0;}

    else if (val1==1&&val2==1&&on==1) {
      off=0;timeroff=0;
    }

    else if (val1==0&&val2==0&&timeroff==0) {
      timeroff=millis();
    }

    else if (val1==0&&val2==0&&off==0&&millis()-timeroff>delayON) {
      for (i = 255; i >= 0; i--) {
        analogWrite(LED1, i);
        analogWrite(LED2, i);
        analogWrite(LED3, i);
        delay(timeOFF);
        if(digitalRead(Sharp) == HIGH) {
          L=1;
          break;
        }
      }
      off=1;on=0;timeroff=0;
    }
    }