• Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Register
  • Login
M5Stack Community
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Register
  • Login

UIFlow digital input interrupt

UIFlow
7
10
16.7k
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.
  • B
    birdsong
    last edited by Jul 22, 2020, 4:18 AM

    In UIFlow is it possible to use an interrupt on an input? when I get a sub millisecond low signal on an input I would like to run some code.

    1 Reply Last reply Reply Quote 0
    • L
      lukasmaximus
      last edited by Jul 23, 2020, 9:08 AM

      When you say sub millisecond I guess you are not going to use a button to interrupt, if so then how do you intend to interrupt from an input

      1 Reply Last reply Reply Quote 0
      • B
        birdsong
        last edited by Jul 24, 2020, 11:53 PM

        50hz triac phase control with zero crossing timing synchronization. 100micro second timing tolerance or better. I ended up porting to Arduino/C++, too many limitations with UIFlow for now, python maybe to slow anyway. UIFlow is a good tool for higher level/basic control.

        1 Reply Last reply Reply Quote 0
        • G
          Gaviota
          last edited by Gaviota Jul 26, 2020, 11:48 PM Jul 26, 2020, 3:48 PM

          Hello,
          try an execute block, look at my code below.

          First i defined the two variables "is_running" and "counter".
          In UIFlow i defined pin0 with GPIO26 as input with pull down resistor.!
          Then i defined the event_interrupt(pin) - procedure. I use it for counting impulses at the GPIO26, therefore it is necessary to declare the variables as globals.

          Every second i read in the main loop the value of the counter variable and reset the is_running variable.

          def event_interrupt(pin):
          global is_running, counter
          is_running = True
          counter += 1

          pin0.irq(trigger=machine.Pin.IRQ_RISING, handler=event_interrupt)

          0_1595778123207_interrupt.jpg

          A lot of nice M5Stack stuff :) ....

          1 Reply Last reply Reply Quote 0
          • S
            Schubi
            last edited by Sep 22, 2020, 3:39 PM

            @Gaviota
            hello and thank you for your information.
            Would you be so kind to post the full code?
            It doesn't work for me - i always get a syntax error.

            Thanks in advance,

            Schubi

            1 Reply Last reply Reply Quote 0
            • S
              Schubi
              last edited by Sep 25, 2020, 11:13 AM

              @Gaviota
              Hello Gaviota,
              thank you for sharing this information.

              I tried to implement it, but i get an error.
              Would you be so kind to post the whole program?

              Thank you in advance,

              Schubi

              1 Reply Last reply Reply Quote 0
              • S
                Schubi
                last edited by Sep 25, 2020, 8:06 PM

                @Gaviota
                hello Gaviota,
                i tried to run your code, but i always get an error.
                Would you be so kind to post the full program so i can find my mistake.

                Thank yo in advance,
                Schubi

                1 Reply Last reply Reply Quote 0
                • B
                  BT99
                  last edited by Feb 24, 2021, 1:39 AM

                  @Gaviota post was helpful to me. Thanks.
                  Below is an example of a N/O button interrupt, connected between G26 and GND.
                  Counter increments multiple times per button push.
                  This shows that software debounce could be necessary in many cases.
                  Cheers - BillT
                  0_1614130213067_interrupt.PNG

                  1 Reply Last reply Reply Quote 2
                  • L
                    LyleDodge
                    last edited by Jun 4, 2021, 10:54 PM

                    I've created a custom module to avoid the need to use the "Execute" block. It basically gives you a way to set the pin number, trigger, and callback for the IRQ. You will still create your own function using Blockly.

                    1. Create a Variable: example "counter"
                    2. Create a Function:
                      1. Name it what you like, example: "count_pulses"
                      2. Add single step from Variables: change counter by 1
                    3. Init PWM0 with your desired pin, freq, and duty
                    4. Load the attached file under Custom | Open *.m5b file
                    5. Drag "PIN_IRQ" from Custom onto your workspace
                      1. Set the pin number (just an integer, 0 for example)
                      2. Set your trigger "machine.Pin.IRQ_RISING"
                      3. Set the handler to your function from step 2 above "count_pulses"
                    6. Add a label if you want and set the loop event to update a label with the current counter value
                    7. It sounds more complicated than it actually is, check the screenshot

                    0_1622847040214_PWM_IRQ_Demonstration.png

                    Your resulting code should look vaguely like this:

                    from m5stack import *
                    from m5ui import *
                    from uiflow import *
                    import machine
                    
                    setScreenColor(0x222222)
                    
                    counter = None
                    
                    label0 = M5TextBox(146, 187, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
                    
                    from numbers import Number
                    
                    def count_pulses():
                      global counter
                      counter = (counter if isinstance(counter, Number) else 0) + 1
                    
                    PWM0 = machine.PWM(26, freq=25000, duty=50, timer=0)
                    pin0.irq(trigger=machine.Pin.IRQ_RISING, handler=count_pulses)
                    while True:
                      label0.setText(str(counter))
                      wait_ms(2)
                    

                    Have fun storming the castle!

                    D 1 Reply Last reply Jun 19, 2021, 12:27 PM Reply Quote 5
                    • D
                      Doswiadczalnik @LyleDodge
                      last edited by Jun 19, 2021, 12:27 PM

                      @lyledodge I can’t see attached file. Is there any or it problem with my iPhone?

                      1 Reply Last reply Reply Quote 1
                      • First post
                        Last post