Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    Pin Handler with an inside "while" function start again and again !

    Scheduled Pinned Locked Moved Issues & Bugs
    pinwipy 3.0pytrack2
    7 Posts 3 Posters 31 Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D Offline
      DEFRAINE.JM
      last edited by

      Hello to all,
      Pytrack2 with Wipy3 ( all are firmware updated ).
      I use the Pin Handler ( set to 0 ) function an work fine! but start again and again, sometime not ?
      When I check the value of the pin I read "1" and the function start again like if I press the button !
      Is someone know the problem or have a suggestion ?
      Waiting your answers
      Best regards, Jiemde

      J 1 Reply Last reply Reply Quote 0
      • J Offline
        jcaron @DEFRAINE.JM
        last edited by

        @DEFRAINE-JM You'll probably need to share (the relevant parts of) your code, along with any logs and traces and description of what you do.

        D 1 Reply Last reply Reply Quote 0
        • D Offline
          DEFRAINE.JM @jcaron
          last edited by

          @jcaron Thanks for your reply, here is the code of the pin-handler code:

          def pin_handler(arg):
              print("got an interrupt in pin %s" %(arg.id()))
          
              pycom.rgbled(red)
              print("Sequence de lecture RFID !")
          
              rfid = UART(1, baudrate=9600, pins=('P16', 'P17'))
              rfid.init(baudrate=9600, bits=8, parity=None, stop=1, timeout_chars=2, pins=('P16', 'P17'), rx_buffer_size=2048)
          
          
              global uuid                 # = bytearray(16)
              rfid_power.value(1)         # Powering the RFID decoder via a power load
              time.sleep(0.5)
              uuid = rfid.read(17)        # first reading of the rfid decoder buffer for cleaning it
          
              
              time.sleep(0.5)             
              pycom.rgbled(orange)
                     
          
              while True:
                  uuid = rfid.read(17)     # reading of the buffer of the rfid buffer
                  time.sleep(1)
                  print('id = ', uuid)
          
                  if uuid is not None:        # if buffer has something different than "None"
                      global rfid_number
                      print("   ID detected !")                    
                      rfid_power.value(0)
                      pycom.rgbled(green)     # led sequence for seeing that RFID number is detected
                      time.sleep(0.1)
                      pycom.rgbled(black)
                      time.sleep(0.1)
                      pycom.rgbled(green)
                      time.sleep(0.1)
                      pycom.rgbled(black)     
                      time.sleep(0.1)
                      pycom.rgbled(green)
                      time.sleep(0.1)
                      pycom.rgbled(black)
                      time.sleep(0.1)
                      pycom.rgbled(green)
                      time.sleep(1.5)
                      pycom.rgbled(black)
                      rfid_number = uuid
                      rfid.deinit()
                      print(p_in.value())       # just to know the pin value for verification
                      time.sleep(3)
                      break                     # breaking the while function  
          

          And the while (True): start with the p_in callback ( P10 ):

          while (True):
          
              p_in = Pin('P10', mode=Pin.IN, pull=Pin.PULL_UP)
              p_in.callback(Pin.IRQ_RISING, pin_handler, arg = None)
          
          
              print(y)                                # comptage du nombre de transmission ( en minutes ) avant reset ( test )
              print("RFID", rfid_number[0:14])
          
          
              gps   = l76.coordinates()
              pitch = acc.pitch()
              accel = acc.acceleration()
              roll  = acc.roll()
              batt  = py.read_battery_voltage()
              rfid  = rfid_number[0:14]
              # TempA = sensor.read_ambiant_temp()
              # TempO = sensor.read_object_temp()
          
          

          I use an rfid decoder (134.2Khz ) with uart output RDM660 TTL

          Here is the terminal info:

          1
          got an interrupt in pin P10
          Sequence de lecture RFID !
          id =  None
          id =  b'967000009112695\r\n'
             ID detected !
          1
          got an interrupt in pin P10
          Sequence de lecture RFID !
          id =  None
          id =  b'967000009112695\r\n'
             ID detected !
          3
          RFID b'96700000911269'
          (None, None) - (2021, 11, 30, 10, 9, 33, 345068, None) - 2531328
          Gps:            (None, None)
          Acceleration:   (-0.01611328, -0.00793457, 0.9969482)
          Roll:           0.5656762
          Pitch:          0.4559399
          Batt Volt:      4.455878
          Rfid:           b'96700000911269'
          {"TIME": [2021, 11, 30, 10, 9, 33, 441458, null], "DATAS": {"ROLL": 0.5656762, "BATTERY": 4.455878, "ID": "96700000911269", "GPS": [null, null], "PITCH": 0.4559399, "ACCELERATION": [-0.01611328, -0.00793457, 0.9969482]}}
          1
          WIFI connected succesfully
          SENDING PAYLOAD to NODERED
          MQTTClient disconnected
          WIFI disconnected ! 
          
          got an interrupt in pin P10
          Sequence de lecture RFID !
          id =  None
          id =  b'967000009112695\r\n'
             ID detected !
          1
          got an interrupt in pin P10
          Sequence de lecture RFID !
          id =  None
          id =  b'967000009112695\r\n'
             ID detected !
          1
          

          "1" alone, is the value of the pin(P10).
          You can see that the rfid value is ok in the sequence so the while function must break !
          Sometime it break at the first occurence and sometime it need 8 occurences before breaking !

          Thanks in advance for helping.
          Best regards
          Jiemde

          robert-hhR J 2 Replies Last reply Reply Quote 0
          • robert-hhR Offline
            robert-hh @DEFRAINE.JM
            last edited by robert-hh

            @DEFRAINE-JM Did you connect P10 to button switch? If yes, that switch will bounce and create multiple interrupts.

            On a side note: I would not create the UART object in the callback over and over again. You can create if beforehand and store the object in a global variable. You would have to declare that in the callback as global, otherwise it is not visible.
            Besides that, P16 and P17 are input only pins. You cannot use them for UART TX. But you do not write to UART in your code, so it might be fine. Better add an external pull-up resistor to the TX pin.

            D 1 Reply Last reply Reply Quote 0
            • J Offline
              jcaron @DEFRAINE.JM
              last edited by

              @DEFRAINE-JM also, I wouldn’t re-assign the pin handler in the loop. Do it just once at startup and be done with it.

              D 1 Reply Last reply Reply Quote 0
              • D Offline
                DEFRAINE.JM @jcaron
                last edited by

                @jcaron Thanks for reply,
                I've moved the assign of the pin handler outside the loop, but the result is the same!

                1 Reply Last reply Reply Quote 0
                • D Offline
                  DEFRAINE.JM @robert-hh
                  last edited by

                  @robert-hh Thanks for your reply.
                  Yes "P10" is connected to the Gnd by a simple push button. But I had no idea that the system was logging an interrupt every time I went to Gnd.

                  Question: what solution to adopt? - debouncing hardware or software?
                  What is the solution adopted on the expansion board 3.1 for the "S1" button ?

                  Indeed I only use uart reception. it works great, however i will heed your suggestion of external resistance.

                  1 Reply Last reply Reply Quote 0

                  Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                  Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                  With your input, this post could be even better đź’—

                  Register Login
                  • 1 / 1
                  • First post
                    Last post

                  Pycom on Twitter

                  Pycom