Проблема в millis ()

mavrin_88
Offline
Зарегистрирован: 28.09.2017
Доброго дня всем,помогите решить проблему,не работает код должным образом

#define LED_PIN  5                            // номер выхода,подключенного к светодиоду
#define  INTERVAL  10000UL           // интервал между включение/выключением светодиода (1 секунда)
int FlagPoliva = 0;
int timehour = 15;
void setup() {
 
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);    
}
void loop()
{
  Serial.println(FlagPoliva);                                     // Отладка значения переменной

  
  static unsigned long currentMillis = 0;               // Храним время последнего переключения светодиода
 

  if (timehour == 15 && FlagPoliva == 0){               // Считываем время, если оно равно 19 часам РМ и флаг полива = 0 то выполняем полив
       digitalWrite(LED_PIN, 1);

  if (millis() - currentMillis > INTERVAL) {                           // Заканчиваем полив по истечению заданного в минутах времени
       digitalWrite(LED_PIN, 0);
       FlagPoliva = 1;                                                 // Установим флажок, что больше пока поливать не надо
       currentMillis = millis();
  }
      }
     
}

значение переменной FlagPoliva почему то всегда = 1

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

никогда такого не было, и вот - снова. О_О

sadman41
Offline
Зарегистрирован: 19.10.2016

mavrin_88 пишет:

значение переменной FlagPoliva почему то всегда = 1

Ваша версия:  почему он не должен быть всегда = 1?

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Думаю что переменная должна изменится на 1 только по истечении 10 сек 

sadman41
Offline
Зарегистрирован: 19.10.2016

Она так и делает. Я проверил даже.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а у вас в строке 20 условие выполняется?

5N62V
Offline
Зарегистрирован: 25.02.2016

может чего-то где-то не обнуляется?

mavrin_88
Offline
Зарегистрирован: 28.09.2017

У меня не меняется и она постояно = 1

Суть такова что надо включить на 10 сек светодиод в 15 часов и больше не включать 

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Выполняется

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
а так? 

  if (timehour == 15 && FlagPoliva == 0){               // Считываем время, если оно равно 19 часам РМ и флаг полива = 0 то выполняем полив
       digitalWrite(LED_PIN, 1);
      currentMillis = millis();
  if (millis() - currentMillis > INTERVAL) {                           // Заканчиваем полив по истечению заданного в минутах времени
       digitalWrite(LED_PIN, 0);
       FlagPoliva = 1;                                                 // Установим флажок, что больше пока поливать не надо
       currentMillis = millis();
  }
      }
     
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

и еще могу подсказать, что millis() начинает считать с момента старта МК

sadman41
Offline
Зарегистрирован: 19.10.2016

mavrin_88 пишет:

У меня не меняется и она постояно = 1

Через 10 сек. после старта она меняет значение с 0 на 1. Вставьте digitalWrite(13, FlagPoliva); после Serial.println(FlagPoliva); и убедитесь сами - всё работает ровно так, как написано в скетче.

 
Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

sadman41, обратите внимание на строку 17

sadman41
Offline
Зарегистрирован: 19.10.2016

Valera19701 пишет:

sadman41, обратите внимание на строку 17

Всё нормально, там имеется квалификатор static - значение не теряется при выходе из loop.

Суть тут не в миллисах, а в том, что ТС хочет одно, а в скетче пишет совсем другое. Потом сидит и ждет, пока ардуина угадает его потребности.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

проблема в том что оно =0

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Нет,даже при строчки digitalWrite(13, FlagPoliva); свеодиод после старта горит постоянно

5N62V
Offline
Зарегистрирован: 25.02.2016

может все-таки не обнуляется чего-то?

5N62V
Offline
Зарегистрирован: 25.02.2016

Valera19701 пишет:

проблема в том что оно =0

да эта переменная static, все с ней нормально.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А зачем указана такая строчка №6? Что хотели-то? :)

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Переменная для примера

5N62V
Offline
Зарегистрирован: 25.02.2016

