Изменение значения в цикле loop часть2

Тема в разделе "Arduino & Shields", создана пользователем Cynep, 19 июн 2017.

  1. Cynep

    Cynep Нерд

    Ещё раз здравствуйте. Создал новую тему, поскольку решение проблемы найдено. Хотя вопрос "почему так происходит" остался открытым.
    Вместо кучи текста снял ролик, в котором наглядно показал баг с моей платой arduino. Хочу поблагодарить всех, кто пытался помочь с решение данной проблемы.


    Может кто знает причину подобного поведения?
     
  2. fogary

    fogary Гик

    Вопрос-то в чем?
    Вы меняете текст, который выводите в последовательный порт, а сам вывод в монитор порта не показываете.
    Остальная часть кода, на мой взгляд, работает как написано. Т. е. подносите ключ - светодиод загорается, убираете - гаснет.
     
  3. Cynep

    Cynep Нерд

    Кхм...
    Код во всех случаях одинаковый, но из-за вывода в монитор длинной строки код перестаёт работать. Точнее, в цикле loop становится невозможным присвоить новое значение переменной или считать новое состояние пина. На монитор выводится ровно то, что написано, поэтому и не показал. Примеры с Оф сайта, с данного форума и других мест часто содержат вывод на серийный порт - у всех работает, у меня нет.
    Это больше похоже на аппаратный баг. Плата куплена на Али.
     
  4. Cynep

    Cynep Нерд

    На этом форуме, судя по-всему, с подобной проблемой никто не сталкивался.
     
  5. AlexU

    AlexU Гуру

    С чего вы взяли, что значение переменной не присваивается? Когда подносите метку и рэле начинает трещать, в последовательный порт длинные строки сыпятся постоянно или нет?
     
  6. Cynep

    Cynep Нерд

    Строки сыпались постоянно.

    Честно говоря, уже ни в чем не уверен. Сделал простой пример кода, без всяких библиотек. Простой инкремент и вывод на монитор порта. Все отлично работает.
     
    Последнее редактирование: 21 июн 2017
  7. Cynep

    Cynep Нерд

    Надо было мне не лениться и послушать вас - сделать нормальный дебаг с выводом всех состояний, чтобы точно знать.
     
  8. AlexU

    AlexU Гуру

    Теперь всё стало на свои места. Вы не правильно идентифицировали ошибку -- переменная isAllow не при чём.
    Мои предположения по поводу того как работает устройство на видео, но сначала обращу внимание на тот факт, что микроконтроллер функцию 'void loop()' вызывает постоянно (в цикле) с максимально возможной скоростью. И так:
    1. Вы прикладываете брелок и в это время срабатывает условие:
    Код (C++):
    if (rfid.isAllow())
    2. После срабатывает условие:
    Код (C++):
    if (isAllow == 0)
    3. В последовательный порт выводится сообщение. Вызов блокируемый, программа остановит своё выполнение пока всё сообщение не будет передано.
    4. Далее пин 'YELLOW_LED' переводится в низкое состояние и переменной 'isAllow' присваивается значение '0'.
    5. Происходит выход из функции 'void loop()' и буквально сразу же повторный вызов этой функции.
    6. Не смотря на то, что брелок до сих пор приложен к считывателю, условие:
    Код (C++):
    if (rfid.isAllow())
    не срабатывает, функция 'rfid.isAllow()' возвращает '0'. Почему так происходит надо разбираться.
    7. Управление передаётся блоку 'else', в котором пин 'YELLOW_LED' переводится в высокое состояние и переменной 'isAllow' присваивается значение '1'.
    8. Происходит выход из функции 'void loop()' и буквально сразу же повторный вызов этой функции.
    9. Брелок всё ещё приложен, но в этот раз условие 'rfid.isAllow()' срабатывает и далее смотрим пункты 2 - 8.

    Если добавить немного отладки, то всё это увидите, а может ситуация окажется ещё более интересной, чем высказал в своих предположениях -- я не знаком с считывателем и с тем как работает библиотека RFID:
    Код (C++):
    if (rfid.isAllow())
    {
      Serial.println("ON");
    ............
    }
    else
    {
      Serial.println("OFF");
    .............
    }
    PS: по поводу библиотеки -- откуда её взяли?
    Я бегло пробежался из интереса, нашёл аналогичные за авторством Miguel Balboa. Вот только заголовочный файл "RFID.h" использовался в старых версиях. И я бы посоветовал воспользоваться свежей версией: https://github.com/miguelbalboa/rfid. Может быть в более новой версии не будет таких странностей в работе функции 'rfid.isAllow()'....

    PPS: чисто из любопытства, когда в порт пишете короткие сообщения, они так же при приложенном брелке сыпятся в порт или сообщение выводится только один раз в момент прикладывания?
     
    Последнее редактирование: 21 июн 2017
    arkadyf и Cynep нравится это.
  9. Cynep

    Cynep Нерд

    Спасибо большое за развернутый ответ. Вы правы, я не верно определили ошибку. Ночью докопался до того, что все беды идут из библиотеки rfid. Она странно определяет карту и если карта постоянно приложена к датчику, то результат получается такой, как вы предположили.
    Код (C++):

    if (rfid.isCard())
    {
      Serial.println("ON");
    ............
    }
    else
    {
      Serial.println("OFF");
    .............
    }
     
    Выведет:
    ON
    OFF
    ON
    OFF
    ON
    OFF
    Но карта всегда приложена и такого, по идее, не должно быть.

    Где скачал библиотеку уже не помню. На каком-то ардуино сайте.
    Код (Text):

    /*
    * RFID.cpp - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
    * Based on code Dr.Leong  ( WWW.B2CQSHOP.COM )
    * Created by Miguel Balboa, Jan, 2012.
    * Released into the public domain.
    */
     
    Думал, в библиотеке поковыряться, но там так с ходу не разберешься. Тёмный лес для меня!!! Без учебника по программированию точно не разобраться. Еще и комментарии не на английском...
     
  10. AlexU

    AlexU Гуру

    Попробуйте всё же библиотеку с github'а (ссылка в пред. посте). Там в 'examples' много разных примеров использования библиотеки и код неплохо откомментирован (на английском).
     
    Cynep и arkadyf нравится это.
  11. Cynep

    Cynep Нерд

    Уже воспользовался вашей ссылкой, спасибо.