Проблема в millis ()
- Войдите на сайт для отправки комментариев
Пт, 06/04/2018 - 13:07
Доброго дня всем,помогите решить проблему,не работает код должным образом #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
никогда такого не было, и вот - снова. О_О
Ваша версия: почему он не должен быть всегда = 1?
Думаю что переменная должна изменится на 1 только по истечении 10 сек
Она так и делает. Я проверил даже.
а у вас в строке 20 условие выполняется?
может чего-то где-то не обнуляется?
У меня не меняется и она постояно = 1
Суть такова что надо включить на 10 сек светодиод в 15 часов и больше не включать
Выполняется
и еще могу подсказать, что millis() начинает считать с момента старта МК
У меня не меняется и она постояно = 1
Через 10 сек. после старта она меняет значение с 0 на 1. Вставьте digitalWrite(13, FlagPoliva); после Serial.println(FlagPoliva); и убедитесь сами - всё работает ровно так, как написано в скетче.
sadman41, обратите внимание на строку 17
sadman41, обратите внимание на строку 17
Всё нормально, там имеется квалификатор static - значение не теряется при выходе из loop.
Суть тут не в миллисах, а в том, что ТС хочет одно, а в скетче пишет совсем другое. Потом сидит и ждет, пока ардуина угадает его потребности.
проблема в том что оно =0
Нет,даже при строчки digitalWrite(13, FlagPoliva); свеодиод после старта горит постоянно
может все-таки не обнуляется чего-то?
проблема в том что оно =0
А зачем указана такая строчка №6? Что хотели-то? :)
Переменная для примера
на ладно. Поставим вопрос по-другому: с какого будуна Вы ожидаете, что эта Ваша FlagPoliva опять станет равной нулю?
Я и не ожидаю от неё нуля,это не возможно,проблема заключается в другом
После старта программы она должна 10 сек быть = 0,а после уже принимать значение 1,а она уже после старта программы = 1 !
Я и не ожидаю от неё нуля,это не возможно,проблема заключается в другом
После старта программы она должна 10 сек быть = 0,а после уже принимать значение 1,а она уже после старта программы = 1 !
Может видео снимете, как она сразу же в 1 перекидывается? Так, как у меня она упрямо = 0 в течении 10 сек.
для отладки - пусть ТС установит интервал не в 10 секунд, а 1000
Выложите скрин начала вывода в монитор, чтобы убедиться что она сразу равна 1.
Это и есть самое начало вывода в монитор
Вывсёврёти!
Значит тот скетч, что тут опубликован отличается от того, который Вы гоняете. Здесь нет такой проблемы о которой Вы пишете.
Сейчас видео сниму
Это и есть самое начало вывода в монитор
где-то ты нас обманываешь - как минимум, первая строка вывода должна быть со значением 0
Вот это выведет на чистую воду:
Serial
.print(millis());
Serial
.print(" => ");
Serial
.println(FlagPoliva);
Почему у меня "не так"? Может Вам стоит в мониторе отключить "автопрокрутку" и сместиться на настоящее начало вывода? :)
Автопрокрутка отключена
https://cloud.mail.ru/public/9x12/go4ukoQRH
Очень плохо видно, но можно разглядеть что на вашем видео поначалу тоже идут нули и только потом 1-ки. Похоже что ваш буфер монитора не сохраняет начало вывода.
Попробуйте добавить в setup() типа такое:
Serial.println("Starting sketch..");
И отмотайте до этого сообщения вывод в мониторе, что видно первым выводом?
И ещё, правильный вывод такой:
Serial.println(FlagPoliva, DEC);
а не как у вас.
А у меня вот так
О чудо !) Действительно буфер монитора не сохраняет начало вывода
только после перезагрузки ардуины скетч заработал как надо