UIFlow digital input interrupt
birdsong last edited by
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.
lukasmaximus last edited by
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
birdsong last edited by
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.
Gaviota last edited by Gaviota
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.
global is_running, counter
is_running = True
counter += 1
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,
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,
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,
BT99 last edited by
@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
LyleDodge last edited by
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.
- Create a Variable: example "counter"
- Create a Function:
- Name it what you like, example: "count_pulses"
- Add single step from Variables: change counter by 1
- Init PWM0 with your desired pin, freq, and duty
- Load the attached file under Custom | Open *.m5b file
- Drag "PIN_IRQ" from Custom onto your workspace
- Set the pin number (just an integer, 0 for example)
- Set your trigger "machine.Pin.IRQ_RISING"
- Set the handler to your function from step 2 above "count_pulses"
- Add a label if you want and set the loop event to update a label with the current counter value
- It sounds more complicated than it actually is, check the screenshot
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!
Doswiadczalnik last edited by
@lyledodge I can’t see attached file. Is there any or it problem with my iPhone?