Нужна помощь по Ардуино, а то я уже не могу. Тестовая программа. Опрос датчиков, которые при сработке должны посадить ноги на землю. Если они не сработают в течении 7600 мс - должно выбить ошибку. Игрался, делал по-разному, разными способами из сети. Исход таков : 1) Если условие выполнено, то зеленый светодиод начинает светится и продолжает, даже когда красный начнет свой цикл миганий в 999 раз. Так и должно быть. 2) Если условие не выполнено, программа перепрыгивает как показано стрелкой - сразу же после delay на for. А должна подождать ответа датчиков в течении 7600 мс и "зависнуть" программу красным светодиодом, если они так и не подали сигнал LOW и LOW.
Комментарии: 42
Sergy
и весь код целиком вотя я вижу там time2 что такое time2? зачем? почему? что с ним происходит? непонятно
Aleksandr
А это последний вариант кода из видеоурока. От отчаяния я стал просто повторять. Вот, написал. Все работает кроме опроса датчиков сработки и вызова функций исходя из результата опроса.
Sergy
алгоримты блок схемами умеете рисовать?
Aleksandr
Полный код в виде алгоритма
Sergy
это летнее домашнее задание по информатике?)
Aleksandr
Нет, личный некоммерческий проект. Я же не учился кодить. Это программа для пульта, который проверяет одно из изделий на заводе где работаю.
Sergy
> некоммерческий проект > для пульта, > на заводе
Aleksandr
Да, мне заказчик только детали оплатил
Sergy
берите деньги за умственную работу тоже
Aleksandr
Я же еще не специалист, к тому же на работе нужно делать все на общее благо. Сейчас скину код с участка, где опрос датчиков
Th0r
на работе надо выполнять свои служебные обязанности по рабочему графику и получать за их выполнение деньги. всё что не входит в обязанности или время должно оплачиваться дополнительно
Aleksandr
На заводах это так не работает. Я выполняю в том числе работу слесаря, сборщика, грузчика, электрика - все благодарны, но в деньгах, конечно, прибавки не будет. Просто как иначе - кто-то же должен пытаться сделать лучше.
Th0r
начальство должно пытаться сделать лучше. завод - это коммерческое предприятие вообще-то
Aleksandr
Неэффективное управление - нет тех кто следит за порядком, настроениями в коллективе, тем чтобы хватало расходников и т.д., также нет наказаний для тех, кто косячит или просто отсиживает часы. Сюда же - кадровая проблема. З\П не высокие, молодые специалисты на завод не пойдут, а пенсионерам уже на все плевать. Хотя вместо двух пенсионеров можно взять одного молодого. Платить ему их двойную зарплату. И все будет ок.
Mirovoe
Прям глава из " Атлант расправил плечи"
Sergy
весь код кидайте, непонятно когда только кусок
Sergy
код у вас или не у вас на компе?
Aleksandr
У меня
Sergy
раньше на заводах за рацпредложения премию давали рацпредложение - это только описание какого-то изменения возможно с практической проверкой вы же делаете готовое изделие мигание вконце в каком случае будет? ну и rerutn из loop() заново запустится loop()
Aleksandr
В случае, если условие выполнится (датчики сработают в срок). В противном случае - будет светится красный постоянно. https://pastebin.com/FaEK9jpn Полный код. Но здесь блоки функций на датчики - нерабочие. Я думаю, можно сделать это иначе. Ввести переменную х. Выполнять циклично опрос каждые 500 мс. В цикличной части каждый раз спрашивать "сработало или нет, если да то return" Каждый раз добавлять х++ Ограничить кол-во повторов этого цикла до 15и (7500 мс). Когда х будет больше 16 или больше - забраковать.
Sergy
вы посмотрели на часы там, допустим 12:00 вы запоминаете - вода закипела в 12:00 картошку варить 20 минут потом проходит время, вы смотрите на часы 12:10 вода закипела в 12:00 12:10 - 12:00 = 10 минут картошка варится всего 10 минут, значит ещё не сварилась да millis() и micros() - это по факту часы смотреть как переделать этот код, или попробуете по аналогии переделать? delay (99999999); можно/нужно заменить на while (true); в этом случае выполение в этом месте "застрянет" навсегда
Aleksandr
А почему просто (ok_flag_1), без уточнения состояния false или true ?
Sergy
потому что он типа bool такого же, что и получается после операций сравнения и логических операций
Aleksandr
Но так тоже можно if (ok_flag_1) = true { ?
Sergy
if (ok_flag_1 == true) {
Th0r
скобка не там. 1) можно 2) бессмысленно
Aleksandr
Переделка не должна составить труда) Максимум что потребуется - добавить в дефайн еще таймаутов под разные режими
Sergy
#define TIMEOUT1 7600 void loop(){ uint32_t time_save = millis(); /* millis() возвращает 32-х битное целое беззнаковое, это кажется unsigned long, но никак не int. если поставить int могут быть проблемы. */ bool ok_flag_1 = false; while ((millis() - time_save < TIMEOUT1) && (!ok_flag_1)) { if ((digitalRead(Input1) == LOW) && (digitalRead(Input2) == LOW)) { ok_flag_1 = true; } } if (ok_flag_1) { digitalWrite(FaileOut, HIGH); delay(999999); } else { for (byte j=0; j<99; j++) { digitalWrite(FaileOut, HIGH); delay(500); digitalWrite(FaileOut, LOW); delay(500); } } }
Sergy
можно ещё вот так упростить while ((millis() - time_save < TIMEOUT1) && (!ok_flag_1)) { ok_flag_1 = ((digitalRead(Input1) == LOW) && (digitalRead(Input2) == LOW)); }
Aleksandr
Сходу понять для меня пока сложно. Cейчас на макетку загружу и посмотрю
Aleksandr
А ведь тут зеленый светодиод (OkOut) совсем не задействован. Я переделал, и ВСЕ ПОЛУЧИЛОСЬ! Вот так вышло
Sergy
я его пропустил, да
Aleksandr
Хотя все-равно не понимаю почему код именно такой. Не получается составлять в уме эту логику) В общем, ты за 5 минут сделал то, над чем я по вечерам время от времени страдал целых полтора месяца =)
Sergy
вообще, вот в этом коде из-за return мигания светодиодом не будет, точнее оно будет по прошествии 999999мс циклы while знаете как работают?
Aleksandr
While будет вычислять в цикле непрерывно и бесконечно до тех пор, пока выражение в круглых скобках, () не станет равно логическому ЛОЖНО. Но я с while мудрил и не вышло.