内容摘要
1.理解树莓派的GPIO
2.GPIO控制二极管的发光及关闭
3.在树莓派系统上创建动态网站服务
4.app中操作树莓派上的动态网站服务来达到控制引脚的目的
树莓派点亮二极管效果图
GPIO:树莓派的引脚
- 1.理解树莓派的GPIO
看不懂没关系,以后会详细讲解到,接续看我们这篇文章所要实现的功能:通过app控制树莓派的GPIO。
- 2.GPIO控制二极管的发光及关闭
准备材料:
二极管
杜邦线(公对母线若干根)
面包板(可无)
链接说明:
二极管"+" 极接树莓派的19号引脚,二极管"-"极接树莓派 的21号引脚。
第一步:二极管"+" "-"极与面包板的"+" "-"相连接
第二步:面包板的"+"极通过公对母杜邦线与树莓派19号引脚相连接,"-"极通过公对母杜邦线与树莓派21号相连接。
树莓派的引脚输入电平的方式
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
命令行中输入0
命令行中输入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中申请访问互联网权限:
<uses-permission android:name="android.permission.INTERNET"/>
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 extends View> T findView(int res_id) {
return (T) findViewById(res_id);
}
@Override
public void onClick(View v) {
}
}
xml布局文件内容
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--树莓派二极管开发控制视图-->
<ImageView
android:id="@+id/img_diode_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:visibility="invisible"/>
<RelativeLayout
android:id="@+id/re_layout"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dp"
android:background="@drawable/bkg_switch">
<!--开关-->
<ImageView
android:id="@+id/diode_on_off"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_slip"
android:visibility="visible"/>
</RelativeLayout>
</RelativeLayout>
效果图
app客户端程序中用到的图片