Непонятное влияние оператора Serial.Println
- Войдите на сайт для отправки комментариев
Ср, 24/04/2019 - 10:55
Поставлена задача в 10-секундном цикле на 2 секунды зажигать светодиод. При наличии в скетче оператора Serial.Println программа нормально работает. Стоит его закомментировать, начинается частое мигание светодиода, похоже, со скважностью 0,5. Что делает Serial.Println? Как избавиться от этой беды?
//АРДУИНО МЕГА 2560 int n=0; //Количество опросов int light=2000; //Время зажженного диода unsigned long time_diod; //Переменная времени опроса диода void setup() { Serial.begin(115200); pinMode(8, OUTPUT); //пин вывода на диод } void loop() { if (millis() - time_diod > 100) //Опрос каждые 100 мсек { n++; if(n<light) {digitalWrite (8,HIGH);} else {digitalWrite (8,LOW);} if(n==10000) {n=0;} time_diod=millis; Serial.println(n); } }
time_diod=millis; << вот это работает?
Поставлена задача в 10-секундном цикле на 2 секунды зажигать светодиод. При наличии в скетче оператора Serial.Println программа нормально работает.
на самом деле у вас программа совершенно неверно написана. Если бы не ошибка, которую заметил Садман - у вас диод горел бы не 2 секунды, а 3 минуты, а потом выключался на 15 минут.
Кто вас так учил временные интервалы отмерять?
Работает. Такая же конструкция
нормально определяет и показывает температуру на модуле. Я просто вместо опроса датчика поставил фрагмент с миганием светодиода.
Работает. Такая же конструкция
нормально определяет и показывает температуру на модуле. Я просто вместо опроса датчика поставил фрагмент с миганием светодиода.
блин, вы еще и спорить будете?
Что такое millis ? И чем оно отличается от millis() - как вы думаете?
Кто вас так учил временные интервалы отмерять?
Дык сам кумекал...
Вот я пень-то обоссанный!!!! Спасибо, братцы!
Дык сам кумекал...
дык неправильно
Вот я пень-то обоссанный!!!! Спасибо, братцы!
не расслабляйтесь. Это только первая ошибка. А их там еще есть...
А их там еще есть...
Даже не сомневаюсь, но:
Раз в 100 мсек прибавляю к счетчику единичку, и пока он не досчитает до нужного числа, диод горит. При превышении - гаснет. По достижению 10 секунд счетчик обнуляю. Начинается новый цикл.
Вроде, логично, но в чем ошибка?
10000 проходов * 100 мс = ?
Уже исправил:
Так вот можно сэкономить на буквочках:
digitalWrite(8, (n < light));
Спасибо, на такие укорочения кода - мой следующий этап.
А какой глубокий смысл квантовать время по 0.1с, тогда как наименьший квант в задаче 2с? (10 делится на 2)
А какой глубокий смысл квантовать время по 0.1с, тогда как наименьший квант в задаче 2с? (10 делится на 2)
Тут все очень просто и выявлено на основании практики. Большинство клапанов, которые работают на отборе продукта управляемо дозируют отбор при времени открытого состояние 0,1 сек и больше. Приведенный мной скетч - пробный. На самом деле зажигаться будет не просто светодиод, а оптрон мос3023 для тиристорного управления клапаном. И параметр "light" - настраиваемая величина скважности работы клапана (100 шагов) при постоянном 10-секундном цикле.
А какой глубокий смысл квантовать время по 0.1с, тогда как наименьший квант в задаче 2с? (10 делится на 2)
Тут все очень просто и выявлено на основании практики. Большинство клапанов, которые работают на отборе продукта управляемо дозируют отбор при времени открытого состояние 0,1 сек и больше. Приведенный мной скетч - пробный. На самом деле зажигаться будет не просто светодиод, а оптрон мос3023 для тиристорного управления клапаном. И параметр "light" - настраиваемая величина скважности работы клапана (100 шагов) при постоянном 10-секундном цикле.
Я все равно не понял, какой смысл вводить новый квант времени 0.1с, когда в Ардуине уже есть 1мс 1мкс. Зачем плодить лишние сущности?
Простите, я все-таки Вас не понял. Показатель "light" не константа и будет настраиваться в промежутке от 100 до 10000 мсек. Как иначе это сделать?
Простите, я все-таки Вас не понял. Показатель "light" не константа и будет настраиваться в промежутке от 100 до 10000 мсек. Как иначе это сделать?
что мешает сравнивать интервал непосредственно с миллис, без промежуточных опросов каждые 100 мс?
Простите, я все-таки Вас не понял. Показатель "light" не константа и будет настраиваться в промежутке от 100 до 10000 мсек. Как иначе это сделать?
loop()
{
если (с начала цикла прошло 10 секунд) {запомнить новое начало цикла; включить диод; }
если (с начала цикла прошло light) {выключить диод;}
// сделать чё те надо;
// присвоить значение light в зависимости от чё ты хошь;
}
спасибо, теперь понятно! :)
Поставлена задача в 10-секундном цикле на 2 секунды зажигать светодиод
А не задумывались если к примеру захочется поморгать не одним а 5-6ю светодиодами ? и все с разными интервалами, в таком случае рекомендую обротить внимание на классы, вешь мощная и иногда просто необходимая
Спасибо, пока такой надобности нет, но этот скетч переписал в загашник. Очень полезно. Буду изучать.