Raspberry Pi Tutorial Series: External Button
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.
- These examples require a certain library, see: Libraries Installation for RPi
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
- For more details, please read: http://www.airspayce.com/mikem/bcm2835/group__gpio.html
- All the pin numbers are interpreted as BCM_GPIO pin numbers. Users can get info with the command:
gpio readall
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
- For more details, please read: https://projects.drogon.net/raspberry-pi/wiringpi/functions/
- All the pin numbers are interpreted as WiringPi pin numbers. Users can get info with the command:
gpio readall
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
- For more details, please read: https://projects.drogon.net/raspberry-pi/wiringpi/functions/
- All the pin numbers are interpreted as WiringPi pin numbers. Users can get info with the command:
gpio readall
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)
- For more details, please read: https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/