概述
在前面两课中知道了如何用软件控制LED,在这一课中,我们将学习如何用按键控制LED亮灭。
所需物料
1 * Raspberry Pi
1 * Breadboard
1 * LED
1 * Button
1 * Resistor (200Ω)
Jumper wires
1 * T-Extension Board
1 * 40-Pin Cable
工作原理
按键是一种常用的电子元器件,一般把按键当做开关使用,用来导通或断开电路。在这一课中所用按键有4个引脚(1、2、3、4),如图
其中,1、2脚是导通的;3、4脚也是导通的,当按键按下,1、3导通,2、4也导通。其原理可以用下图形象地表示
在这一课中,我们将按键接到raspberry Pi的一个GPIO0(BCM_GPIO17)口上,将LED接到Raspberry Pi的GPIO1(BCM_GPIO18)口上,如图所示
按键没有按下GPIO0(BCM_GPIO17)检测到一个高电平;当按键按下后,Pi的GPIO0(BCM_GPIO17)会读取到一个低电平,当Pi的GPIO0(BCM_GPIO17)检测低电平的时候,通过软件让LED状态改变。
实物连接图
还没有画(o(╯□╰)o)
软件
对于C语言用户
1 ) 在/home/pi下新建一个.c源文件,文件名随意
cd ~
sudo nano button_led.c
2)向新建的源文件中写入代码
#include <wiringPi.h> #include <stdio.h> #include <stdlib.h> //setup GPIO0(BCM_GPIO17) as button pin #define ButtonPin 0 //setup GPIO1(BCM_GPIO18) as led pin #define LedPin 1
跟前面的课程一样首先包含程序需要的库文件,然后定义LED和按键所接到的GPIO管脚。
int main(void){ // When initialize wiring failed, print messageto screen if(wiringPiSetup() == -1){ printf("setup wiringPi failed!"); exit(1); } pinMode(LedPin, OUTPUT); pinMode(ButtonPin, INPUT); // Pull up to 3.3V,make GPIO1 a stable level pullUpDnControl(ButtonPin, PUD_UP); printf("\n"); printf("|**************************************|\n"); printf("| Button control LED |\n"); printf("| ------------------------------ |\n"); printf("| LED connect to GPIO1 |\n"); printf("| Button connect to GPIO0 |\n"); printf("| |\n"); printf("| Press button to turn on LED. |\n"); printf("| |\n"); printf("| OSOYOO|\n"); printf("|**************************************|\n"); printf("\n"); digitalWrite(LedPin, HIGH); printf("|****************|\n"); printf("| LED off... |\n"); printf("|****************|\n"); for(;;){ // Indicate that button has pressed down if(digitalRead(ButtonPin) == 0){ // Led on digitalWrite(LedPin, LOW); printf("|****************|\n"); printf("| ...LED on |\n"); printf("|****************|\n"); delay(400); } else{ // Led off digitalWrite(LedPin, HIGH); printf("|****************|\n"); printf("| LED off... |\n"); printf("|****************|\n"); delay(400); } } return 0; }
基本上跟前面课程中的代码一样,将LedPin和ButtonPin分别设置为输出模式和上拉输入模式,pinMode(ButtonPin, INPUT)和pullUpDnControl(ButtonPin, PUD_UP)将ButtonPin设置成上拉输入。在循环中不断检测ButtonPin引脚的电平,如果检测到低电平,表示按键按下,则向LedPin引脚写低电平(0V),点亮LED;反之,则向LedPin脚写高电平(3.3V),熄灭LED。
完整的源代码可以在命令行运行下面的命令获取
sudo wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_7/button_led.c
3) 编译程序
sudo -Wall -o button_led button_led.c -lwiringPi
4) 执行程序
sudo ./button_led
5) 最终结果
程序运行起来后会先屏幕打印电路连接情况,接着打印LED关闭状态,如按下按键LED亮起,屏幕上LED状态变为…LED on状态;松开按键,LED熄灭,屏上LED状态变为LED off…
对于python用户(以远程登录为例)
1) 在/home/pi新建一个.py的python脚本文件,文件名随意,你开心就好(^_^)
cd ~
sudo nano button_led.py
2) 编码
import RPi.GPIO as GPIO import time #set BCM_GPIO 17(GPIO0) as button pin ButtonPin = 17 #set BCM_GPIO 18(GPIO1) as LED pin LedPin = 18 #set led status to True(OFF) led_status = True
跟之前一样先导入程序中使用到的软件模块,再分别定义LED和按键接到那个GPIO口上,同时将LED初始状态设置成True(3.3V).
def setup(): GPIO.setwarnings(False) #set the gpio modes to BCM numbering GPIO.setmode(GPIO.BCM) #set all LedPin's mode to output,and initial level to HIGH(3.3V) GPIO.setup(LedPin,GPIO.OUT,initial=GPIO.HIGH) #set ButtonPin's mode to input,and pull up to high(3.3v) GPIO.setup(ButtonPin,GPIO.IN,pull_up_down = GPIO.PUD_UP) #set up a falling detect on ButtonPin,and callback function to ButtonLed GPIO.add_event_detect(ButtonPin,GPIO.FALLING,callback = ButtonLed) pass
在setup函数中将LedPin设置为输出模式,按键设置为上拉输入模式,并且采用下降沿触发中断的方式检测ButtonPin引脚电平。当Pi检测到ButtonPin引脚产生了下降沿中断时候,程序会跳到回调函数(callback function)ButtonLed中执行中断程序。
def ButtonLed(ev=None): global led_status # Switch led status(on-->off; off-->on) led_status = not led_status GPIO.output(LedPin, led_status) if led_status: print('|*************|') print('| LED OFF... |') print('|*************|') print('\n') else: print('|*************|%2
DownLoad Url osoyoo.com