Нужна помощь по Ардуино, а то я уже не могу. Тестовая программа. Опрос датчиков, которые при сработке должны посадить ноги на землю. Если они не сработают в течении 7600 мс - должно выбить ошибку. Игрался, делал по-разному, разными способами из сети. Исход таков : 1) Если условие выполнено, то зеленый светодиод начинает светится и продолжает, даже когда красный начнет свой цикл миганий в 999 раз. Так и должно быть. 2) Если условие не выполнено, программа перепрыгивает как показано стрелкой - сразу же после delay на for. А должна подождать ответа датчиков в течении 7600 мс и "зависнуть" программу красным светодиодом, если они так и не подали сигнал LOW и LOW.

Комментарии: 42

  1. Sergy

    и весь код целиком вотя я вижу там time2 что такое time2? зачем? почему? что с ним происходит? непонятно

    • Aleksandr

      А это последний вариант кода из видеоурока. От отчаяния я стал просто повторять. Вот, написал. Все работает кроме опроса датчиков сработки и вызова функций исходя из результата опроса.

      • Sergy

        алгоримты блок схемами умеете рисовать?

        • Aleksandr

          Полный код в виде алгоритма

      • Sergy

        это летнее домашнее задание по информатике?)

        • Aleksandr

          Нет, личный некоммерческий проект. Я же не учился кодить. Это программа для пульта, который проверяет одно из изделий на заводе где работаю.

          • Sergy

            > некоммерческий проект > для пульта, > на заводе

            • Aleksandr

              Да, мне заказчик только детали оплатил

              • Sergy

                берите деньги за умственную работу тоже

                • Aleksandr

                  Я же еще не специалист, к тому же на работе нужно делать все на общее благо. Сейчас скину код с участка, где опрос датчиков

                  • Th0r

                    на работе надо выполнять свои служебные обязанности по рабочему графику и получать за их выполнение деньги. всё что не входит в обязанности или время должно оплачиваться дополнительно

                    • Aleksandr

                      На заводах это так не работает. Я выполняю в том числе работу слесаря, сборщика, грузчика, электрика - все благодарны, но в деньгах, конечно, прибавки не будет. Просто как иначе - кто-то же должен пытаться сделать лучше.

                      • Th0r

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

                        • Aleksandr

                          Неэффективное управление - нет тех кто следит за порядком, настроениями в коллективе, тем чтобы хватало расходников и т.д., также нет наказаний для тех, кто косячит или просто отсиживает часы. Сюда же - кадровая проблема. З\П не высокие, молодые специалисты на завод не пойдут, а пенсионерам уже на все плевать. Хотя вместо двух пенсионеров можно взять одного молодого. Платить ему их двойную зарплату. И все будет ок.

                          • Mirovoe

                            Прям глава из " Атлант расправил плечи"

                  • Sergy

                    весь код кидайте, непонятно когда только кусок

      • Sergy

        код у вас или не у вас на компе?

  2. 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

          Переделка не должна составить труда) Максимум что потребуется - добавить в дефайн еще таймаутов под разные режими

  3. 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 мудрил и не вышло.

Не нашли ответ?

Вам также может быть интересно