Таймер полива с детектированием дня и ночи.

Тема в разделе "Arduino & Shields", создана пользователем zsm, 6 июл 2013.

  1. zsm

    zsm Гик

    Задача: сделать таймер полива без привязки к реальному времени определяющий время суток.
    Подошла бы полная копия такого устройства. Интервалы времени нужны меньше от 10сек. до часа примерно.

    В зависимости от времени день или ночь – его определяет фото датчик, время работы насоса и время паузы между работой насоса регулируется отдельно 4-мя разными ручками, 2-мя справа (дневной режим) и 2-мя слева (ночной режим).

    Казалось бы простейший проект ,но не пойму с чего начать. Конечно же не прошу написать скетч за меня)
    Просто хотелось бы понять как строить структуру скетча и каким образом считать время.Как понимаю обычный delay не подойдет..

    Очень желательно чтобы в фоне могли выполняться другие действия.
    Всем заранее спасибо)
     
  2. Mitrandir

    Mitrandir Гуру

  3. zsm

    zsm Гик

  4. zsm

    zsm Гик

    Подскажите пожалуйста как такой скетч изменить, чтобы можно было отдельно задать время свечения и отдельно время паузы.
    Код (C):
    const int ledPin =  13;   // номер выхода, подключенного к светодиоду
    // Variables will change:
    int ledState = LOW;          // этой переменной устанавливаем состояние светодиода
    long previousMillis = 0;        // храним время последнего переключения светодиода
     
    long interval = 1000;          // интервал между включение/выключением светодиода (1 секунда)
     
    void setup() {
      // задаем режим выхода для порта, подключенного к светодиоду
      pinMode(ledPin, OUTPUT);   
    }
     
    void loop()
    {
      // здесь будет код, который будет работать постоянно
      // и который не должен останавливаться на время между переключениями свето
      unsigned long currentMillis = millis();
     
      //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > interval) {
        // сохраняем время последнего переключения
        previousMillis = currentMillis;
     
        // если светодиод не горит, то зажигаем, и наоборот
        if (ledState == LOW)
          ledState = HIGH;
        else
          ledState = LOW;
     
        // устанавливаем состояния выхода, чтобы включить или выключить светодиод
        digitalWrite(ledPin, ledState);
      }
     
  5. Mitrandir

    Mitrandir Гуру

    Код (C):

    const int ledPin =  13;   // номер выхода, подключенного к светодиоду
    // Variables will change:
    int ledState = LOW;       // этой переменной устанавливаем состояние светодиода
    long previousMillis = 0;        // храним время последнего переключения светодиода
    long pauseTime = 10; // Время паузы в секундах
    long lightTime = 100; // Время свечения в секундах
     
    long interval = 1000;         // интервал между включение/выключением светодиода (1 секунда)
     
    void setup() {
      // задаем режим выхода для порта, подключенного к светодиоду
      pinMode(ledPin, OUTPUT);  
    }
     
    void loop()
    {
      // здесь будет код, который будет работать постоянно
      // и который не должен останавливаться на время между переключениями свето
      unsigned long currentMillis = millis();
     
      //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > pauseTime * 1000 && ledState == LOW)
      {
            // сохраняем время последнего переключения
            previousMillis = currentMillis;  
            ledState = HIGH;
            // устанавливаем состояния выхода, чтобы включить или выключить светодиод
            digitalWrite(ledPin, ledState);
      }

      //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > lightTime * 1000  && ledState == HIGH)
      {
            // сохраняем время последнего переключения
            previousMillis = currentMillis;  
            ledState = LOW;
            // устанавливаем состояния выхода, чтобы включить или выключить светодиод
            digitalWrite(ledPin, ledState);
      }
     }
     
    zsm нравится это.
  6. zsm

    zsm Гик

    Mitrandir, большое спасибо , это то что нужно.
     
  7. zsm

    zsm Гик

    Всё заработало! Спасибо за помощь. хотелось бы только усовершенствовать строчки:
    Код (C):
      if (fotorezval<500)  //ночь
    и
    Код (C):
      if (fotorezval>500) //день
    чтобы if срабатывало через циклов 100 например , чтобы исключить ложные переключения.
    то есть, если fotorezval будет сто раз подряд меньше 500 тогда перейти к ночной части кода.






    Код (C):
    #define FOTO_REZ A0// фото резистор
    #define VAR_REZ1 A1 // регулятор паузы ночью
    #define VAR_REZ2 A2 // регулятор полива ноью
    #define VAR_REZ3 A3 // регулятор паузы днем
    #define VAR_REZ4 A4 // регулятор полива днем
    const int ledPin =  13;   // номер выхода, подключенного к светодиоду
    // Variables will change:
    int ledState = LOW;    // этой переменной устанавливаем состояние светодиода
    long previousMillis = 0;        // храним время последнего переключения светодиода
    long interval = 1000;        // интервал между включение/выключением светодиода (1 секунда)

    void setup() {
      // задаем режим выхода для порта, подключенного к светодиоду
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);  
    }

    void loop()
    {
      delay(1000);


      int fotorezval = analogRead(FOTO_REZ);

      Serial.print("fotorezval...");
      Serial.println(fotorezval);




      if (fotorezval<500)  //ночь

      {

        int pause = analogRead(VAR_REZ1);
        int watering = analogRead(VAR_REZ2);

        long pauseTime = pause; // Время паузы в секундах
        long lightTime = watering; // Время свечения в секундах

        Serial.print("PAUSE NIGHT---");
        Serial.println(pause);
        Serial.print("WATERING NIGHT---");
        Serial.println(watering);


        // здесь будет код, который будет работать постоянно
        // и который не должен останавливаться на время между переключениями свето
        unsigned long currentMillis = millis();

        //проверяем не прошел ли нужный интервал, если прошел то
        if(currentMillis - previousMillis > pauseTime * 1000 && ledState == LOW)
        {
          // сохраняем время последнего переключения
          previousMillis = currentMillis;  
          ledState = HIGH;
          // устанавливаем состояния выхода, чтобы включить или выключить светодиод
          digitalWrite(ledPin, ledState);
        }

        //проверяем не прошел ли нужный интервал, если прошел то
        if(currentMillis - previousMillis > lightTime * 1000  && ledState == HIGH)
        {
          // сохраняем время последнего переключения
          previousMillis = currentMillis;  
          ledState = LOW;
          // устанавливаем состояния выхода, чтобы включить или выключить светодиод
          digitalWrite(ledPin, ledState);
        }

      }


      if (fotorezval>500) //день


      {
        int pause1 = analogRead(VAR_REZ3);
        int watering1 = analogRead(VAR_REZ4);  


        long pauseTime1 = pause1; // Время паузы в секундах
        long lightTime1 = watering1; // Время свечения в секундах

        Serial.print("PAUSE DAY---");
        Serial.println(pause1);
        Serial.print("WATERING DAY---");
        Serial.println(watering1);


        // здесь будет код, который будет работать постоянно
        // и который не должен останавливаться на время между переключениями свето
        unsigned long currentMillis = millis();

        //проверяем не прошел ли нужный интервал, если прошел то
        if(currentMillis - previousMillis > pauseTime1 * 1000 && ledState == LOW)
        {
          // сохраняем время последнего переключения
          previousMillis = currentMillis;  
          ledState = HIGH;
          // устанавливаем состояния выхода, чтобы включить или выключить светодиод
          digitalWrite(ledPin, ledState);
        }

        //проверяем не прошел ли нужный интервал, если прошел то
        if(currentMillis - previousMillis > lightTime1 * 1000  && ledState == HIGH)
        {
          // сохраняем время последнего переключения
          previousMillis = currentMillis;  
          ledState = LOW;
          // устанавливаем состояния выхода, чтобы включить или выключить светодиод
          digitalWrite(ledPin, ledState);
        }

      }









    }