Python Forum

Full Version: Getting button pressed number
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi all.

Im using Adafruit's Neotrellis led/button board with Python code on Raspberry pi

I want to send, via serial, the button pressed to Pc.

Im new to python so Im using the code from Adafruit

import time

from board import SCL, SDA
import busio
from adafruit_neotrellis.neotrellis import NeoTrellis
from adafruit_neotrellis.multitrellis import MultiTrellis


i2c_bus = busio.I2C(SCL, SDA)


trelli = [
    [NeoTrellis(i2c_bus, False, addr=0x2E), NeoTrellis(i2c_bus, False, addr=0x2F)],
    [NeoTrellis(i2c_bus, False, addr=0x30), NeoTrellis(i2c_bus, False, addr=0x31)],
]

trellis = MultiTrellis(trelli)


OFF = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 150, 0)
GREEN = (0, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
PURPLE = (180, 0, 255)


def blink(xcoord, ycoord, edge):
    # turn the LED on when a rising edge is detected
    if edge == NeoTrellis.EDGE_RISING:
        trellis.color(xcoord, ycoord, BLUE)
    # turn the LED off when a rising edge is detected
    elif edge == NeoTrellis.EDGE_FALLING:
        trellis.color(xcoord, ycoord, OFF)


for y in range(8):
    for x in range(8):
        # activate rising edge events on all keys
        trellis.activate_key(x, y, NeoTrellis.EDGE_RISING)
        # activate falling edge events on all keys
        trellis.activate_key(x, y, NeoTrellis.EDGE_FALLING)
        trellis.set_callback(x, y, blink)
        trellis.color(x, y, PURPLE)
        time.sleep(0.05)

for y in range(8):
    for x in range(8):
        trellis.color(x, y, OFF)
        time.sleep(0.05)

while True:
   
    trellis.sync()
    time.sleep(0.02)
I try this

def blink(xcoord, ycoord, edge):
    # turn the LED on when a rising edge is detected
    if edge == NeoTrellis.EDGE_RISING:
   
    ser.write(b'xcoord')
   
 # turn the LED off when a rising edge is detected
    elif edge == NeoTrellis.EDGE_FALLING:
        trellis.color(xcoord, ycoord, OFF)
But i get ¨xcoord¨ printed on PC.

I try

def blink(xcoord, ycoord, edge):
    # turn the LED on when a rising edge is detected
    if edge == NeoTrellis.EDGE_RISING:
     
      ser.write(b'x')
 
   # turn the LED off when a rising edge is detected
    elif edge == NeoTrellis.EDGE_FALLING:
        trellis.color(xcoord, ycoord, OFF)
and I get ¨x¨ printed on PC

My question: How do I get the button pressed number?
Probably something like
ser.write(str(xcoord).encode())
(Dec-13-2020, 05:01 PM)bowlofred Wrote: [ -> ]Probably something like
ser.write(str(xcoord).encode())

Yes. Almost there.
I try with print first and worked.
I need both x and y
so I try

print(str(xcoord).encode(),str(ycoord).encode())
And worked too.
Then I try

ser.write(str(xcoord).encode(),str(ycoord).encode())
And I get


t.callbacks[evt.number](x,y,evt.edge)
ser.write(str(xcoord),encode(),str(ycoord).encode())
TypeError: write() takes 2 positional arguments but 3 were given
write() normally takes a single object at a time. If you want to write two things, either combine them into a single object, or perform two writes.

# two things separated by a space
ser.write(f"{xcoord} {ycoord}".encode())

# two consecutive writes (no space separates the data elements)
ser.write(str(xcoord).encode())
ser.write(str(ycoord).encode())
Thank you.

That worked!!