на ладно. Поставим вопрос по-другому: с какого будуна Вы ожидаете, что эта Ваша FlagPoliva опять станет равной нулю?

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Я и не ожидаю от неё нуля,это не возможно,проблема заключается в другом

После старта программы она должна 10 сек быть = 0,а после уже принимать значение 1,а она уже после старта программы = 1 !

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Я и не ожидаю от неё нуля,это не возможно,проблема заключается в другом

После старта программы она должна 10 сек быть = 0,а после уже принимать значение 1,а она уже после старта программы = 1 !

sadman41
Offline
Зарегистрирован: 19.10.2016

Может видео снимете, как она сразу же в 1 перекидывается? Так, как у меня она упрямо = 0 в течении 10 сек.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

для отладки - пусть ТС установит интервал не в 10 секунд, а 1000

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Выложите скрин начала вывода в монитор, чтобы убедиться что она сразу равна 1.

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Это и есть самое начало вывода в монитор

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вывсёврёти!

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Значит тот скетч, что тут опубликован отличается от того, который Вы гоняете. Здесь нет такой проблемы о которой Вы пишете.

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Сейчас видео сниму

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

mavrin_88 пишет:

Это и есть самое начало вывода в монитор

где-то ты нас обманываешь - как минимум, первая строка вывода должна быть со значением 0

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот это выведет на чистую воду:

Serial.print(millis()); Serial.print(" => "); Serial.println(FlagPoliva);  

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Почему у меня "не так"? Может Вам стоит в мониторе отключить "автопрокрутку" и сместиться на настоящее начало вывода? :)

mavrin_88
Offline
Зарегистрирован: 28.09.2017

Автопрокрутка отключена

https://cloud.mail.ru/public/9x12/go4ukoQRH

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Очень плохо видно, но можно разглядеть что на вашем видео поначалу тоже идут нули и только потом 1-ки. Похоже что ваш буфер монитора не сохраняет начало вывода.

Попробуйте добавить в setup() типа такое:

Serial.println("Starting sketch..");

И отмотайте до этого сообщения вывод в мониторе, что видно первым выводом?

И ещё, правильный вывод такой:

Serial.println(FlagPoliva, DEC);

а не как у вас.

nik182
Offline
Зарегистрирован: 04.05.2015

А у меня вот так

Flag=0 millis=0
Flag=0 millis=0
Flag=0 millis=0
Flag=0 millis=0
Flag=0 millis=0
Flag=0 millis=0
Flag=0 millis=0
Flag=0 millis=0
Flag=0 millis=0
Flag=1 millis=108
Flag=1 millis=108
Flag=1 millis=108
Flag=1 millis=108
Flag=1 millis=108
Flag=1 millis=108
и далее без изменений для 
#define LED_PIN  5                            // номер выхода,подключенного к светодиоду
#define  INTERVAL  100UL           // интервал между включение/выключением светодиода (1 секунда)
int FlagPoliva = 0;
int timehour = 15;
void setup() {
 
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);    
}
void loop()
{
  Serial.print("Flag=");
  Serial.print(FlagPoliva);                                     // Отладка значения переменной
  Serial.print(" millis=");
  
  static unsigned long currentMillis = 0;               // Храним время последнего переключения светодиода
  Serial.println(currentMillis);         
                            // Отладка значения переменной

  if (timehour == 15 && FlagPoliva == 0){               // Считываем время, если оно равно 19 часам РМ и флаг полива = 0 то выполняем полив
       digitalWrite(LED_PIN, 1);
 
  if (millis() - currentMillis > INTERVAL) {                           // Заканчиваем полив по истечению заданного в минутах времени
       digitalWrite(LED_PIN, 0);
       FlagPoliva = 1;                                                 // Установим флажок, что больше пока поливать не надо
       currentMillis = millis();
  }
      }
     
}

 

 

mavrin_88
Offline
Зарегистрирован: 28.09.2017

О чудо !) Действительно буфер монитора не сохраняет начало вывода

только после перезагрузки ардуины скетч заработал как надо