• sales

    +86-0755-88291180

RPi Tutorial Series: External Button User Guide

Using a external button to do some control is so cool a thing but knowledge of event interruption is often required in such case. This section gives some examples under different libraries.

BCM2835

#include <bcm2835.h>
#include <stdio.h>

#define  KEY  20

int main(int argc, char **argv)
{
    if (!bcm2835_init())return 1;
    // Sets the pin as input.
    bcm2835_gpio_fsel(KEY, BCM2835_GPIO_FSEL_INPT);
    // Sets the Pull-up mode for the pin.
    bcm2835_gpio_set_pud(KEY, BCM2835_GPIO_PUD_UP);
    printf("Key Test Program!!!!\n");  
    while (1)
    {  
        // Reads the current level on the specified pin and returns either HIGH or LOW (0 or 1).
        if(bcm2835_gpio_lev(KEY) == 0)
        {  
            printf ("KEY PRESS\n") ;
            while(bcm2835_gpio_lev(KEY) == 0)
                bcm2835_delay(100);
        }  
        bcm2835_delay(100);
    }  
    bcm2835_close();
    return 0;
}

Save the file as "key.c" and then compile it. Run the program and give a low level to the pin, the terminal will prompt "KEY PRESS". Hit Ctrl + C to terminate the process.

gcc -Wall key.c -o key -lbcm2835
sudo ./key

WiringPi (Polling)

#include <stdio.h>
#include <wiringPi.h>
 
char KEY = 29;
 
int main()
{
    if (wiringPiSetup() < 0)return 1 ;
    // Sets the pin as input.
    pinMode(KEY,INPUT);
    // Sets the Pull-up mode for the pin.
    pullUpDnControl(KEY, PUD_UP);
    printf("Key Test Program!!!\n");
    while(1)
    {  
        if (digitalRead(KEY) == 0) 
        {  
            printf ("KEY PRESS\n") ;
            // Returns the value read at the given pin. It will be HIGH or LOW (0 or 1).
            while(digitalRead(KEY) == 0)
                delay(100);
        }  
        delay(100);
    }  
}

Save the file as "key.c" and then compile it. Run the program and give a low level to the pin, the terminal will prompt "KEY PRESS". Hit Ctrl + C to terminate the process.

gcc -Wall key.c -o key -wiringPi
sudo ./key

WiringPi (Interruption)

#include <stdio.h>
#include <wiringPi.h>
 
#define button 29

char flag = 0;
// The function will be called when the interrupt triggers.
void myInterrupt()
{
    flag ++;
}
 
int main()
{
    // This initialises the wiringPi system 
    // and assumes that the calling program is going to be using the wiringPi pin numbering scheme.
    if(wiringPiSetup() < 0)return 1;
    // This function registers a function to received interrupts on the specified pin.
    if(wiringPiISR(button, INT_EDGE_FALLING, &myInterrupt) < 0)
    {  
        printf("Unable to setup ISR \n");
    }  
    printf("Interrupt test program\n");
    while(1)
    {  
        if(flag)
        {  
            while(digitalRead(button) ==0);
            printf("button press\n");
            flag = 0;
        }  
    }  
}

Save the file as "Interrupt.c" and then compile and execute it. Hit Ctrl + C to terminate the process.

gcc -Wall Interrupt.c -o key -wiringPi
sudo ./Interrupt

Python (Polling)

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

KEY = 26
# pin numbers are interpreted as BCM pin numbers.
GPIO.setmode(GPIO.BCM)
# Sets the pin as input and sets Pull-up mode for the pin.
GPIO.setup(KEY,GPIO.IN,GPIO.PUD_UP)
while True:
    time.sleep(0.05)
    # Returns the value read at the given pin. It will be HIGH or LOW (0 or 1).
    if GPIO.input(KEY) == 0:
        print("KEY PRESS")
        while GPIO.input(KEY) == 0:
            time.sleep(0.01)

Run the program and then give a low level to the pin, the terminal will prompt "KEY PRESS", Hit Ctrl + C to terminate the process.

sudo python key.py

Python (Interruption)

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
 
KEY = 26
# The function will be called when the interrupt triggers.
def MyInterrupt(KEY):
    print("KEY PRESS")
# pin numbers are interpreted as BCM pin numbers.
GPIO.setmode(GPIO.BCM)
GPIO.setup(KEY, GPIO.IN, GPIO.PUD_UP)
# add falling edge detection on a channel (i.e. KEY)
# ignoring further edges for 200ms for switch bounce handling.
GPIO.add_event_detect(KEY, GPIO.FALLING, MyInterrupt, 200)
 
while True:
    time.sleep(1)
TAG: 0.96inch1.3inch1.44inch1.8inch LCD Display Screen Round Arduino Raspberry Pi ESP32 Pico STM32 Tang Nano Series FPGA FAQ Arduino Thermal imaging camera SpotPear Raspberry Pi 1.44inch LCD display HAT raw display IPS Programmable Keyboard Luckfox Pico ST7789 UART To CAN Mini Raspberry Pi 5 DSI display 1.69inch LCD TouchScreen Display 240&times;280 ST7789 Arduino Raspberry Pi ESP32S3 Pico STM32 10-Axis DOF ROS IMU (A) Sensor UART ARM 32 DSP Processor BLE 5.3 Bluetooth / Accelerometer / Gyroscope / Magnetometer / Temperature & Pressure DeepSeek XiaoZhi AI Voice Chat ESP32-S3 All-in-One-PCB-Kit N16R8 WROOM-1-N16R8 DevKitC-1 Development Board RP2040 ESP32 C6 Development Board 1.47 inch LCD Touch Screen 1.47inch Display 172&times;320SD AXS5106L JD9853 DeepSeek XiaoZhi AI Voice Chat Robot BOX ESP32-S3 Development Board 1.85 inch Round LCD N16R8 Raspberry Pi IR Thermal Imaging Camera SpotPear 7inch LCD 1024×600 Computer PC Monitor Display Secondary Screen TypeC USB CPU RAM Only For Windows