用app控制树莓派的GPIO

内容摘要
1.理解树莓派的GPIO
2.GPIO控制二极管的发光及关闭
3.在树莓派系统上创建动态网站服务
4.app中操作树莓派上的动态网站服务来达到控制引脚的目的

树莓派点亮二极管效果图

用app控制树莓派的GPIO_第1张图片
二极管点亮图

GPIO:树莓派的引脚

用app控制树莓派的GPIO_第2张图片
最新版树莓派的引脚40个
  • 1.理解树莓派的GPIO

看不懂没关系,以后会详细讲解到,接续看我们这篇文章所要实现的功能:通过app控制树莓派的GPIO。

  • 2.GPIO控制二极管的发光及关闭

准备材料:
二极管
杜邦线(公对母线若干根)
面包板(可无)


用app控制树莓派的GPIO_第3张图片
二极管

用app控制树莓派的GPIO_第4张图片
公对母杜邦线

用app控制树莓派的GPIO_第5张图片
面包版

面包版原理图

链接说明:
二极管"+" 极接树莓派的19号引脚,二极管"-"极接树莓派 的21号引脚。
第一步:二极管"+" "-"极与面包板的"+" "-"相连接

用app控制树莓派的GPIO_第6张图片
二极管正负极与面包板的正负极相连图

第二步:面包板的"+"极通过公对母杜邦线与树莓派19号引脚相连接,"-"极通过公对母杜邦线与树莓派21号相连接。

用app控制树莓派的GPIO_第7张图片
面包版正负极与19,12号引脚链接图
用app控制树莓派的GPIO_第8张图片
二极管发光原理

树莓派的引脚输入电平的方式

GPIO.setup(PinNumber, GPIO.OUT)
GPIO.output(PinNumber, GPIO.HIGH/True/1)
GPIO.output(PinNumber, GPIO.LOW/False/0)

然后实现python代码控制二极管的发光及关闭的代码

GPIO 19 ----------> 二极管正极
GPIO 21 ----------> 二极管负极

创建python脚本文件-diode_on_off.py

import RPi.GPIO as GPIO
#定义19,21两个引脚变量,也可以使用其它的GPIO引脚
gpio_left = 19
glio_right = 21
#移除警告
GPIO.setwarning(False)
#设置GPIO引脚的模式,这里使用物理模式
GPIO.setmode(GPIO.BOARD)
#设置19,21引脚为输出引脚
GPIO.setup(gpio_left, GPIO.OUT)
GPIO.setup(gpio_right, GPIO.OUT)

#使二极管发光,19号引脚输出高电平
def on():
    GPIO.output(gpio_left, GPIO.HIGH)
    GPIO.output(gpio_right, GPIO.LOW)

def off():
    GPIO.output(gpio_left, GPIO.LOW)
    GPIO.output(gpio_right, GPIO.LOW)

while True:
    print("1 to on diode")
    print("0 to off diode")
    print("q to exit")

    uer_choice = input("Choice:")
    if user_choice == "1":
        on()
    elif user_choice == "0":
        off()
    elif user_choice == "q" or user_choice == "Q":
        GPIO.cleanup()
        break
    else:
        print("Enter not found...")

测试代码是否可用,执行脚本,命令行下输入:

pi@xiaoxiao:~/workspace/Test $ python3 diode_on_off.py
1 to on
0 to off
q to exit
Choice:1
1 to on
0 to off
q to exit
Choice:2
Enter Error
1 to on
0 to off
q to exit
Choice:1
1 to on
0 to off
q to exit
Choice:0
1 to on
0 to off
q to exit
Choice:

命令行中输入1


用app控制树莓派的GPIO_第9张图片
二极管发光

命令行中输入0


用app控制树莓派的GPIO_第10张图片
二极管关闭

命令行中输入q,退出程序。
检测结果没有问题。
  • 3.在树莓派系统上创建动态网站服务

创建python文件http_diode_on_off.py,输入如下内容:

import tornado.web
import tornado.ioloop

class DiodeHandler(tornado.web.RequestHandler):
    def get(self, on_off):
        self.on_off = on_off
        if "1" == self.on_off:
            diode_on_off.on()
        elif "0" == self.on_off()
             diode_on_off.off()

if __name__ == "__main__":
    application = tornado.web.Application([(r"/", DiodeHandler),], )
    #监听8888端口号,并开始运行
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

输入完成,保存文件。
需要启动服务器,才可在接下来的app中控制服务,实现我们远程控制二极管的发光及关闭。
cd 到http_diode_on_off.py文件目录
执行脚本

pi@xiaoxiao:~/workspace/Test $ python3 http_diode_on_off.py

等待客户端来访问,请求开关二极管。

  • 4.app中操作树莓派上的动态网站服务来达到控制引脚的目的

Android客户端代码
配置清单文件AndroidManifest.xml中申请访问互联网权限:

 

Activity类中的代码

public class ActivityRaspberryPi extends BaseActivity {
    private ImageView diode_on_off;
    private ImageView diode_status;
    private boolean is_off = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_diode_on_off);
        initView();
    }

    private void initView() {
        diode_on_off = findView(R.id.diode_on_off);
        diode_status = findView(R.id.img_diode_status);
        diode_on_off.setOnClickListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        diode_status.setBackgroundResource(R.drawable.off);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.diode_on_off: {
                if (is_off) {
                    diode_status.setBackgroundResource(R.drawable.on);
                    diode_status.setVisibility(View.VISIBLE);
                    is_off = false;
                    DiodeController.getInstance().on();
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(                       RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                    diode_on_off.setLayoutParams(lp);
                } else {
                    diode_status.setBackgroundResource(R.drawable.off);
                    diode_status.setVisibility(View.INVISIBLE);
                    is_off = true;
                    DiodeController.getInstance().off();
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                    diode_on_off.setLayoutParams(lp);
                }
                break;
            }
            default: {
                break;
            }
        }
    }
}

BaseActivity.java

public abstract class BaseActivity extends Activity implements View.OnClickListener {
    public static ControlApplication application = ControlApplication.getControlApplication();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    protected  T findView(int res_id) {
        return (T) findViewById(res_id);
    }

    @Override
    public void onClick(View v) {

    }
}

xml布局文件内容




    
    

    
        
        
    

效果图

用app控制树莓派的GPIO_第11张图片
二极管关闭时程序运行图
用app控制树莓派的GPIO_第12张图片
二极管发光时程序运行图

app客户端程序中用到的图片

用app控制树莓派的GPIO_第13张图片
on.png

bkg_switch.png
btn_slip.png

你可能感兴趣的:(用app控制树莓派的GPIO)