Zephyr basic button - how to modify to use multi button input

I am using the example zephyr basic button which gives output when the button is pressed.

https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.9.1/zephyr/samples/basic/button/README.html

How can I modify it in my application where there are multiple buttons? Seem like there is a lot of change in connect sdk as compared to previous sdks that I used with Keil.

Parents
  • I am able to do that this way. Is there any efficient way of doing that? How can I add debounce in it?

    /*
     * Copyright (c) 2016 Open-RnD Sp. z o.o.
     * Copyright (c) 2020 Nordic Semiconductor ASA
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    
    #include <zephyr.h>
    #include <device.h>
    #include <drivers/gpio.h>
    #include <sys/util.h>
    #include <sys/printk.h>
    #include <inttypes.h>
    
    #define SLEEP_TIME_MS	1
    
    /*
     * Get button configuration from the devicetree sw0 alias. This is mandatory.
     */
    #define SW1_NODE	DT_ALIAS(sw1)
    #define SW0_NODE	DT_ALIAS(sw0)
    #if !DT_NODE_HAS_STATUS(SW0_NODE, okay)
    #error "Unsupported board: sw0 devicetree alias is not defined"
    #endif
    
    static const struct gpio_dt_spec button_1 = GPIO_DT_SPEC_GET_OR(SW1_NODE, gpios,
    							      {0});
    
    static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET_OR(SW0_NODE, gpios,
    							      {0});
    
    static struct gpio_callback button_cb_data;
    static struct gpio_callback button_cb_data1;
    
    /*
     * The led0 devicetree alias is optional. If present, we'll use it
     * to turn on the LED whenever the button is pressed.
     */
    static struct gpio_dt_spec led = GPIO_DT_SPEC_GET_OR(DT_ALIAS(led0), gpios,
    						     {0});
    
    void button_pressed(const struct device *dev, struct gpio_callback *cb,
    		    uint32_t pins)
    {
    	printk("Button pressed at %" PRIu32 "\n", k_cycle_get_32());
    }
    
    void button_pressed_1(const struct device *dev, struct gpio_callback *cb,
    		    uint32_t pins)
    {
    	printk("Button pressed at %" PRIu32 "\n", k_cycle_get_32());
    }
    
    void main(void)
    {
    	int ret;
    
    	if (!device_is_ready(button_1.port)) {
    		printk("Error: button_1 device %s is not ready\n",
    		       button_1.port->name);
    		return;
    	}
    
    	if (!device_is_ready(button.port)) {
    		printk("Error: button device %s is not ready\n",
    		       button.port->name);
    		return;
    	}
    
    	ret = gpio_pin_configure_dt(&button, GPIO_INPUT);
    	if (ret != 0) {
    		printk("Error %d: failed to configure %s pin %d\n",
    		       ret, button.port->name, button.pin);
    		return;
    	}
    
    	ret = gpio_pin_configure_dt(&button_1, GPIO_INPUT);
    	if (ret != 0) {
    		printk("Error %d: failed to configure %s pin %d\n",
    		       ret, button_1.port->name, button_1.pin);
    		return;
    	}
    
    	ret = gpio_pin_interrupt_configure_dt(&button_1,GPIO_INT_EDGE_TO_ACTIVE);
    	if (ret != 0) {
    		printk("Error %d: failed to configure interrupt on %s pin %d\n",
    			ret, button_1.port->name, button_1.pin);
    		return;
    	}
    
    	ret = gpio_pin_interrupt_configure_dt(&button,GPIO_INT_EDGE_TO_ACTIVE);
    	if (ret != 0) {
    		printk("Error %d: failed to configure interrupt on %s pin %d\n",
    			ret, button.port->name, button.pin);
    		return;
    	}
    
    	gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin));
    	gpio_add_callback(button.port, &button_cb_data);
    	printk("Set up button at %s pin %d\n", button.port->name, button.pin);
    
    	gpio_init_callback(&button_cb_data1, button_pressed_1, BIT(button_1.pin));
    	gpio_add_callback(button_1.port, &button_cb_data1);
    	printk("Set up button_1 at %s pin %d\n", button_1.port->name, button_1.pin);
    
    
    
    	if (led.port && !device_is_ready(led.port)) {
    		printk("Error %d: LED device %s is not ready; ignoring it\n",ret, led.port->name);
    		led.port = NULL;
    	}
    	if (led.port) {
    		ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT);
    		if (ret != 0) {
    			printk("Error %d: failed to configure LED device %s pin %d\n",ret, led.port->name, led.pin);
    			led.port = NULL;
    		} else {
    			printk("Set up LED at %s pin %d\n", led.port->name, led.pin);
    		}
    	}
    
    	printk("Press the button\n");
    	if (led.port) {
    		while (1) {
    			/* If we have an LED, match its state to the button's. */
    			int val = gpio_pin_get_dt(&button);
    
    			if (val >= 0) {
    				gpio_pin_set_dt(&led, val);
    			}
    			k_msleep(SLEEP_TIME_MS);
    		}
    	}
    }
    

  • Hi Salman,

    We do not have support for debounce in the GPIO API. In the nRF5 SDK we had the button handling library. In the nRF Connect SDK, there is a buttons module but I am not sure if this helps.

    Regards,

    Priyanka

Reply Children
No Data
Related